Пример #1
0
        public override Task <LockResponse> lockServer(LockRequest request, ServerCallContext context)
        {
            Console.WriteLine("Locking the server to write" +
                              request.ObjectId + " in partition " +
                              request.PartitionId
                              );

            try {
                var partitionId = request.PartitionId;
                var objectId    = request.ObjectId;
                var partition   = _storage.Partitions[partitionId];

                BaseServerObjectInfo objectInfo;
                lock (partition.Objects) {
                    if (!partition.Objects.TryGetValue(objectId, out objectInfo))
                    {
                        partition.Objects.Add(objectId, objectInfo = new BaseServerObjectInfo("NA"));
                    }
                }

                objectInfo._lock.Set(); //unlock is called inside partition write slave
            }
            catch (Exception e) {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                return(Task.FromResult(new LockResponse {
                    Acknowledge = "NOK"
                }));
            }

            return(Task.FromResult(new LockResponse {
                Acknowledge = "Ok"
            }));
        }
    public void WriteMaster(string objKey, string objValue)
    {
        var lockRequest = new LockRequest()
        {
            PartitionId = _id,
            ObjectId    = objKey
        };
        var unlockRequest = new UnlockRequest {
            PartitionId = _id,
            ObjectId    = objKey,
            ObjectValue = objValue
        };
        //Very important - order slaves

        IEnumerable <SlaveInfo> orderedSlaves = SlaveServers.OrderBy(s => s.ServerId);

        BaseServerObjectInfo objectInfo;

        lock (Objects) {
            if (!Objects.TryGetValue(objKey, out objectInfo))
            {
                Objects.Add(objKey, objectInfo = new BaseServerObjectInfo("NA"));
            }
        }

        objectInfo._lock.Set();
        objectInfo.Write(objValue);

        foreach (var slave in orderedSlaves)
        {
            try {
                slave.SlaveChannel.lockServer(lockRequest);
            }
            catch (Exception) {
                Console.WriteLine($"Error locking partition {_id} slave {slave.ServerId}");
            }
        }

        foreach (var slave in orderedSlaves)
        {
            try {
                slave.SlaveChannel.unlockServer(unlockRequest);
            }
            catch (Exception) {
                Console.WriteLine($"Error unlocking partition {_id} slave {slave.ServerId}");
            }
        }

        objectInfo._lock.Reset();
    }