Skip to main content

Causality from event edges

What this concept is​

The event graph connects consecutive events on each process and each send to its matching receive. Reachability defines happened-before; two distinct events are concurrent if neither can reach the other. The input list is a convenient processing order, not an extra communication channel.

Why it matters here​

A global trace often interleaves unrelated processes. Treating adjacent trace entries as causal edges manufactures dependencies. Before assigning clocks, draw the graph and state what observations it actually includes.

Concrete example​

Process A sends m, then performs local event b. Process B performs local event c, then receives m at d. Send precedes both b and d, and c precedes d. There is no path from b to d or d to b. Moving c before the send in the input list preserves this graph as long as local and message orders remain intact.

Common confusion / misconception​

Earlier in a file is not necessarily happened-before. Concurrent does not mean events occurred at precisely the same physical instant. It means this event graph contains no causal path between them.

How to use it​

Write process lanes, link local successors and match message IDs. Compute ancestors with a graph method before looking at clock output. Reject duplicate event IDs and receives with no earlier matching send. For this lab, a send has at most one receive and must cross processes; multicast and repeated delivery need another contract.

Check yourself​

Does an undelivered send create an edge on another process? Why can two valid topological enumerations describe the same computation?

Mini drill or application​

Draw the four-event example and classify every pair. Add a second message from B after d to A, then identify exactly which new paths appear.

Read this only if stuck​

Use Distributed Systems: Concepts and Design on logical time and Lamport’s original paper on partial ordering. Read the event-relation definition, then reconstruct your own graph.