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(); }