Skip to content

Releases: TimelyDataflow/timely-dataflow

timely_logging-v0.30.0

29 May 20:46
75e73f3

Choose a tag to compare

chore: Release package timely_logging version 0.30.0

timely_container-v0.30.0

29 May 20:46
75e73f3

Choose a tag to compare

chore: Release package timely_container version 0.30.0

timely_communication-v0.30.0

29 May 20:46
75e73f3

Choose a tag to compare

chore: Release package timely_communication version 0.30.0

timely_bytes-v0.30.0

29 May 20:46
75e73f3

Choose a tag to compare

chore: Release package timely_bytes version 0.30.0

timely-v0.30.0

29 May 20:46
75e73f3

Choose a tag to compare

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

  • 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)
  • 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)

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, #791)
  • logging::Registry::names iterates the names of the currently bound loggers. (#795)

Other

  • 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)

timely_logging-v0.29.0

13 Apr 20:52
866d5c3

Choose a tag to compare

chore: Release package timely_logging version 0.29.0

timely_container-v0.29.0

13 Apr 20:52
866d5c3

Choose a tag to compare

chore: Release package timely_container version 0.29.0

timely_communication-v0.29.0

13 Apr 20:52
866d5c3

Choose a tag to compare

chore: Release package timely_communication version 0.29.0

timely_bytes-v0.29.0

13 Apr 20:52
866d5c3

Choose a tag to compare

chore: Release package timely_bytes version 0.29.0

timely-v0.29.0

13 Apr 20:53
866d5c3

Choose a tag to compare

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:

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)
  • Remove Allocate trait; replace with Allocator. (#778)
  • Checks for WASM compatibility (#777)