Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<SubgraphBuilder<T>>,
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<Timestamp = T>`, 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<T>)` pattern becomes `FnOnce(Scope<T>)`.
- **`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<Timestamp = T>` | `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<T>)` | `FnOnce(Scope<T>)` |
| `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
Expand Down
2 changes: 1 addition & 1 deletion bytes/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "timely_bytes"
version = "0.28.1"
version = "0.29.0"
authors = ["Frank McSherry <fmcsherry@me.com>"]
edition.workspace = true
rust-version.workspace = true
Expand Down
8 changes: 4 additions & 4 deletions communication/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "timely_communication"
version = "0.28.1"
version = "0.29.0"
authors = ["Frank McSherry <fmcsherry@me.com>"]
description = "Communication layer for timely dataflow"
edition.workspace = true
Expand All @@ -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]
Expand Down
2 changes: 1 addition & 1 deletion container/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions logging/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "timely_logging"
version = "0.28.1"
version = "0.29.0"
authors = ["Frank McSherry <fmcsherry@me.com>"]
description = "Common timely logging infrastructure"
edition.workspace = true
Expand All @@ -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" }
10 changes: 5 additions & 5 deletions timely/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]

name = "timely"
version = "0.28.1"
version = "0.29.0"
authors = ["Frank McSherry <fmcsherry@me.com>"]
readme = "../README.md"
edition.workspace = true
Expand Down Expand Up @@ -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"] }
Loading