diff --git a/CHANGELOG.md b/CHANGELOG.md index 86f64cef9..0d11c74a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.29.0](https://github.com/TimelyDataflow/timely-dataflow/compare/timely-v0.28.1...timely-v0.29.0) - 2026-04-13 + +The theme in this release is simplifying specialization by removing monomorphization sprawl. +The `Scope` trait that used to have numerous implementors is now a concrete type that only varies with lifetime and timestamp. +Operator closures are boxed by default. +These resulted in a ~25% reduction in LLVM lines in Materialize. + +Some forms of specialization have vanished; reach out if you relied on them. +Also, check out the `Scope::scoped_raw` method for more flexibility in assembling scopes. + +### Scope is now a lightweight, Copy handle + +`Scope` has been substantially simplified. It is now a concrete `Copy` type rather than a trait: + +```rust +pub struct Scope<'scope, T: Timestamp> { + subgraph: &'scope RefCell>, + worker: &'scope Worker, +} +``` + +Previously, `Scope` was a trait (implemented by `Child`) and code was generic over `G: Scope`. +Now `Scope` is a concrete type parameterized by a lifetime and its timestamp, previously hidden in the `G: Scope` implementation, and now code uses `Scope<'scope, T>` directly. + +- **`Scope` is a concrete type, not a trait.** The `Child` type is gone. Where you previously had a generic parameter `G: Scope` or `G: Scope`, you now use `Scope<'scope, T>` directly. This means replacing a type-level generic with a lifetime and a concrete timestamp type — you may need to introduce `'scope` and `T: Timestamp` where they weren't needed before, and remove `G` from your generic parameter lists. +- **`Scope` implements `Copy`.** It is passed by value to dataflow closures and operator constructors. The `FnOnce(&Scope)` pattern becomes `FnOnce(Scope)`. +- **`AsWorker` and `Scheduler` traits are removed.** Their methods are now inherent on `Worker`. Access the worker from a scope via `scope.worker()`. +- **All `Scope` methods take `&self`, not `&mut self`.** Extension traits that took `&mut self` on `Scope` (e.g., `Input`, `Feedback`, `UnorderedInput`) now take `&self`. + +#### Migration guide + +| Before (0.28) | After (0.29) | +|---|---| +| `G: Scope` or `G: Scope` | `Scope<'scope, T>` | +| `Child<'scope, _, T>` | `Scope<'scope, T>` | +| `AsWorker::logging(&scope)` | `scope.worker().logging()` | +| `use timely::scheduling::Scheduler;` | *(remove — methods are inherent on `Worker`)* | +| `FnOnce(&mut Scope)` | `FnOnce(Scope)` | +| `scope: &Scope<'scope, T>` in free functions | `scope: Scope<'scope, T>` | + +### Other + +- Box operator logic by default ([#786](https://github.com/TimelyDataflow/timely-dataflow/pull/786)) +- Remove `Allocate` trait; replace with `Allocator`. ([#778](https://github.com/TimelyDataflow/timely-dataflow/pull/778)) +- Checks for WASM compatibility ([#777](https://github.com/TimelyDataflow/timely-dataflow/pull/777)) + ## [0.28.1](https://github.com/TimelyDataflow/timely-dataflow/compare/timely-v0.28.0...timely-v0.28.1) - 2026-04-03 ### Other diff --git a/bytes/Cargo.toml b/bytes/Cargo.toml index 03b4c3a76..dac382ae7 100644 --- a/bytes/Cargo.toml +++ b/bytes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_bytes" -version = "0.28.1" +version = "0.29.0" authors = ["Frank McSherry "] edition.workspace = true rust-version.workspace = true diff --git a/communication/Cargo.toml b/communication/Cargo.toml index 7411570cc..e2d490897 100644 --- a/communication/Cargo.toml +++ b/communication/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_communication" -version = "0.28.1" +version = "0.29.0" authors = ["Frank McSherry "] description = "Communication layer for timely dataflow" edition.workspace = true @@ -25,9 +25,9 @@ columnar = { workspace = true } getopts = { version = "0.2.24", optional = true } byteorder = "1.5" serde = { version = "1.0", features = ["derive"] } -timely_bytes = { path = "../bytes", version = "0.28" } -timely_container = { path = "../container", version = "0.28.1" } -timely_logging = { path = "../logging", version = "0.28" } +timely_bytes = { path = "../bytes", version = "0.29" } +timely_container = { path = "../container", version = "0.29.0" } +timely_logging = { path = "../logging", version = "0.29" } # Lgalloc only supports linux and macos, don't depend on any other OS. [target.'cfg(any(target_os = "linux", target_os = "macos"))'.dev-dependencies] diff --git a/container/Cargo.toml b/container/Cargo.toml index 98d144300..e039b5d04 100644 --- a/container/Cargo.toml +++ b/container/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_container" -version = "0.28.1" +version = "0.29.0" description = "Container abstractions for Timely" license = "MIT" edition.workspace = true diff --git a/logging/Cargo.toml b/logging/Cargo.toml index 3d5b82e9e..667b28e34 100644 --- a/logging/Cargo.toml +++ b/logging/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_logging" -version = "0.28.1" +version = "0.29.0" authors = ["Frank McSherry "] description = "Common timely logging infrastructure" edition.workspace = true @@ -16,4 +16,4 @@ license = "MIT" workspace = true [dependencies] -timely_container = { version = "0.28.1", path = "../container" } +timely_container = { version = "0.29.0", path = "../container" } diff --git a/timely/Cargo.toml b/timely/Cargo.toml index 8c3a4350a..0e99e325c 100644 --- a/timely/Cargo.toml +++ b/timely/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "timely" -version = "0.28.1" +version = "0.29.0" authors = ["Frank McSherry "] readme = "../README.md" edition.workspace = true @@ -30,8 +30,8 @@ bincode = { version = "1.3" } byteorder = "1.5" itertools = "0.14.0" serde = { version = "1.0", features = ["derive"] } -timely_bytes = { path = "../bytes", version = "0.28" } -timely_logging = { path = "../logging", version = "0.28" } -timely_communication = { path = "../communication", version = "0.28", default-features = false } -timely_container = { path = "../container", version = "0.28" } +timely_bytes = { path = "../bytes", version = "0.29" } +timely_logging = { path = "../logging", version = "0.29" } +timely_communication = { path = "../communication", version = "0.29", default-features = false } +timely_container = { path = "../container", version = "0.29" } smallvec = { version = "1.15.1", features = ["serde", "const_generics"] }