This is an automated email from the ASF dual-hosted git repository.

dheres pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 5818732662 [Minor] Use std::thread::available_parallelism instead of 
`num_cpus` (#13579)
5818732662 is described below

commit 58187326623763c63943377f9ec55cacb0e7e9c8
Author: DaniĆ«l Heres <[email protected]>
AuthorDate: Thu Nov 28 11:09:00 2024 +0100

    [Minor] Use std::thread::available_parallelism instead of `num_cpus` 
(#13579)
    
    * Use std::thread::available_parallelism
    
    * Use std::thread::available_parallelism
    
    * Use std::thread::available_parallelism
    
    * Use std::thread::available_parallelism
    
    * Use std::thread::available_parallelism
    
    * Use std::thread::available_parallelism
---
 Cargo.toml                                                   |  1 -
 benchmarks/Cargo.toml                                        |  1 -
 benchmarks/src/bin/external_aggr.rs                          |  8 +++++++-
 benchmarks/src/bin/h2o.rs                                    |  6 +++++-
 benchmarks/src/imdb/run.rs                                   |  8 +++++++-
 benchmarks/src/sort.rs                                       |  8 +++++++-
 benchmarks/src/sort_tpch.rs                                  |  8 +++++++-
 benchmarks/src/tpch/run.rs                                   |  8 +++++++-
 benchmarks/src/util/options.rs                               | 10 +++++++++-
 benchmarks/src/util/run.rs                                   |  6 +++++-
 datafusion-cli/Cargo.lock                                    | 12 ------------
 datafusion/common/Cargo.toml                                 |  1 -
 datafusion/common/src/config.rs                              |  6 ++++--
 datafusion/core/Cargo.toml                                   |  1 -
 .../tests/fuzz_cases/aggregation_fuzzer/context_generator.rs |  6 ++++--
 datafusion/core/tests/sql/mod.rs                             |  9 ++++++++-
 datafusion/sqllogictest/Cargo.toml                           |  1 -
 datafusion/sqllogictest/bin/sqllogictests.rs                 |  8 +++++++-
 18 files changed, 77 insertions(+), 31 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 93af308ff0..76bc50d59a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -129,7 +129,6 @@ hashbrown = { version = "0.14.5", features = ["raw"] }
 indexmap = "2.0.0"
 itertools = "0.13"
 log = "^0.4"
-num_cpus = "1.13.0"
 object_store = { version = "0.11.0", default-features = false }
 parking_lot = "0.12"
 parquet = { version = "53.3.0", default-features = false, features = [
diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml
index 7f29f7471b..ad8debaf2f 100644
--- a/benchmarks/Cargo.toml
+++ b/benchmarks/Cargo.toml
@@ -42,7 +42,6 @@ env_logger = { workspace = true }
 futures = { workspace = true }
 log = { workspace = true }
 mimalloc = { version = "0.1", optional = true, default-features = false }
-num_cpus = { workspace = true }
 parquet = { workspace = true, default-features = true }
 serde = { version = "1.0.136", features = ["derive"] }
 serde_json = { workspace = true }
diff --git a/benchmarks/src/bin/external_aggr.rs 
b/benchmarks/src/bin/external_aggr.rs
index 6438593a20..8e51a0787f 100644
--- a/benchmarks/src/bin/external_aggr.rs
+++ b/benchmarks/src/bin/external_aggr.rs
@@ -18,9 +18,11 @@
 //! external_aggr binary entrypoint
 
 use std::collections::HashMap;
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
 use std::sync::OnceLock;
+use std::thread::available_parallelism;
 use structopt::StructOpt;
 
 use arrow::record_batch::RecordBatch;
@@ -325,7 +327,11 @@ impl ExternalAggrConfig {
     }
 
     fn partitions(&self) -> usize {
-        self.common.partitions.unwrap_or(num_cpus::get())
+        self.common.partitions.unwrap_or(
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
+        )
     }
 
     /// Parse memory limit from string to number of bytes
diff --git a/benchmarks/src/bin/h2o.rs b/benchmarks/src/bin/h2o.rs
index 1ddeb786a5..a91af463fa 100644
--- a/benchmarks/src/bin/h2o.rs
+++ b/benchmarks/src/bin/h2o.rs
@@ -27,8 +27,10 @@ use datafusion::datasource::MemTable;
 use datafusion::prelude::CsvReadOptions;
 use datafusion::{arrow::util::pretty, error::Result, prelude::SessionContext};
 use datafusion_benchmarks::util::BenchmarkRun;
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 use structopt::StructOpt;
 use tokio::time::Instant;
 
@@ -91,7 +93,9 @@ async fn group_by(opt: &GroupBy) -> Result<()> {
             
.with_listing_options(ListingOptions::new(Arc::new(CsvFormat::default())))
             .with_schema(Arc::new(schema));
         let csv = ListingTable::try_new(listing_config)?;
-        let partition_size = num_cpus::get();
+        let partition_size = available_parallelism()
+            .unwrap_or(NonZero::new(1).unwrap())
+            .get();
         let memtable =
             MemTable::load(Arc::new(csv), Some(partition_size), 
&ctx.state()).await?;
         ctx.register_table("x", Arc::new(memtable))?;
diff --git a/benchmarks/src/imdb/run.rs b/benchmarks/src/imdb/run.rs
index 47c3569908..3d85658bb6 100644
--- a/benchmarks/src/imdb/run.rs
+++ b/benchmarks/src/imdb/run.rs
@@ -15,8 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 
 use super::{get_imdb_table_schema, get_query_sql, IMDB_TABLES};
 use crate::util::{BenchmarkRun, CommonOpt};
@@ -468,7 +470,11 @@ impl RunOpt {
     }
 
     fn partitions(&self) -> usize {
-        self.common.partitions.unwrap_or(num_cpus::get())
+        self.common.partitions.unwrap_or(
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
+        )
     }
 }
 
diff --git a/benchmarks/src/sort.rs b/benchmarks/src/sort.rs
index f4b707611c..9bc3d82d34 100644
--- a/benchmarks/src/sort.rs
+++ b/benchmarks/src/sort.rs
@@ -15,8 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 
 use crate::util::{AccessLogOpt, BenchmarkRun, CommonOpt};
 
@@ -147,7 +149,11 @@ impl RunOpt {
             rundata.start_new_case(title);
             for i in 0..self.common.iterations {
                 let config = SessionConfig::new().with_target_partitions(
-                    self.common.partitions.unwrap_or(num_cpus::get()),
+                    self.common.partitions.unwrap_or(
+                        available_parallelism()
+                            .unwrap_or(NonZero::new(1).unwrap())
+                            .get(),
+                    ),
                 );
                 let ctx = SessionContext::new_with_config(config);
                 let (rows, elapsed) =
diff --git a/benchmarks/src/sort_tpch.rs b/benchmarks/src/sort_tpch.rs
index 4b83b3b888..341474a39e 100644
--- a/benchmarks/src/sort_tpch.rs
+++ b/benchmarks/src/sort_tpch.rs
@@ -22,8 +22,10 @@
 //! runs end-to-end sort queries and test the performance on multiple CPU 
cores.
 
 use futures::StreamExt;
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 use structopt::StructOpt;
 
 use datafusion::datasource::file_format::parquet::ParquetFormat;
@@ -315,6 +317,10 @@ impl RunOpt {
     }
 
     fn partitions(&self) -> usize {
-        self.common.partitions.unwrap_or(num_cpus::get())
+        self.common.partitions.unwrap_or(
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
+        )
     }
 }
diff --git a/benchmarks/src/tpch/run.rs b/benchmarks/src/tpch/run.rs
index 9ff1f72d86..f6f754caa1 100644
--- a/benchmarks/src/tpch/run.rs
+++ b/benchmarks/src/tpch/run.rs
@@ -15,8 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::num::NonZero;
 use std::path::PathBuf;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 
 use super::{
     get_query_sql, get_tbl_tpch_table_schema, get_tpch_table_schema, 
TPCH_TABLES,
@@ -296,7 +298,11 @@ impl RunOpt {
     }
 
     fn partitions(&self) -> usize {
-        self.common.partitions.unwrap_or(num_cpus::get())
+        self.common.partitions.unwrap_or(
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
+        )
     }
 }
 
diff --git a/benchmarks/src/util/options.rs b/benchmarks/src/util/options.rs
index b9398e5b52..50b8ac42fa 100644
--- a/benchmarks/src/util/options.rs
+++ b/benchmarks/src/util/options.rs
@@ -15,6 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::{num::NonZero, thread::available_parallelism};
+
 use datafusion::prelude::SessionConfig;
 use structopt::StructOpt;
 
@@ -48,7 +50,13 @@ impl CommonOpt {
     /// Modify the existing config appropriately
     pub fn update_config(&self, config: SessionConfig) -> SessionConfig {
         config
-            .with_target_partitions(self.partitions.unwrap_or(num_cpus::get()))
+            .with_target_partitions(
+                self.partitions.unwrap_or(
+                    available_parallelism()
+                        .unwrap_or(NonZero::new(1).unwrap())
+                        .get(),
+                ),
+            )
             .with_batch_size(self.batch_size)
     }
 }
diff --git a/benchmarks/src/util/run.rs b/benchmarks/src/util/run.rs
index 5ee6691576..fd081826f3 100644
--- a/benchmarks/src/util/run.rs
+++ b/benchmarks/src/util/run.rs
@@ -20,7 +20,9 @@ use serde::{Serialize, Serializer};
 use serde_json::Value;
 use std::{
     collections::HashMap,
+    num::NonZero,
     path::Path,
+    thread::available_parallelism,
     time::{Duration, SystemTime},
 };
 
@@ -68,7 +70,9 @@ impl RunContext {
         Self {
             benchmark_version: env!("CARGO_PKG_VERSION").to_owned(),
             datafusion_version: DATAFUSION_VERSION.to_owned(),
-            num_cpus: num_cpus::get(),
+            num_cpus: available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
             start_time: SystemTime::now(),
             arguments: std::env::args().skip(1).collect::<Vec<String>>(),
         }
diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index d2a92fea31..04b0b0d22c 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -1222,7 +1222,6 @@ dependencies = [
  "itertools",
  "log",
  "num-traits",
- "num_cpus",
  "object_store",
  "parking_lot",
  "parquet",
@@ -1296,7 +1295,6 @@ dependencies = [
  "hashbrown 0.14.5",
  "indexmap",
  "libc",
- "num_cpus",
  "object_store",
  "parquet",
  "paste",
@@ -2747,16 +2745,6 @@ dependencies = [
  "libm",
 ]
 
-[[package]]
-name = "num_cpus"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
 [[package]]
 name = "object"
 version = "0.36.5"
diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml
index 9f2db95721..d76848dfe9 100644
--- a/datafusion/common/Cargo.toml
+++ b/datafusion/common/Cargo.toml
@@ -58,7 +58,6 @@ half = { workspace = true }
 hashbrown = { workspace = true }
 indexmap = { workspace = true }
 libc = "0.2.140"
-num_cpus = { workspace = true }
 object_store = { workspace = true, optional = true }
 parquet = { workspace = true, optional = true, default-features = true }
 paste = "1.0.15"
diff --git a/datafusion/common/src/config.rs b/datafusion/common/src/config.rs
index 1ad10d1648..e91568075f 100644
--- a/datafusion/common/src/config.rs
+++ b/datafusion/common/src/config.rs
@@ -20,7 +20,9 @@
 use std::any::Any;
 use std::collections::{BTreeMap, HashMap};
 use std::fmt::{self, Display};
+use std::num::NonZero;
 use std::str::FromStr;
+use std::thread::available_parallelism;
 
 use crate::error::_config_err;
 use crate::parsers::CompressionTypeVariant;
@@ -250,7 +252,7 @@ config_namespace! {
         /// concurrency.
         ///
         /// Defaults to the number of CPU cores on the system
-        pub target_partitions: usize, default = num_cpus::get()
+        pub target_partitions: usize, default = 
available_parallelism().unwrap_or(NonZero::new(1).unwrap()).get()
 
         /// The default time zone
         ///
@@ -266,7 +268,7 @@ config_namespace! {
         /// This is mostly use to plan `UNION` children in parallel.
         ///
         /// Defaults to the number of CPU cores on the system
-        pub planning_concurrency: usize, default = num_cpus::get()
+        pub planning_concurrency: usize, default = 
available_parallelism().unwrap_or(NonZero::new(1).unwrap()).get()
 
         /// When set to true, skips verifying that the schema produced by
         /// planning the input of `LogicalPlan::Aggregate` exactly matches the
diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml
index fc7b96cf9e..268e0fb17f 100644
--- a/datafusion/core/Cargo.toml
+++ b/datafusion/core/Cargo.toml
@@ -116,7 +116,6 @@ glob = "0.3.0"
 itertools = { workspace = true }
 log = { workspace = true }
 num-traits = { version = "0.2", optional = true }
-num_cpus = { workspace = true }
 object_store = { workspace = true }
 parking_lot = { workspace = true }
 parquet = { workspace = true, optional = true, default-features = true }
diff --git 
a/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/context_generator.rs 
b/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/context_generator.rs
index af454bee7c..33d13fc1b6 100644
--- a/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/context_generator.rs
+++ b/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/context_generator.rs
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use std::{cmp, sync::Arc};
+use std::{cmp, num::NonZero, sync::Arc, thread::available_parallelism};
 
 use datafusion::{
     datasource::MemTable,
@@ -73,7 +73,9 @@ impl SessionContextGenerator {
         ];
 
         let max_batch_size = cmp::max(1, dataset_ref.total_rows_num);
-        let max_target_partitions = num_cpus::get();
+        let max_target_partitions = available_parallelism()
+            .unwrap_or(NonZero::new(1).unwrap())
+            .get();
 
         Self {
             dataset: dataset_ref,
diff --git a/datafusion/core/tests/sql/mod.rs b/datafusion/core/tests/sql/mod.rs
index 177427b47d..c6902a11d8 100644
--- a/datafusion/core/tests/sql/mod.rs
+++ b/datafusion/core/tests/sql/mod.rs
@@ -15,7 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::num::NonZero;
 use std::sync::Arc;
+use std::thread::available_parallelism;
 
 use arrow::{
     array::*, datatypes::*, record_batch::RecordBatch,
@@ -259,7 +261,12 @@ impl ExplainNormalizer {
 
         // convert things like partitioning=RoundRobinBatch(16)
         // to partitioning=RoundRobinBatch(NUM_CORES)
-        let needle = format!("RoundRobinBatch({})", num_cpus::get());
+        let needle = format!(
+            "RoundRobinBatch({})",
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get()
+        );
         replacements.push((needle, "RoundRobinBatch(NUM_CORES)".to_string()));
 
         Self { replacements }
diff --git a/datafusion/sqllogictest/Cargo.toml 
b/datafusion/sqllogictest/Cargo.toml
index ed2b9c4971..849003f8ee 100644
--- a/datafusion/sqllogictest/Cargo.toml
+++ b/datafusion/sqllogictest/Cargo.toml
@@ -70,7 +70,6 @@ postgres = [
 
 [dev-dependencies]
 env_logger = { workspace = true }
-num_cpus = { workspace = true }
 tokio = { workspace = true, features = ["rt-multi-thread"] }
 
 [[test]]
diff --git a/datafusion/sqllogictest/bin/sqllogictests.rs 
b/datafusion/sqllogictest/bin/sqllogictests.rs
index c3e739d146..9f8aac85a0 100644
--- a/datafusion/sqllogictest/bin/sqllogictests.rs
+++ b/datafusion/sqllogictest/bin/sqllogictests.rs
@@ -17,7 +17,9 @@
 
 use std::ffi::OsStr;
 use std::fs;
+use std::num::NonZero;
 use std::path::{Path, PathBuf};
+use std::thread::available_parallelism;
 
 use clap::Parser;
 use datafusion_sqllogictest::{DataFusion, TestContext};
@@ -112,7 +114,11 @@ async fn run_tests() -> Result<()> {
             .join()
         })
         // run up to num_cpus streams in parallel
-        .buffer_unordered(num_cpus::get())
+        .buffer_unordered(
+            available_parallelism()
+                .unwrap_or(NonZero::new(1).unwrap())
+                .get(),
+        )
         .flat_map(|result| {
             // Filter out any Ok() leaving only the DataFusionErrors
             futures::stream::iter(match result {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to