diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-14 11:22:15 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-14 11:22:15 -0500 |
| commit | 38077cf6f25cb345092638fadcc3afce82898936 (patch) | |
| tree | 280dad7f9285bf8c4e376780702e4bb1f071e77a /doc | |
| parent | 731b77c150b438faeedff5cf5fc63697444ca8dc (diff) | |
| download | soen423-38077cf6f25cb345092638fadcc3afce82898936.zip | |
total-order multicast pseudocode
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/sequencer.pseudo | 47 | ||||
| -rw-r--r-- | doc/tomulticast.pseudo | 35 |
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() + } + } +} |