示例#1
0
 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));
                    }
                }
            }
        }