summaryrefslogtreecommitdiffstats
path: root/doc/sequencer.pseudo
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sequencer.pseudo')
-rw-r--r--doc/sequencer.pseudo47
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++
+ }
+}