summaryrefslogtreecommitdiffstats
path: root/src/main/java/derms/net/tomulticast/TotalOrderMulticast.java
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-16 15:54:22 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-16 15:54:22 -0500
commit35c2f2a917de223c658ecc594719edd09bead7cc (patch)
tree6568546cf457758dca4fee06a391f7f43130d835 /src/main/java/derms/net/tomulticast/TotalOrderMulticast.java
parent05c4e2b5770133228daff7c262945f078a4e4456 (diff)
downloadsoen423-35c2f2a917de223c658ecc594719edd09bead7cc.zip
TotalOrderMulticastSender
Diffstat (limited to 'src/main/java/derms/net/tomulticast/TotalOrderMulticast.java')
-rw-r--r--src/main/java/derms/net/tomulticast/TotalOrderMulticast.java53
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;
+ }
+ }
+}