From d164f320be094e2348260785386fff0e756d0ec9 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 9 Nov 2024 17:24:51 -0500 Subject: sequencer pseudocode --- doc/sequencer.pseudo | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 doc/sequencer.pseudo (limited to 'doc/sequencer.pseudo') 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++ + } +} -- cgit v1.2.3