Ejemplo n.º 1
0
        public void Write(string key, string value)
        {
            writtenKeys.AddOrUpdate(key, true, (k, v) => true);
            kvs.AcquireWriteLock(key, TransactionId);
            foreach (var siReadTransaction in kvs.GetTransactionsHoldingSiReadLocks(key))
            {
                if (siReadTransaction == TransactionId)
                {
                    continue;
                }

                AcquireAndExecureTransactionBlob(siReadTransaction, siTransactionBlob =>
                {
                    var siTransactionDescriptor = GetTransactionDescriptor(siTransactionBlob, null);
                    var siTransactionIsRunning  = (siTransactionDescriptor.Status == TransactionStatus.Running);
                    TransactionDescriptor currentTransactionDescriptor = null;

                    AcquireAndExecureTransactionBlob(TransactionId, currentTransactionBlob =>
                    {
                        currentTransactionDescriptor = GetTransactionDescriptor(currentTransactionBlob, null);
                        if (siTransactionIsRunning ||
                            siTransactionBlob.Properties.LastModified > currentTransactionBlob.Properties.Created)
                        {
                            if (siTransactionDescriptor.Status == TransactionStatus.CompletedWithSuccess &&
                                siTransactionDescriptor.InConflict)
                            {
                                currentTransactionDescriptor.InConflict  = true;
                                currentTransactionDescriptor.OutConflict = true;
                                SetTransactionDescriptor(currentTransactionBlob, currentTransactionDescriptor);
                            }
                            else
                            {
                                siTransactionDescriptor.OutConflict     = true;
                                currentTransactionDescriptor.InConflict = true;
                                SetTransactionDescriptor(currentTransactionBlob, currentTransactionDescriptor);
                                SetTransactionDescriptor(siTransactionBlob, siTransactionDescriptor);
                            }
                        }
                    });
                });
            }

            ulong version    = 0;
            ulong newVersion = 0;

            if (keyVersions.TryGetValue(key, out version))
            {
                newVersion = kvs.Update(key, value, version, TransactionId);
            }
            else
            {
                newVersion = kvs.Create(key, value, TransactionId);
            }

            keyVersions.AddOrUpdate(key, newVersion, (k, v) => newVersion);
        }
Ejemplo n.º 2
0
        public void Begin_Tran_With_Name_And_Distribution(string sql, string name, TransactionDescriptor descriptor, bool distributed)
        {
            // Exercise
            BeginTransactionStatement statement = ParserFactory.Execute <BeginTransactionStatement>(sql).First();

            // Verify outcome
            Assert.IsNotNull(statement);
            Assert.AreEqual(name, statement.Name);
            Assert.AreEqual(descriptor, statement.Descriptor);
            Assert.AreEqual(distributed, statement.Distributed);
        }
Ejemplo n.º 3
0
        public void Begin_Tran_With_Name_And_Distribution( string sql, string name, TransactionDescriptor descriptor, bool distributed )
        {
            // Exercise
            BeginTransactionStatement statement = ParserFactory.Execute<BeginTransactionStatement>( sql ).First();

            // Verify outcome
            Assert.IsNotNull( statement );
            Assert.AreEqual( name, statement.Name );
            Assert.AreEqual(descriptor, statement.Descriptor );
            Assert.AreEqual( distributed, statement.Distributed );
        }
Ejemplo n.º 4
0
        public TransactionDescriptor GetTransactionDescriptor(CloudBlockBlob transactionBlob, TransactionDescriptor defaultDescriptor)
        {
            transactionBlob.FetchAttributes();
            if (transactionBlob.Metadata.ContainsKey("TransactionDescriptor"))
            {
                return(JsonConvert.DeserializeObject <TransactionDescriptor>(transactionBlob.Metadata["TransactionDescriptor"]));
            }

            return(defaultDescriptor);
        }
Ejemplo n.º 5
0
 public void SetTransactionDescriptor(CloudBlockBlob transactionBlob, TransactionDescriptor transactionDescriptor)
 {
     //transactionBlob.UploadText(JsonConvert.SerializeObject(transactionDescriptor));
     transactionBlob.Metadata["TransactionDescriptor"] = JsonConvert.SerializeObject(transactionDescriptor);
 }