Skip to content

Commit ba37b62

Browse files
feat: new feature flag default-engine-rustls (#572)
We had a request to remove our (implicit) dependency on native-tls. The `default-engine` feature flag pulls in `reqwest` with default features which requires native-tls. This PR introduces a new feature flag: `default-engine-rustls` which instead specifies `default-features = false` for `reqwest` enables the same features which are used in `object_store`: `reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-native-roots", "http2"], optional = true } ` ### Details This PR actually introduces two new feature flags: and 'internal' feature flag `default-engine-base` and the new `default-engine-rustls`. The former doesn't work on its own, we throw a compile error if you attempt to use the 'base' feature without either `default-engine` or `default-engine-rustls`: ``` cargo b -p delta_kernel --features default-engine-base Compiling delta_kernel v0.6.0 (/Users/zach.schuermann/dev/delta-kernel-rs2/kernel) error: The default-engine-base feature flag is not meant to be used directly. Please use either default-engine or default-engine-rustls. --> kernel/src/lib.rs:470:1 | 470 | / compile_error!( 471 | | "The default-engine-base feature flag is not meant to be used directly. \ 472 | | Please use either default-engine or default-engine-rustls." 473 | | ); | |_^ ``` Lastly, a new crate `feature-tests` in the workspace was created to ensure that the features work as expected. ### This PR affects the following public APIs New `default-engine-rustls` feature flag. (New private `_default-engine-base` feature flag) ## How was this change tested? New `feature-tests` crate and added to CI. ## Future work 1. this flag isn't exposed in the FFI (just normal `default-engine` is) 2. need to clean up feature flags in general (lots of overlap, etc.) 3. need to add a PresignedUrl test (does not yet exist)
1 parent e5c14eb commit ba37b62

File tree

9 files changed

+70
-10
lines changed

9 files changed

+70
-10
lines changed

.github/workflows/build.yml

+4
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ jobs:
107107
run: cargo clippy --benches --tests --all-features -- -D warnings
108108
- name: lint without default features
109109
run: cargo clippy --no-default-features -- -D warnings
110+
- name: check kernel builds with default-engine
111+
run: cargo build -p feature_tests --features default-engine
112+
- name: check kernel builds with default-engine-rustls
113+
run: cargo build -p feature_tests --features default-engine-rustls
110114
test:
111115
runs-on: ${{ matrix.os }}
112116
strategy:

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ members = [
66
"kernel",
77
"kernel/examples/*",
88
"test-utils",
9+
"feature-tests",
910
]
1011
# Only check / build main crates by default (check all with `--workspace`)
1112
default-members = ["acceptance", "kernel"]

feature-tests/Cargo.toml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[package]
2+
name = "feature_tests"
3+
edition.workspace = true
4+
homepage.workspace = true
5+
keywords.workspace = true
6+
license.workspace = true
7+
repository.workspace = true
8+
readme.workspace = true
9+
version.workspace = true
10+
11+
[dependencies]
12+
delta_kernel = { path = "../kernel" }
13+
14+
[features]
15+
default-engine = [ "delta_kernel/default-engine" ]
16+
default-engine-rustls = [ "delta_kernel/default-engine-rustls" ]

feature-tests/src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/// This is a compilation test to ensure that the default-engine feature flags are working
2+
/// correctly. Run (from workspace root) with:
3+
/// 1. `cargo b -p feature_tests --features default-engine-rustls`
4+
/// 2. `cargo b -p feature_tests --features default-engine`
5+
/// These run in our build CI.
6+
pub fn test_default_engine_feature_flags() {
7+
#[cfg(any(feature = "default-engine", feature = "default-engine-rustls"))]
8+
{
9+
#[allow(unused_imports)]
10+
use delta_kernel::engine::default::DefaultEngine;
11+
}
12+
}

kernel/Cargo.toml

+18-3
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ hdfs-native-object-store = { workspace = true, optional = true }
5454
# Used in default and sync engine
5555
parquet = { workspace = true, optional = true }
5656
# Used for fetching direct urls (like pre-signed urls)
57-
reqwest = { version = "0.12.7", optional = true }
57+
reqwest = { version = "0.12.8", default-features = false, optional = true }
5858
strum = { version = "0.26", features = ["derive"] }
5959

6060

@@ -76,7 +76,10 @@ cloud = [
7676
"hdfs-native-object-store",
7777
]
7878
default = []
79-
default-engine = [
79+
80+
# this is an 'internal' feature flag which has all the shared bits from default-engine and
81+
# default-engine-rustls
82+
default-engine-base = [
8083
"arrow-conversion",
8184
"arrow-expression",
8285
"arrow-array",
@@ -89,12 +92,24 @@ default-engine = [
8992
"object_store",
9093
"parquet/async",
9194
"parquet/object_store",
92-
"reqwest",
9395
"tokio",
9496
"uuid/v4",
9597
"uuid/fast-rng",
9698
]
9799

100+
# the default-engine use the reqwest crate with default features which uses native-tls. if you want
101+
# to instead use rustls, use 'default-engine-rustls' which has no native-tls dependency
102+
default-engine = [
103+
"default-engine-base",
104+
"reqwest/default",
105+
]
106+
107+
default-engine-rustls = [
108+
"default-engine-base",
109+
"reqwest/rustls-tls-native-roots",
110+
"reqwest/http2",
111+
]
112+
98113
developer-visibility = []
99114
sync-engine = [
100115
"arrow-cast",

kernel/src/actions/set_transaction.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl SetTransactionScanner {
8080
}
8181
}
8282

83-
#[cfg(all(test, feature = "default-engine"))]
83+
#[cfg(all(test, feature = "sync-engine"))]
8484
mod tests {
8585
use std::path::PathBuf;
8686

kernel/src/engine/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ pub(crate) mod arrow_conversion;
77

88
#[cfg(all(
99
feature = "arrow-expression",
10-
any(feature = "default-engine", feature = "sync-engine")
10+
any(feature = "default-engine-base", feature = "sync-engine")
1111
))]
1212
pub mod arrow_expression;
1313

14-
#[cfg(feature = "default-engine")]
14+
#[cfg(feature = "default-engine-base")]
1515
pub mod default;
1616

1717
#[cfg(feature = "sync-engine")]
@@ -25,7 +25,7 @@ macro_rules! declare_modules {
2525
};
2626
}
2727

