public override Task <lockReply> LockObject(lockRequest request, ServerCallContext context)
 {
     lock (this)
     {
         this.current_key = new DataStoreKey(request.PartitionId, request.ObjectId);
         Partition p = server.getPartition(request.PartitionId);
         p.lockObject(current_key, true);
     }
     return(Task.FromResult(new lockReply()));
 }
        public override Task <NewValueReply> WriteNewValue(NewValueRequest request, ServerCallContext context)
        {
            Partition      partition = server.getPartition(current_key.partition_id);
            DataStoreValue value     = new DataStoreValue();

            value.val = request.Val;
            partition.addNewOrUpdateExisting(current_key, value);
            partition.lockObject(current_key, false);
            return(Task.FromResult(new NewValueReply
            {
                Ok = true
            }));
        }
        public void doWork()
        {
            Partition partition = server.getPartition(request.ObjectKey.PartitionId);
            Dictionary <string, ServerCommunicationService.ServerCommunicationServiceClient> PartitionReplicas = partition.getReplicas();

            atomicWriteLocallyAndUpdateClock(partition);

            int clock = partition.getClock();

            Console.WriteLine(">>> PartitionClock=" + clock);
            Console.WriteLine(">>> Start Updating value and clock on replicas...");
            WriteReply reply = write_new_value_replicas(PartitionReplicas, request, clock);

            server.setWriteResult(request, reply);
        }
        public ReadReply ReadHandler(ReadRequest request)
        {
            Partition partition      = server.getPartition(request.ObjectKey.PartitionId);
            int       partitionClock = partition.getClock();

            Console.WriteLine(">>> PartitionName=" + request.ObjectKey.PartitionId + ", PartitionClock=" + partitionClock);
            ReadReply reply;

            try
            {
                DataStoreValue value = partition.getData(new DataStoreKey(request.ObjectKey.PartitionId, request.ObjectKey.ObjectId));
                reply = new ReadReply
                {
                    Object = new DataStoreValueDto {
                        Val = value.val
                    },
                    ObjectExists   = true,
                    PartitionClock = partitionClock
                };
            }
            catch (Exception)
            {
                reply = new ReadReply
                {
                    Object = new DataStoreValueDto {
                        Val = "NA"
                    },
                    ObjectExists   = false,
                    PartitionClock = partitionClock
                };
            }

            return(reply);
        }
        public ReadReply ReadHandler(ReadRequest request)
        {
            Partition partition = server.getPartition(request.ObjectKey.PartitionId);
            ReadReply reply     = null;

            try
            {
                DataStoreValue value = partition.getData(new DataStoreKey(request.ObjectKey.PartitionId, request.ObjectKey.ObjectId));
                reply = new ReadReply
                {
                    Object = new DataStoreValueDto {
                        Val = value.val
                    },
                    ObjectExists = true
                };
            }
            catch (Exception)
            {
                reply = new ReadReply
                {
                    Object = new DataStoreValueDto {
                        Val = "NA"
                    },
                    ObjectExists = false
                };
            }

            return(reply);
        }
        public void doWork()
        {
            Partition partition = server.getPartition(request.ObjectKey.PartitionId);
            Dictionary <string, ServerCommunicationService.ServerCommunicationServiceClient> PartitionReplicas = partition.getReplicas();

            lockReplicas(PartitionReplicas, this.request.ObjectKey);
            write_new_value_locally(partition, request);
            WriteReply reply = write_new_value_replicas(PartitionReplicas, request);

            server.setWriteResult(request, reply);
        }