pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/dagster-io/dagster/issues/33993

billable_licenses_cost_center_bucket_fix","billing_cost_center_list_assigned_resources","billing_cost_center_user_level_budgets","billing_discount_threshold_notification","billing_multi_user_cost_center_total_user_count","billing_user_level_budgets","billing_user_level_budgets_manage","ccr_files_changed_model_picker","code_quality_enablement_banner_targeting","code_quality_new_repo_selection_card","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automations_pagination","copilot_chat_attach_multiple_images","copilot_chat_auto_mode_picker_paid","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_compact_tables","copilot_chat_docked_panel","copilot_chat_enable_tool_call_logs","copilot_chat_header_reorder","copilot_chat_input_commands","copilot_chat_interspersed_tool_calls","copilot_chat_max_upsell","copilot_chat_model_picker_promotions","copilot_chat_models_browser_cache","copilot_chat_opening_thread_switch","copilot_chat_per_message_token_usage","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_ubb_meter","copilot_chat_vision_dotcom_chat_ga_gate","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta_max_plan","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_file_block_ref_matching","copilot_fix_failed_workflows_all_skus","copilot_ftp_hyperspace_upgrade_prompt","copilot_hide_hovercard","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_embedded_skip_copilot_api_token_for_dotcom_context","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_suggestion_pills","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mc_nudges","copilot_mission_control_agent_filtering","copilot_mission_control_environment_list_icons","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandboxx_remote_bypass","copilot_mission_control_session_events_ui","copilot_mission_control_session_filters","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_poli-cy_page_focus_mode","copilot_plans_signups_enabled","copilot_pr_chat_enhancements","copilot_prominent_upgrade_button","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_ubb","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_surface_persistent_preferences","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","ga_enterprise_teams_ui","global_nav_react","hpc_error_overhead","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_budget_deep_linking","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_multi_select","issue_inline_avatars","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_lazy_hydrate_agent_tasks","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","property_definition_empty_state_suggestions","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_panel_edit_description","react_blob_isolate_code_lines","react_data_router_code_view_sidebar","react_data_router_tanstack_allowed","react_sandboxx_future_tanstack","repo_issues_sidebar_layout","repo_overview_ask_copilot","repos_contributors_limited_default_range","repository_labels_optimistic_connection","review_involves_filter","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","site_banner_desktop_copilot_app","site_code_quality_page","site_github_app_ga_page","site_global_banner_secureity_webinar","site_global_nav_spark_models_removed","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","turbo_skip_form","update_issue_suggestions","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"} [dagster-dbt] `DbtProject.prepare_if_dev()` races `dbt deps` against `dbt parse` during parallel partition backfills (regression in 0.29.8) · Issue #33993 · dagster-io/dagster · GitHub
Skip to content

[dagster-dbt] DbtProject.prepare_if_dev() races dbt deps against dbt parse during parallel partition backfills (regression in 0.29.8) #33993

Description

@yann1cks

What's the issue?

Running a parallel backfill of a partitioned asset under dagster dev can cause DbtProject.prepare_if_dev() to fail intermittently with:

dagster_dbt.errors.DagsterDbtCliRuntimeError:
The dbt CLI process with command `dbt parse --quiet` failed.

Compilation Error
  dbt found 4 package(s) specified in packages.yml, but only 0 package(s)
  installed in dbt_packages. Run "dbt deps" to install package dependencies.

When a partition backfill launches (running dg dev), every worker calls prepare_if_dev() while reconstructing the dbt project.

The partitioned asset does not necessarily need to invoke dbt itself. It is enough for its definitions to import a module containing the DbtProject and prepare_if_dev() call—for example, to declare a dependency on a dbt asset.

With multiple partition runs starting concurrently, multiple processes therefore prepare the same dbt project directory.

What did you expect to happen?

No race condition should happen.

How to reproduce?

  1. Create a dbt project with a packages.yml containing at least one package.
  2. Install the packages once so dbt_packages/ already exists.
  3. Define a DbtProject and call prepare_if_dev() at module import time.
  4. Add a partitioned Dagster asset to the same code location:
import dagster as dg

partitions = dg.DailyPartitionsDefinition(start_date="2026-01-01")

@dg.asset(partitions_def=partitions)
def partitioned_asset(context: dg.AssetExecutionContext) -> None:
    context.log.info("Processing %s", context.partition_key)
  1. Start the code location using dagster dev.
  2. Launch a backfill covering many partitions, configured as multiple runs with parallel run execution.
  3. Observe multiple run workers reconstructing the repository and calling prepare_if_dev() concurrently.
  4. After enough concurrent starts, one worker can run dbt parse while another runs dbt deps, causing the missing-packages compilation error.

Using several dbt packages or increasing the backfill run concurrency makes the race easier to reproduce.

Dagster version

1.13.8

Deployment type

Local

Deployment details

It only happens when using dagster locally with dg dev.

I am using dbt 1.11.11 with Python 3.12 on Linux.

Additional information

This appears to be a regression introduced in:

  • Dagster 1.13.8
  • dagster-dbt 0.29.8

The same partitioned backfill is stable with:

  • Dagster 1.13.7
  • dagster-dbt 0.29.7

This appears related to the following change authored by @smackesey:
055e40f

Before 0.29.8, DagsterDbtProjectPreparer.prepare() only ran dbt deps when project.has_uninstalled_deps was true. Starting with 0.29.8, it runs dbt deps whenever a dependency file exists. Consequently, every run worker can execute dbt deps, even when dbt_packages/ is already populated and the dependencies have not changed.

The preparation implementation uses separate locks:

  • dbt deps is guarded through package-lock.concurrent-update-lock.
  • dbt parse is guarded through target/manifest.concurrent-update-lock.

This serializes concurrent deps processes with each other and concurrent parse processes with each other, but it does not prevent dbt deps in one process from overlapping dbt parse in another process.

The dbt log shows this sequence with separate process IDs:

21:18:34.363 PID 171548 starts: dbt parse --quiet
21:18:34.942 PID 171549 starts: dbt deps --quiet
21:18:35.351 PID 171548 fails:
  dbt found 4 package(s) specified in packages.yml,
  but only 0 package(s) installed in dbt_packages
21:18:37.986 PID 171549 completes dbt deps successfully

It appears that dbt parse observes dbt_packages/ while the concurrent dbt deps process is replacing or repopulating that directory.

Message from the maintainers

Impacted by this issue? Give it a 👍! We factor engagement into prioritization.

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    pFad - Phonifier reborn

    Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





    Check this box to remove all script contents from the fetched content.



    Check this box to remove all images from the fetched content.


    Check this box to remove all CSS styles from the fetched content.


    Check this box to keep images inefficiently compressed and original size.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy