Skip to content

Commit d8fd207

Browse files
committed
prep 0.8.0 release
1 parent c51f7b8 commit d8fd207

File tree

4 files changed

+30
-43
lines changed

4 files changed

+30
-43
lines changed

CHANGELOG.md

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
11
# Changelog
2+
23
All notable changes to this project will be documented in this file.
34

45
## Unreleased
5-
- Many logging events have been rationalized. Operators and Channels should all have a worker-unique identifier that can be used to connect their metadata with events involving them. Previously this was a bit of a shambles.
66

7-
- The `Scope` method `scoped` now allows supports new scopes with non-`Product` timestamps. Instead, the new timestamp must implement `Refines<_>` of the parent timestamp. This is the case for `Product` timestamps, but each timestamp also refines itself (allowing logical regions w/o changing the timestamp), and other timestamp combinators (e.g. Lexicographic) can be used.
7+
## 0.8.0
88

9-
- Timestamps no longer need to be `Product<RootTimestamp,_>`. Instead, the `_` can be used as the timestamp. The exception here is that the creation of loop variables requires a `Product<_,_>` structured timestamp, and so as much as you might like to have a scope with a `usize` timestamp and a loop, and you *should* be able to, you cannot yet without making the type `Product<(), usize>`.
9+
This release made several breaking modifications to the types associated with scopes, and in particular the generic parameters for the `Child<'a, G: ScopeParent, T: Timestamp>` type. Where previously the `T` parameter would be the *new coordinate* to add to `G`'s timestamp, it is now the *new timestamp* including `G`'s timestamp as well. This was done to support a broader class of timestamps to be used, beyond always requiring product combinations with new timestamps.
1010

11-
- The `RootTimestamp` and `RootSummary` types have been excised. Where you previously used `Product<RootTimestamp,T>` you can now use `Product<(),T>`, or even better just `T`. The requirement of a worker's `dataflow()` method is that the timestamp type implement `Refines<()>`, which .. ideally would be true for all timestamps but we can't have a blanket implementation until specialization lands (I believe).
11+
Beneficial fallouts include our ability to remove `RootTimestamp`, as dataflows can now be timestamped by `usize` or other primitive timestamps. Yay!
12+
13+
### Added
1214

1315
- The communication crate now has a `bincode` feature flag which should swing serialization over to use serde's `Serialize` trait. While it seems to work the ergonomics are likely in flux, as the choice is crate-wide and doesn't allow you to pick and choose a la carte.
1416

15-
- The `loop_variable` operator now takes a timestamp summary for the timestamp of its scope, not just the timestamp extending its parent scope. The old behavior can be recovered with `Product::new(Default::default(), summary)`, but the change allows cycles in more general scopes and seemed worth it. The operator also no longer takes a `limit`, and if you need to impose a limit other than the summary returning `None` you should use the `branch_when()` operator.
17+
- Timestamps may now implement a new `Refines` trait which allows one to describe one timestamp as a refinement of another. This is mainly used to describe which timestamps may be used for subscopes of an outer scope. The trait describes how to move between the timestamps (informally: "adding a zero" and "removing the inner coordinate") and how to summarize path summaries for the refining timestamp as those of the refined timestamp.
18+
19+
### Changed
20+
21+
- Many logging events have been rationalized. Operators and Channels should all have a worker-unique identifier that can be used to connect their metadata with events involving them. Previously this was a bit of a shambles.
22+
23+
- The `Scope` method `scoped` now allows new scopes with non-`Product` timestamps. Instead, the new timestamp must implement `Refines<_>` of the parent timestamp. This is the case for `Product` timestamps, but each timestamp also refines itself (allowing logical regions w/o changing the timestamp), and other timestamp combinators (e.g. Lexicographic) can be used.
24+
25+
- Root dataflow timestamps no longer need to be `Product<RootTimestamp,_>`. Instead, the `_` can be used as the timestamp.
26+
27+
- The `loop_variable` operator now takes a timestamp summary for the timestamp of its scope, not just the timestamp extending its parent scope. The old behavior can be recovered with `Product::new(Default::default(), summary)`, but the change allows cycles in more general scopes and seemed worth it. The operator also no longer takes a `limit`, and if you need to impose a limit other than the summary returning `None` you should use the `branch_when` operator.
28+
29+
### Removed
30+
31+
- The `RootTimestamp` and `RootSummary` types have been excised. Where you previously used `Product<RootTimestamp,T>` you can now use `Product<(),T>`, or even better just `T`. The requirement of a worker's `dataflow()` method is that the timestamp type implement `Refines<()>`, which .. ideally would be true for all timestamps but we can't have a blanket implementation until specialization lands (I believe).
1632

33+
- Several race conditions were "removed" from the communication library. These mostly involved rapid construction of dataflows (data received before a channel was constructed would be dropped) and clean shutdown (a timely computation could drop and fail to ack clean shutdown messages).
1734

