Skip to content

Feedback drops empty-stamped messages; stamp deserialization sorts - #823

Merged
frankmcsherry merged 1 commit into
TimelyDataflow:masterfrom
frankmcsherry:stamp-cleanups
Oct 16, 2026
Merged

frankmcsherry merged 1 commit into
TimelyDataflow:masterfrom
frankmcsherry:stamp-cleanups

Conversation

@frankmcsherry

Copy link
Copy Markdown
Member

Addresses the timely items from Materialize's report on the differential master-next port.

Changes

  • The feedback edge drops a message whose advanced stamp is empty.
    This now includes messages that arrive with empty stamps, which were previously forwarded and could circulate a loop unseen by progress tracking.
  • The feedback docs and comment now say that the edge maps capabilities and does not inspect contents.
    Advancing times carried by contents, and discarding those that cannot advance, is the container's job (as differential's ResultsIn does before connect_loop).
    The previous comment claimed that contents supported only by discarded stamp elements were not sent, which the code did not do.
  • Deserializing a Stamp sorts its elements, as the bytes need not come from a valid Stamp.
    This adds a T: Ord bound to Stamp's Deserialize, Event's Deserialize, Message's Bytesable, and EventReader's EventIterator.
  • The Event::Messages doc no longer calls the stamp an antichain.
  • Stamp's doc notes that equality compares multisets: {a} and {a, a} differ.

Not included

  • A borrowing accessor for capability times: CapabilitySet derefs to [Capability<T>], so caps.iter().map(|c| c.time()) already borrows.
  • A lattice meet over a capability set: timely has no lattice concept, so this belongs in differential.
  • A release-mode check of output capability validity.
  • The same sorting guard for the Columnar derive on Stamp.

Tests

  • progress::stamp::tests::deserialize_sorts
  • tests/stamps.rs::zero_capability_stamps_feedback, which fails on the previous behavior.

🤖 Generated with Claude Code

The feedback edge now drops a message whose advanced stamp is empty, including messages that arrive with empty stamps.
Previously those were forwarded, and could circulate a loop unseen by progress tracking.
The docs and comment now say that the edge maps capabilities only, and that advancing times carried by contents is the container's job.

Deserializing a `Stamp` sorts its elements, as the bytes need not come from a valid `Stamp`.
This adds a `T: Ord` bound where stamps are deserialized.

Also corrects the `Event::Messages` doc, which called the stamp an antichain, and notes that `Stamp` equality compares multisets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@antiguru antiguru left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks!

@frankmcsherry
frankmcsherry merged commit 3012f8f into TimelyDataflow:master Oct 16, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants