summaryrefslogtreecommitdiffstats
path: root/doc/sequencer.pseudo
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-09 17:24:51 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-09 17:24:51 -0500
commitd164f320be094e2348260785386fff0e756d0ec9 (patch)
tree196df51e8c84c3a411fc1e111c8ad25ebbcef795 /doc/sequencer.pseudo
parenta858f1a09637a8d4a11c48970e7325574cc75fa9 (diff)
downloadsoen423-d164f320be094e2348260785386fff0e756d0ec9.zip
sequencer pseudocode
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++
+ }
+}