From c77833fb52e1f1683595cb758ade39da927ed570 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 12:55:29 +0000 Subject: [PATCH 1/2] chore: release v0.29.0 --- CHANGELOG.md | 15 +++++++++++++++ bytes/Cargo.toml | 2 +- communication/Cargo.toml | 8 ++++---- container/Cargo.toml | 2 +- logging/Cargo.toml | 4 ++-- timely/Cargo.toml | 10 +++++----- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86f64cef9..4ca28e010 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ 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 + +### Other + +- Move logging to subgraph building ([#788](https://github.com/TimelyDataflow/timely-dataflow/pull/788)) +- Implement `Copy` for `Scope` ([#787](https://github.com/TimelyDataflow/timely-dataflow/pull/787)) +- Box operator logic by default ([#786](https://github.com/TimelyDataflow/timely-dataflow/pull/786)) +- Return lifetimes to `Scope` and friends ([#785](https://github.com/TimelyDataflow/timely-dataflow/pull/785)) +- Subscope builder ([#781](https://github.com/TimelyDataflow/timely-dataflow/pull/781)) +- Convert `Scope` trait to type ([#780](https://github.com/TimelyDataflow/timely-dataflow/pull/780)) +- Remove lifetime from Child ([#779](https://github.com/TimelyDataflow/timely-dataflow/pull/779)) +- 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)) +- `Child` generics cleanup ([#774](https://github.com/TimelyDataflow/timely-dataflow/pull/774)) + ## [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"] } From 3c51f7e7eae8c771ec3291bd5f9647ccaff607ea Mon Sep 17 00:00:00 2001 From: Frank McSherry Date: Mon, 13 Apr 2026 16:41:39 -0400 Subject: [PATCH 2/2] Improve CHANGELOG.md --- CHANGELOG.md | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ca28e010..0d11c74a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,18 +9,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [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 -- Move logging to subgraph building ([#788](https://github.com/TimelyDataflow/timely-dataflow/pull/788)) -- Implement `Copy` for `Scope` ([#787](https://github.com/TimelyDataflow/timely-dataflow/pull/787)) - Box operator logic by default ([#786](https://github.com/TimelyDataflow/timely-dataflow/pull/786)) -- Return lifetimes to `Scope` and friends ([#785](https://github.com/TimelyDataflow/timely-dataflow/pull/785)) -- Subscope builder ([#781](https://github.com/TimelyDataflow/timely-dataflow/pull/781)) -- Convert `Scope` trait to type ([#780](https://github.com/TimelyDataflow/timely-dataflow/pull/780)) -- Remove lifetime from Child ([#779](https://github.com/TimelyDataflow/timely-dataflow/pull/779)) - 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)) -- `Child` generics cleanup ([#774](https://github.com/TimelyDataflow/timely-dataflow/pull/774)) ## [0.28.1](https://github.com/TimelyDataflow/timely-dataflow/compare/timely-v0.28.0...timely-v0.28.1) - 2026-04-03