Releases: TimelyDataflow/timely-dataflow
timely_logging-v0.30.0
chore: Release package timely_logging version 0.30.0
timely_container-v0.30.0
chore: Release package timely_container version 0.30.0
timely_communication-v0.30.0
chore: Release package timely_communication version 0.30.0
timely_bytes-v0.30.0
chore: Release package timely_bytes version 0.30.0
timely-v0.30.0
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
Bytesis nowSync, and byte buffers must beSend.timely_bytes::arc::Bytesnow implementsSyncin addition toSend. To make both impls sound,BytesMut::fromnow requires its payload to beSend. This is a breaking change totimely_communication:BytesRefill::logicnow producesBox<dyn DerefMut<Target=[u8]> + Send>rather thanBox<dyn DerefMut<Target=[u8]>>. Custom refills whose buffer type wraps a raw pointer (e.g.NonNull) must assertunsafe impl Sendon that type. (#800)ToStreamBuilderexposes the item type via theItemassociated 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 formToStreamBuilder::<CapacityContainerBuilder<_>>::to_stream_with_builder(0..3, scope). (#792)
Added
- Spill-to-disk for the zero-copy allocator (
timely_communication). A newallocator::zero_copy::spillmodule lets aMergeQueueshed resident bytes under memory pressure. It composes three pluggable traits:SpillPolicy(whether and how to reshape a queue on eachextend),BytesSpill(where spilled bytes go — file, object store, mock, …), andBytesFetch(reads them back). The shippedthreshold::Thresholdpolicy spills the middle of a queue once resident bytes exceed configurable threshold/reserve/budget knobs. It is opt-in via thespillhook on the communication configuration and defaults toNone, so existing deployments are unaffected. See thespill_stressandspill_compareexamples. (#789, #791) logging::Registry::namesiterates the names of the currently bound loggers. (#795)
Other
- Updated the
columnardependency to 0.13. - Hoisted the per-update rebuild check out of
MutableAntichain::update_iterinto arequires_rebuildhelper generic only over the timestamp, reducing monomorphization sprawl (~1600 fewer LLVM lines on theevent_drivenexample). (#797)
timely_logging-v0.29.0
chore: Release package timely_logging version 0.29.0
timely_container-v0.29.0
chore: Release package timely_container version 0.29.0
timely_communication-v0.29.0
chore: Release package timely_communication version 0.29.0
timely_bytes-v0.29.0
chore: Release package timely_bytes version 0.29.0
timely-v0.29.0
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.
Scopeis a concrete type, not a trait. TheChildtype is gone. Where you previously had a generic parameterG: ScopeorG: Scope<Timestamp = T>, you now useScope<'scope, T>directly. This means replacing a type-level generic with a lifetime and a concrete timestamp type — you may need to introduce'scopeandT: Timestampwhere they weren't needed before, and removeGfrom your generic parameter lists.ScopeimplementsCopy. It is passed by value to dataflow closures and operator constructors. TheFnOnce(&Scope<T>)pattern becomesFnOnce(Scope<T>).AsWorkerandSchedulertraits are removed. Their methods are now inherent onWorker. Access the worker from a scope viascope.worker().- All
Scopemethods take&self, not&mut self. Extension traits that took&mut selfonScope(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> |