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
17 changes: 14 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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::<CapacityContainerBuilder<_>>::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<dyn DerefMut<Target=[u8]> + Send>` rather than `Box<dyn DerefMut<Target=[u8]>>`. 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::<CapacityContainerBuilder<_>>::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<dyn DerefMut<Target=[u8]> + Send>` rather than `Box<dyn DerefMut<Target=[u8]>>`. 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

Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ edition = "2021"
rust-version = "1.86"

[workspace.dependencies]
columnar = "0.12"
columnar = "0.13"

[workspace.lints.clippy]
type_complexity = "allow"
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.29.0"
version = "0.30.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.29.0"
version = "0.30.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.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"
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.29.0"
version = "0.30.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.29.0"
version = "0.30.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.29.0", path = "../container" }
timely_container = { version = "0.30.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.29.0"
version = "0.30.0"
authors = ["Frank McSherry <fmcsherry@me.com>"]
readme = "../README.md"
edition.workspace = true
Expand Down Expand Up @@ -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]
Expand Down
Loading