1835
## 0.7.0
1936

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
name = "timely"
4-
version = "0.7.0"
4+
version = "0.8.0"
55
authors = ["Frank McSherry <[email protected]>"]
66
readme = "README.md"
77

@@ -26,7 +26,7 @@ abomonation = "0.7"
2626
abomonation_derive = "0.3"
2727
timely_bytes = { path = "./bytes", version = "0.7" }
2828
timely_logging = { path = "./logging", version = "0.7" }
29-
timely_communication = { path = "./communication", version = "0.7" }
29+
timely_communication = { path = "./communication", version = "0.8" }
3030

3131
[dev-dependencies]
3232
timely_sort="0.1.6"

examples/realtime.rs renamed to examples/openloop.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ fn main() {
1515
let index = worker.index();
1616
let peers = worker.peers();
1717

18+
// re-synchronize all workers (account for start-up).
19+
timely::synchronization::Barrier::new(worker).wait();
20+
1821
let timer = std::time::Instant::now();
1922

2023
let mut input = InputHandle::new();
@@ -66,7 +69,7 @@ fn main() {
6669
//
6770
// 1. Wait until previous batch acknowledged.
6871
// 2. Tick at most once every millisecond-ish.
69-
// 3. Geometrically increasing outstanding batches.
72+
// 3. Geometrically increase outstanding batches.
7073

7174
// Technique 1:
7275
// let target_ns = if acknowledged_ns >= inserted_ns { elapsed_ns } else { inserted_ns };
@@ -78,6 +81,7 @@ fn main() {
7881
let scale = (inserted_ns - acknowledged_ns).next_power_of_two();
7982
let target_ns = elapsed_ns & !(scale - 1);
8083

84+
// Common for each technique.
8185
if inserted_ns < target_ns {
8286

8387
while ((insert_counter * ns_per_request) as u64) < target_ns {

src/progress/nested/reachability_neu.rs

+1-35
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
//! assert_eq!(results[2], ((Location::new_target(2, 0), 17), -1));
7373
//! ```
7474
75-
use std::collections::{BinaryHeap, HashMap, HashSet, VecDeque};
75+
use std::collections::{BinaryHeap, HashMap, VecDeque};
7676
use std::cmp::Reverse;
7777

7878
use progress::Timestamp;
@@ -249,8 +249,6 @@ pub struct Tracker<T:Timestamp> {
249249
/// Compiled summaries from each internal location (not scope inputs) to each scope output.
250250
// output_summaries: HashMap<Location, Vec<Antichain<T::Summary>>>,
251251
output_changes: Vec<ChangeBatch<T>>,
252-
253-
global_frontier: HashSet<(Location, T)>,
254252
}
255253

256254
struct PerOperator<T: Timestamp> {
@@ -378,7 +376,6 @@ impl<T:Timestamp> Tracker<T> {
378376
worklist: BinaryHeap::new(),
379377
pushed_changes: ChangeBatch::new(),
380378
output_changes,
381-
global_frontier: HashSet::new(),
382379
}
383380
}
384381

@@ -486,37 +483,6 @@ impl<T:Timestamp> Tracker<T> {
486483
&mut self.pushed_changes
487484
}
488485

489-
/// A reference to the minimal pointstamps in the scope.
490-
pub fn global(&self) -> &HashSet<(Location, T)> {
491-
492-
// A pointstamp (location, timestamp) is in the global frontier exactly when:
493-
//
494-
// 1. `self.pointstamps[location]` has count[timestamp] > 0.
495-
// 2. `self.implications[location]` has count[timestamp] == 1.
496-
//
497-
// Such a pointstamp would, if removed, cause a change to `self.implications`,
498-
// which is what we track for per operator input frontiers. If the above do not
499-
// hold, then its removal either 1. shouldn't be possible, or 2. will not affect
500-
// the output of `self.implications`.
501-
//
502-
// As we grind through changes to `self.implications` we *should* be able to
503-
// notice changes to the above properties. At least, we can notice as the counts
504-
// for `self.implications` changes to and from 1.
505-
506-
// There are some monotonicity properties we could perhaps exploit. A pointstamp
507-
// may have its `self.poinstamps` incremented to non-zero only when it is in
508-
// advance of its `self.implications`, it may then enter the global frontier
509-
// when this count goes to one, and it may then depart when its count goes to zero.
510-
// A pointstamp cannot return to the global frontier once departed.
511-
512-
// Alternately, perhaps, we could just have a slighly more complicated test for
513-
// "is in global frontier" where we just test these properties for stashed updates.
514-
// We might need to re-check for many (all?) stashed updates, unless we can track
515-
// which have potentially changed (which we can do, I think).
516-
517-
unimplemented!()
518-
}
519-
520486
/// Indicates if pointstamp is in the scope-wide frontier.
521487
///
522488
/// A pointstamp (location, timestamp) is in the global frontier exactly when:

0 commit comments

Comments
 (0)