diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-09 17:24:51 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-09 17:24:51 -0500 |
| commit | d164f320be094e2348260785386fff0e756d0ec9 (patch) | |
| tree | 196df51e8c84c3a411fc1e111c8ad25ebbcef795 /doc/sequencer.pseudo | |
| parent | a858f1a09637a8d4a11c48970e7325574cc75fa9 (diff) | |
| download | soen423-d164f320be094e2348260785386fff0e756d0ec9.zip | |
sequencer pseudocode
Diffstat (limited to 'doc/sequencer.pseudo')
| -rw-r--r-- | doc/sequencer.pseudo | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/doc/sequencer.pseudo b/doc/sequencer.pseudo new file mode 100644 index 0000000..f511eee --- /dev/null +++ b/doc/sequencer.pseudo @@ -0,0 +1,47 @@ +// Sequencer based on "Distributed Systems: Concepts and Design" 5e, Coulouris et +// al. (2012) pp. 654-655. Depends on reliable multicast, implemented here as the +// Trans protocol. + +type dataMsg struct { + id int + data +} + +type orderMsg struct { + id int + seq int +} + +class groupMember { + seq := 0 + holdback := new Queue[dataMsg] + deliver := new Queue[dataMsg] + rMulticast := new Trans + + multicast(m dataMsg) { + rMulticast.send(m) + } + + on rMulticast.recv(m dataMsg) { + holdback.enqueue(m) + } + + on rMulticast.recv(m orderMsg) { + wait until m.id in holdback && seq == m.seq + data := delete(m.id, holdback) + deliver.enqueue(data) + seq++ + } +} + +// Sequencer is also a member of the multicast group. +class sequencer { + seq := 0 + rMulticast := new Trans + + on rMulticast.recv(m dataMsg) { + order := orderMsg{m.id, seq} + rMulticast.send(order) + seq++ + } +} |