Skip to content

Commit efb8121

Browse files
committed
revert from_config_options_mut
1 parent d495385 commit efb8121

9 files changed

Lines changed: 32 additions & 104 deletions

File tree

examples/custom_worker_url_routing.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use datafusion::physical_plan::stream::{
3737
};
3838
use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties};
3939
use datafusion::prelude::{ParquetReadOptions, SessionContext};
40+
use datafusion_distributed::get_distributed_worker_resolver;
4041
use datafusion_distributed::test_utils::localhost::{
4142
LocalHostWorkerResolver, spawn_worker_service,
4243
};
@@ -220,8 +221,7 @@ impl TaskEstimator for CachedFileScanConfigTaskEstimator {
220221

221222
fn route_tasks(&self, ctx: &TaskRoutingContext<'_>) -> Result<Option<Vec<Url>>> {
222223
let available_urls =
223-
datafusion_distributed::get_distributed_worker_resolver(ctx.task_ctx.session_config())?
224-
.get_urls()?;
224+
get_distributed_worker_resolver(ctx.task_ctx.session_config())?.get_urls()?;
225225

226226
let mut routed = None;
227227
ctx.plan.apply(|node| {

src/config_extension_ext.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,6 @@ pub(crate) fn set_distributed_option_extension<T: ConfigExtension + Default>(
2121
cfg.set_extension(Arc::new(propagation_ctx));
2222
}
2323

24-
/// Registers `prefix` in [`ConfigExtensionPropagationContext`] so that headers for that
25-
/// extension are included in outgoing gRPC requests. Idempotent: safe to call multiple times.
26-
pub(crate) fn register_config_extension_prefix(cfg: &mut SessionConfig, prefix: &'static str) {
27-
let mut ctx = cfg
28-
.get_extension::<ConfigExtensionPropagationContext>()
29-
.map(|existing| existing.as_ref().clone())
30-
.unwrap_or_default();
31-
if !ctx.prefixes.contains(&prefix) {
32-
ctx.prefixes.push(prefix);
33-
cfg.set_extension(Arc::new(ctx));
34-
}
35-
}
36-
3724
pub(crate) fn set_distributed_option_extension_from_headers<'a, T: ConfigExtension + Default>(
3825
cfg: &'a mut SessionConfig,
3926
headers: &HeaderMap,

src/coordinator/query_coordinator.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,7 @@ impl<'a> StageCoordinator<'a> {
378378
pub(super) fn routed_urls(&self) -> Result<Vec<Url>> {
379379
let session_config = self.task_ctx.session_config();
380380
let worker_resolver = get_distributed_worker_resolver(session_config)?;
381-
let task_estimator = session_config
382-
.get_extension::<CombinedTaskEstimator>()
383-
.map(|a| a.as_ref().clone())
384-
.unwrap_or_default();
381+
let task_estimator = CombinedTaskEstimator::from_session_config(session_config);
385382

386383
let routed_urls = match task_estimator.route_tasks(&TaskRoutingContext {
387384
task_ctx: Arc::clone(self.task_ctx),

src/distributed_ext.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ impl DistributedExt for SessionConfig {
645645
&mut self,
646646
bytes_per_partition: usize,
647647
) -> Result<(), DataFusionError> {
648-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
648+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
649649
d_cfg.file_scan_config_bytes_per_partition = bytes_per_partition;
650650
Ok(())
651651
}
@@ -654,13 +654,13 @@ impl DistributedExt for SessionConfig {
654654
&mut self,
655655
factor: f64,
656656
) -> Result<(), DataFusionError> {
657-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
657+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
658658
d_cfg.cardinality_task_count_factor = factor;
659659
Ok(())
660660
}
661661

662662
fn set_distributed_metrics_collection(&mut self, enabled: bool) -> Result<(), DataFusionError> {
663-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
663+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
664664
d_cfg.collect_metrics = enabled;
665665
Ok(())
666666
}
@@ -669,13 +669,13 @@ impl DistributedExt for SessionConfig {
669669
&mut self,
670670
enabled: bool,
671671
) -> Result<(), DataFusionError> {
672-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
672+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
673673
d_cfg.children_isolator_unions = enabled;
674674
Ok(())
675675
}
676676

677677
fn set_distributed_broadcast_joins(&mut self, enabled: bool) -> Result<(), DataFusionError> {
678-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
678+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
679679
d_cfg.broadcast_joins = enabled;
680680
Ok(())
681681
}
@@ -685,7 +685,7 @@ impl DistributedExt for SessionConfig {
685685
&mut self,
686686
compression: Option<arrow_ipc::CompressionType>,
687687
) -> Result<(), DataFusionError> {
688-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
688+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
689689
d_cfg.compression = match compression {
690690
Some(arrow_ipc::CompressionType::ZSTD) => "zstd".to_string(),
691691
Some(arrow_ipc::CompressionType::LZ4_FRAME) => "lz4".to_string(),
@@ -698,7 +698,7 @@ impl DistributedExt for SessionConfig {
698698
&mut self,
699699
batch_size: usize,
700700
) -> Result<(), DataFusionError> {
701-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
701+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
702702
d_cfg.shuffle_batch_size = batch_size;
703703
Ok(())
704704
}
@@ -714,13 +714,13 @@ impl DistributedExt for SessionConfig {
714714
&mut self,
715715
max_tasks_per_stage: usize,
716716
) -> Result<(), DataFusionError> {
717-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
717+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
718718
d_cfg.max_tasks_per_stage = max_tasks_per_stage;
719719
Ok(())
720720
}
721721

722722
fn set_distributed_partial_reduce(&mut self, enabled: bool) -> Result<(), DataFusionError> {
723-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
723+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
724724
d_cfg.partial_reduce = enabled;
725725
Ok(())
726726
}
@@ -729,7 +729,7 @@ impl DistributedExt for SessionConfig {
729729
&mut self,
730730
budget_bytes: usize,
731731
) -> Result<(), DataFusionError> {
732-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
732+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
733733
d_cfg.worker_connection_buffer_budget_bytes = budget_bytes;
734734
Ok(())
735735
}
@@ -747,7 +747,7 @@ impl DistributedExt for SessionConfig {
747747
}
748748

749749
fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError> {
750-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
750+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
751751
d_cfg.dynamic_task_count = enabled;
752752
Ok(())
753753
}
@@ -756,7 +756,7 @@ impl DistributedExt for SessionConfig {
756756
&mut self,
757757
bytes_per_partition_per_second: usize,
758758
) -> Result<(), DataFusionError> {
759-
let d_cfg = DistributedConfig::from_session_config_mut(self)?;
759+
let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?;
760760
d_cfg.bytes_per_partition_per_second = bytes_per_partition_per_second;
761761
Ok(())
762762
}

src/distributed_planner/distributed_config.rs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use crate::config_extension_ext::register_config_extension_prefix;
2-
use crate::config_extension_ext::set_distributed_option_extension;
31
use datafusion::common::{DataFusionError, extensions_options, plan_err};
42
use datafusion::config::{ConfigExtension, ConfigOptions};
53
use datafusion::execution::TaskContext;
@@ -92,25 +90,11 @@ impl DistributedConfig {
9290
Ok(distributed_cfg)
9391
}
9492

95-
/// Gets the [DistributedConfig] from the [SessionConfig], inserting a default if not present.
96-
/// Always registers the `"distributed"` propagation prefix so coordinator-side settings are
97-
/// included in gRPC headers sent to workers, regardless of call ordering.
98-
pub fn from_session_config_mut(cfg: &mut SessionConfig) -> Result<&mut Self, DataFusionError> {
99-
if cfg
100-
.options()
101-
.extensions
102-
.get::<DistributedConfig>()
103-
.is_none()
104-
{
105-
set_distributed_option_extension(cfg, DistributedConfig::default());
106-
} else {
107-
register_config_extension_prefix(cfg, DistributedConfig::PREFIX);
108-
}
109-
Ok(cfg
110-
.options_mut()
111-
.extensions
112-
.get_mut::<DistributedConfig>()
113-
.unwrap())
93+
pub fn from_config_options_mut(cfg: &mut ConfigOptions) -> Result<&mut Self, DataFusionError> {
94+
let Some(distributed_cfg) = cfg.extensions.get_mut::<DistributedConfig>() else {
95+
return plan_err!("DistributedConfig is not in ConfigOptions.extensions");
96+
};
97+
Ok(distributed_cfg)
11498
}
11599

116100
/// Gets the [DistributedConfig] from the [ConfigOptions]'s in the provided [SessionConfig].

src/distributed_planner/distributed_query_planner.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ impl QueryPlanner for DistributedQueryPlanner {
7979
// unique identifiers for each stage, and move forward with it.
8080
if original_plan.exists(|plan| Ok(plan.is_network_boundary()))? {
8181
// Ensure the leafs are appropriately scaled up.
82-
let task_estimator = session_cfg
83-
.get_extension::<CombinedTaskEstimator>()
84-
.unwrap_or_else(|| Arc::new(CombinedTaskEstimator::default()));
82+
let task_estimator = CombinedTaskEstimator::from_session_config(session_cfg);
8583
let scaled = original_plan.transform_down_with_task_count(1, |plan, task_count| {
8684
if !plan.children().is_empty() {
8785
return Ok(Transformed::no(plan));

src/execution_plans/benchmarks/shuffle_bench.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::common::task_ctx_with_extension;
55
use crate::stage::RemoteStage;
66
use crate::worker::WorkerConnectionPool;
77
use crate::worker::test_utils::worker_handles::MemoryWorkerHandle;
8-
use crate::{DistributedExt, DistributedTaskContext, NetworkShuffleExec, Stage};
8+
use crate::{DistributedConfig, DistributedExt, DistributedTaskContext, NetworkShuffleExec, Stage};
99
use arrow::datatypes::Schema;
1010
use arrow_ipc::CompressionType;
1111
use datafusion::common::Result;
@@ -161,6 +161,7 @@ impl ShuffleBench {
161161

162162
let channel_resolver = InMemoryChannelsResolver { channels };
163163
let task_ctx = SessionStateBuilder::new()
164+
.with_distributed_option_extension(DistributedConfig::default())
164165
.with_distributed_channel_resolver(channel_resolver)
165166
.with_distributed_compression(bench.compression)?
166167
.build()

src/execution_plans/benchmarks/transport_bench.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use super::fixture::{
44
use crate::common::task_ctx_with_extension;
55
use crate::stage::RemoteStage;
66
use crate::worker::test_utils::worker_handles::{MemoryWorkerHandle, TcpWorkerHandle};
7-
use crate::{DistributedExt, DistributedTaskContext, NetworkShuffleExec, Stage, grpc};
7+
use crate::{
8+
DistributedConfig, DistributedExt, DistributedTaskContext, NetworkShuffleExec, Stage, grpc,
9+
};
810
use arrow::datatypes::Schema;
911
use arrow_ipc::CompressionType;
1012
use datafusion::common::Result;
@@ -195,6 +197,7 @@ impl TransportBench {
195197
bench: self.clone(),
196198
schema,
197199
task_ctx: SessionStateBuilder::new()
200+
.with_distributed_option_extension(DistributedConfig::default())
198201
.with_distributed_channel_resolver(InMemoryChannelsResolver { channels })
199202
.with_distributed_compression(self.compression)?
200203
.build()
@@ -231,6 +234,7 @@ impl TransportBench {
231234
bench: self.clone(),
232235
schema,
233236
task_ctx: SessionStateBuilder::new()
237+
.with_distributed_option_extension(DistributedConfig::default())
234238
.with_distributed_channel_resolver(grpc::DefaultChannelResolver::default())
235239
.with_distributed_compression(self.compression)?
236240
.build()

src/worker_resolver.rs

Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ pub(crate) fn set_distributed_worker_resolver(
2525
worker_resolver: impl WorkerResolver + 'static,
2626
) {
2727
cfg.set_extension(Arc::new(WorkerResolverExtension(Arc::new(worker_resolver))));
28-
let _ = DistributedConfig::from_session_config_mut(cfg);
28+
let options = cfg.options_mut();
29+
if options.extensions.get::<DistributedConfig>().is_none() {
30+
options.extensions.insert(DistributedConfig::default());
31+
}
2932
}
3033

3134
pub fn get_distributed_worker_resolver(
@@ -62,49 +65,3 @@ impl WorkerResolver for Arc<dyn WorkerResolver> {
6265
self.as_ref().get_urls()
6366
}
6467
}
65-
66-
#[cfg(test)]
67-
mod tests {
68-
use super::*;
69-
use crate::config_extension_ext::get_config_extension_propagation_headers;
70-
use crate::distributed_ext::DistributedExt;
71-
72-
struct NoopWorkerResolver;
73-
impl WorkerResolver for NoopWorkerResolver {
74-
fn get_urls(&self) -> Result<Vec<Url>, DataFusionError> {
75-
Ok(vec![])
76-
}
77-
}
78-
79-
// Regression test: scalars set before the worker resolver must still appear in outgoing gRPC headers.
80-
#[test]
81-
fn distributed_config_header_propagation_scalar_before_resolver() {
82-
let mut cfg = SessionConfig::new();
83-
cfg.set_distributed_metrics_collection(false).unwrap();
84-
set_distributed_worker_resolver(&mut cfg, NoopWorkerResolver);
85-
86-
let headers = get_config_extension_propagation_headers(&cfg).unwrap();
87-
let value = headers
88-
.get("x-datafusion-distributed-config-distributed.collect_metrics")
89-
.expect("collect_metrics header must be present")
90-
.to_str()
91-
.unwrap();
92-
assert_eq!(value, "false");
93-
}
94-
95-
// Regression test: scalars set after the resolver must also appear in gRPC headers.
96-
#[test]
97-
fn distributed_config_header_propagation_scalar_after_resolver() {
98-
let mut cfg = SessionConfig::new();
99-
set_distributed_worker_resolver(&mut cfg, NoopWorkerResolver);
100-
cfg.set_distributed_metrics_collection(false).unwrap();
101-
102-
let headers = get_config_extension_propagation_headers(&cfg).unwrap();
103-
let value = headers
104-
.get("x-datafusion-distributed-config-distributed.collect_metrics")
105-
.expect("collect_metrics header must be present")
106-
.to_str()
107-
.unwrap();
108-
assert_eq!(value, "false");
109-
}
110-
}

0 commit comments

Comments
 (0)