diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-16 15:54:22 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-16 15:54:22 -0500 |
| commit | 35c2f2a917de223c658ecc594719edd09bead7cc (patch) | |
| tree | 6568546cf457758dca4fee06a391f7f43130d835 /src/main/java/derms/net/tomulticast/TotalOrderMulticast.java | |
| parent | 05c4e2b5770133228daff7c262945f078a4e4456 (diff) | |
| download | soen423-35c2f2a917de223c658ecc594719edd09bead7cc.zip | |
TotalOrderMulticastSender
Diffstat (limited to 'src/main/java/derms/net/tomulticast/TotalOrderMulticast.java')
| -rw-r--r-- | src/main/java/derms/net/tomulticast/TotalOrderMulticast.java | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/main/java/derms/net/tomulticast/TotalOrderMulticast.java b/src/main/java/derms/net/tomulticast/TotalOrderMulticast.java new file mode 100644 index 0000000..d83a34d --- /dev/null +++ b/src/main/java/derms/net/tomulticast/TotalOrderMulticast.java @@ -0,0 +1,53 @@ +package derms.net.tomulticast; + +import derms.net.rmulticast.MessagePayload; +import derms.net.rmulticast.ReliableMulticast; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.logging.Logger; + +/** + * <p>A single-sender, multiple-receiver multicast group that enforces a total order on + * received messages. If a process delivers message <i>A</i> before message <i>B</i>, + * then all other processes will deliver <i>A</i> and <i>B</i> in the same order + * (<i>A</i> before <i>B</i>).</p> + * + * <p>Additionally, the protocol guarantees reliable delivery of messages. If the sender + * crashes while sending a message, either all processes will receive the message, or + * none of them will.</p> + * + * <p><b>Only one sender is allowed per multicast group</b>, but a group may have multiple + * receivers. Use {@link derms.net.tomulticast.TotalOrderMulticastSender} to send + * messages, and {@link derms.net.tomulticast.TotalOrderMulticastReceiver} to receive + * them.</p> + */ +public abstract class TotalOrderMulticast<T extends MessagePayload> { + final ReliableMulticast<Message<T>> sock; + protected final InetSocketAddress group; + protected Long seq; // Sequence number. + protected final Logger log; + + protected TotalOrderMulticast(InetSocketAddress group, InetAddress laddr) throws IOException { + this.sock = new ReliableMulticast<Message<T>>(group, laddr); + this.group = group; + this.seq = (long) 0; + this.log = Logger.getLogger(this.getClass().getName()); + } + + /** Close the underlying socket. */ + public void close() { + sock.close(); + } + + /** Increment the sequence number. */ + protected void incSeq() { + if (seq < seq.MAX_VALUE) { + seq++; + } else { + log.warning("Sequence number overflow. Wrapping to 0."); + seq = (long) 0; + } + } +} |