コード例 #1
0
        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);
        }
コード例 #2
0
        public void write_new_value_locally(Partition partition, WriteRequest request)
        {
            DataStoreKey   key   = Utilities.ConvertKeyDtoToDomain(request.ObjectKey);
            DataStoreValue value = Utilities.ConvertValueDtoToDomain(request.Object);

            partition.addNewOrUpdateExisting(key, value);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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
            }));
        }
コード例 #5
0
 private Task <IEnumerable <DataStoreValue> > Query(string query, object args = null)
 {
     return(RawQuery <DataStoreValue>(query, args, (reader) =>
     {
         var row = new DataStoreValue();
         for (int i = 0; i < reader.FieldCount; i++)
         {
             var column = reader.GetName(i);
             if (column == "rowid")
             {
                 row.Id = reader.GetInt32(i);
             }
             else if (column == "key")
             {
                 row.Key = reader.GetString(i);
             }
             else if (column == "value")
             {
                 row.Value = reader.GetString(i);
             }
         }
         return row;
     }));
 }
コード例 #6
0
        public void atomicWriteLocallyAndUpdateClock(Partition partition)
        {
            try
            {
                Monitor.Enter(atomic_lock);

                // Logs data
                int            incrementedClock = partition.incrementClock();
                DataStoreValue value            = Utilities.ConvertValueDtoToDomain(request.Object);
                // ---------------

                write_new_value_locally(partition, request);
                Console.WriteLine(">>> Master: Atomic operation Update<clock, value> = <" + incrementedClock + "," + value.val + ">");
            }
            catch
            {
                Console.WriteLine(">>> Exception occured during atomic write");
            }

            finally
            {
                Monitor.Exit(atomic_lock);
            }
        }
コード例 #7
0
 public void AtomicWriteAndUpdateClock(NewValueRequest request, Partition partition, DataStoreValue value)
 {
     try
     {
         // the server shouldn't respond to client queries during this atomic operation
         Monitor.Enter(atomic_lock);
         Console.WriteLine(">>> Replica: Atomic operation Update<Value, Clock> = <" + value.val + "," + request.Clock + ">");
         partition.addNewOrUpdateExisting(current_key, value);
         partition.setClock(request.Clock);
     }
     catch
     {
         Console.WriteLine(">>> Exception occured during atomic write");
     }
     finally
     {
         Monitor.Exit(atomic_lock);
     }
 }