private void OnBroadcastWriteDeliver(BroadcastWriteArguments arguments) { if (partitionHandlers.TryGetValue( arguments.PartitionId, out PartitionReliableBroadcastHandler handler)) { handler.OnBroadcastWriteDeliver(arguments); } }
private BroadcastWriteMessage BuildWriteMessage(BroadcastWriteArguments arguments) { return(new BroadcastWriteMessage { PartitionId = arguments.PartitionId, Key = arguments.Key, Value = arguments.Value, WriteServerId = arguments.WriteServerId, ReplicaTimestamp = arguments.ReplicaTimestamp }); }
public void OnBroadcastWriteDeliver(BroadcastWriteArguments arguments) { lock (this) { // Add ack MessageId messageId = arguments.MessageId; writesAcks.AddOrUpdate(messageId, 1, (key, prev) => prev + 1); // Broadcast if necessary if (!receivedWrites.ContainsKey(arguments.MessageId)) { receivedWrites.TryAdd(messageId, BuildWriteMessage(arguments)); // Other server received the request from client // Broadcast and wait BroadcastWrite( arguments.MessageId, arguments.Key, arguments.Value, arguments.ReplicaTimestamp, arguments.WriteServerId); receivedWrites.TryGetValue(arguments.MessageId, out BroadcastWriteMessage message); } // Check if can deliver if (writesAcks.TryGetValue(messageId, out int numAcks) && numAcks == 2) { if (messageId.SenderId == selfId) { Monitor.PulseAll(this); } else { writeMessageHandler(BuildWriteMessage(arguments)); } } } }