diff --git a/CHANGELOG.md b/CHANGELOG.md index 699bb6463..6d786a218 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.30.0](https://github.com/TimelyDataflow/timely-dataflow/compare/timely-v0.29.0...timely-v0.30.0) - 2026-05-28 + +This release adds opt-in spill-to-disk support for the zero-copy network allocator, makes `Bytes` `Sync` (a soundness fix), and continues trimming compile-time monomorphization sprawl. + ### Breaking changes -- `ToStreamBuilder` exposes the item type via the `Item` associated type instead of a trait-level generic, and the container builder moves to a method-level generic. This enables method-call syntax: `(0..3).to_stream_with_builder::<_, CapacityContainerBuilder<_>>(scope)` instead of the UFCS form `ToStreamBuilder::>::to_stream_with_builder(0..3, scope)`. +- **`Bytes` is now `Sync`, and byte buffers must be `Send`.** `timely_bytes::arc::Bytes` now implements `Sync` in addition to `Send`. To make both impls sound, `BytesMut::from` now requires its payload to be `Send`. This is a breaking change to `timely_communication`: `BytesRefill::logic` now produces `Box + Send>` rather than `Box>`. Custom refills whose buffer type wraps a raw pointer (e.g. `NonNull`) must assert `unsafe impl Send` on that type. ([#800](https://github.com/TimelyDataflow/timely-dataflow/pull/800)) +- **`ToStreamBuilder`** exposes the item type via the `Item` associated type instead of a trait-level generic, and the container builder moves to a method-level generic. This enables method-call syntax: `(0..3).to_stream_with_builder::<_, CapacityContainerBuilder<_>>(scope)` instead of the UFCS form `ToStreamBuilder::>::to_stream_with_builder(0..3, scope)`. ([#792](https://github.com/TimelyDataflow/timely-dataflow/pull/792)) + +### Added + +- **Spill-to-disk for the zero-copy allocator (`timely_communication`).** A new `allocator::zero_copy::spill` module lets a `MergeQueue` shed resident bytes under memory pressure. It composes three pluggable traits: `SpillPolicy` (whether and how to reshape a queue on each `extend`), `BytesSpill` (where spilled bytes go — file, object store, mock, …), and `BytesFetch` (reads them back). The shipped `threshold::Threshold` policy spills the middle of a queue once resident bytes exceed configurable threshold/reserve/budget knobs. It is opt-in via the `spill` hook on the communication configuration and defaults to `None`, so existing deployments are unaffected. See the `spill_stress` and `spill_compare` examples. ([#789](https://github.com/TimelyDataflow/timely-dataflow/pull/789), [#791](https://github.com/TimelyDataflow/timely-dataflow/pull/791)) +- `logging::Registry::names` iterates the names of the currently bound loggers. ([#795](https://github.com/TimelyDataflow/timely-dataflow/pull/795)) -### `Bytes` is now `Sync`, and byte buffers must be `Send` +### Other -`timely_bytes::arc::Bytes` now implements `Sync` in addition to `Send`. To make both impls sound, `BytesMut::from` now requires its payload to be `Send`. This is a breaking change to `timely_communication`: `BytesRefill::logic` now produces `Box + Send>` rather than `Box>`. Custom refills whose buffer type wraps a raw pointer (e.g. `NonNull`) must assert `unsafe impl Send` on that type. +- Updated the `columnar` dependency to 0.13. +- Hoisted the per-update rebuild check out of `MutableAntichain::update_iter` into a `requires_rebuild` helper generic only over the timestamp, reducing monomorphization sprawl (~1600 fewer LLVM lines on the `event_driven` example). ([#797](https://github.com/TimelyDataflow/timely-dataflow/pull/797)) ## [0.29.0](https://github.com/TimelyDataflow/timely-dataflow/compare/timely-v0.28.1...timely-v0.29.0) - 2026-04-13 diff --git a/Cargo.toml b/Cargo.toml index bbe363ff6..d1b3a49f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ edition = "2021" rust-version = "1.86" [workspace.dependencies] -columnar = "0.12" +columnar = "0.13" [workspace.lints.clippy] type_complexity = "allow" diff --git a/bytes/Cargo.toml b/bytes/Cargo.toml index dac382ae7..e22004c7f 100644 --- a/bytes/Cargo.toml +++ b/bytes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_bytes" -version = "0.29.0" +version = "0.30.0" authors = ["Frank McSherry "] edition.workspace = true rust-version.workspace = true diff --git a/communication/Cargo.toml b/communication/Cargo.toml index aded24255..8d803a46e 100644 --- a/communication/Cargo.toml +++ b/communication/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_communication" -version = "0.29.0" +version = "0.30.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.29" } -timely_container = { path = "../container", version = "0.29.0" } -timely_logging = { path = "../logging", version = "0.29" } +timely_bytes = { path = "../bytes", version = "0.30" } +timely_container = { path = "../container", version = "0.30.0" } +timely_logging = { path = "../logging", version = "0.30" } [dev-dependencies] tempfile = "3" diff --git a/container/Cargo.toml b/container/Cargo.toml index e039b5d04..c5bd12b75 100644 --- a/container/Cargo.toml +++ b/container/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_container" -version = "0.29.0" +version = "0.30.0" description = "Container abstractions for Timely" license = "MIT" edition.workspace = true diff --git a/logging/Cargo.toml b/logging/Cargo.toml index 667b28e34..b10414e63 100644 --- a/logging/Cargo.toml +++ b/logging/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timely_logging" -version = "0.29.0" +version = "0.30.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.29.0", path = "../container" } +timely_container = { version = "0.30.0", path = "../container" } diff --git a/timely/Cargo.toml b/timely/Cargo.toml index a0d08756b..4f8cf81f8 100644 --- a/timely/Cargo.toml +++ b/timely/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "timely" -version = "0.29.0" +version = "0.30.0" authors = ["Frank McSherry "] readme = "../README.md" edition.workspace = true @@ -30,10 +30,10 @@ bincode = { version = "1.3" } byteorder = "1.5" itertools = "0.14.0" serde = { version = "1.0", features = ["derive"] } -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" } +timely_bytes = { path = "../bytes", version = "0.30" } +timely_logging = { path = "../logging", version = "0.30" } +timely_communication = { path = "../communication", version = "0.30", default-features = false } +timely_container = { path = "../container", version = "0.30" } smallvec = { version = "1.15.1", features = ["serde", "const_generics"] } [dev-dependencies]