28-
#[cfg(any(feature = "default-engine", feature = "sync-engine"))]
28+
#[cfg(any(feature = "default-engine-base", feature = "sync-engine"))]
2929
declare_modules!(
3030
(pub, arrow_data),
3131
(pub, parquet_row_group_skipping),

kernel/src/error.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub enum Error {
2727
},
2828

2929
/// An error performing operations on arrow data
30-
#[cfg(any(feature = "default-engine", feature = "sync-engine"))]
30+
#[cfg(any(feature = "default-engine-base", feature = "sync-engine"))]
3131
#[error(transparent)]
3232
Arrow(arrow_schema::ArrowError),
3333

@@ -75,7 +75,7 @@ pub enum Error {
7575
#[error("Object store path error: {0}")]
7676
ObjectStorePath(#[from] object_store::path::Error),
7777

78-
#[cfg(feature = "default-engine")]
78+
#[cfg(any(feature = "default-engine", feature = "default-engine-rustls"))]
7979
#[error("Reqwest Error: {0}")]
8080
Reqwest(#[from] reqwest::Error),
8181

@@ -303,7 +303,7 @@ from_with_backtrace!(
303303
(std::io::Error, IOError)
304304
);
305305

306-
#[cfg(any(feature = "default-engine", feature = "sync-engine"))]
306+
#[cfg(any(feature = "default-engine-base", feature = "sync-engine"))]
307307
impl From<arrow_schema::ArrowError> for Error {
308308
fn from(value: arrow_schema::ArrowError) -> Self {
309309
Self::Arrow(value).with_backtrace()

kernel/src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -456,3 +456,15 @@ pub trait Engine: AsAny {
456456
/// Get the connector provided [`ParquetHandler`].
457457
fn get_parquet_handler(&self) -> Arc<dyn ParquetHandler>;
458458
}
459+
460+
// we have an 'internal' feature flag: default-engine-base, which is actually just the shared
461+
// pieces of default-engine and default-engine-rustls. the crate can't compile with _only_
462+
// default-engine-base, so we give a friendly error here.
463+
#[cfg(all(
464+
feature = "default-engine-base",
465+
not(any(feature = "default-engine", feature = "default-engine-rustls",))
466+
))]
467+
compile_error!(
468+
"The default-engine-base feature flag is not meant to be used directly. \
469+
Please use either default-engine or default-engine-rustls."
470+
);

0 commit comments

Comments
 (0)