summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-14 11:22:15 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-14 11:22:15 -0500
commit38077cf6f25cb345092638fadcc3afce82898936 (patch)
tree280dad7f9285bf8c4e376780702e4bb1f071e77a /doc
parent731b77c150b438faeedff5cf5fc63697444ca8dc (diff)
downloadsoen423-38077cf6f25cb345092638fadcc3afce82898936.zip
total-order multicast pseudocode
Diffstat (limited to 'doc')
-rw-r--r--doc/sequencer.pseudo47
-rw-r--r--doc/tomulticast.pseudo35
2 files changed, 35 insertions, 47 deletions
diff --git a/doc/sequencer.pseudo b/doc/sequencer.pseudo
deleted file mode 100644
index f511eee..0000000
--- a/doc/sequencer.pseudo
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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++
- }
-}
diff --git a/doc/tomulticast.pseudo b/doc/tomulticast.pseudo
new file mode 100644
index 0000000..332ba32
--- /dev/null
+++ b/doc/tomulticast.pseudo
@@ -0,0 +1,35 @@
+type message struct {
+ seq int
+ payload
+}
+
+class sequencer {
+ var seq = 0
+
+ // Receive a request from the FE.
+ // Attach sequence number and multicast to RMs.
+ on rUnicastReceive(payload) {
+ rMulticastSend(message{seq, payload})
+ seq++
+ }
+}
+
+class receiver {
+ var seq = 0
+ var holdback Queue[message]
+
+ // Receive from sequencer.
+ on rMulticastReceive(m message) {
+ append(holdback, m)
+ trydeliver()
+ }
+
+ trydeliver() {
+ if t.e. m in holdback s.t. m.seq == seq+1 {
+ remove(m, holdback)
+ deliver(m)
+ seq++
+ trydeliver()
+ }
+ }
+}