public void RTableRepairRow()
        {
            // Insert entity
            Assert.IsTrue(this.repTable.Exists(), "RTable does not exist");

            View fullView = configurationWrapper.GetWriteView();
            List <ReplicaInfo> fullViewReplicas = new List <ReplicaInfo>();

            for (int i = 0; i <= fullView.TailIndex; i++)
            {
                fullViewReplicas.Add(fullView.GetReplicaInfo(i));
            }

            List <ReplicaInfo> newReplicas = new List <ReplicaInfo>();

            for (int i = 1; i <= fullView.TailIndex; i++)
            {
                newReplicas.Add(fullView.GetReplicaInfo(i));
            }
            this.UpdateConfiguration(newReplicas, 0);
            Assert.IsTrue(configurationWrapper.IsViewStable());

            SampleRTableEntity newCustomer = new SampleRTableEntity("firstname1", "lastname1", "*****@*****.**");

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(configurationWrapper.GetWriteView().ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            ReadFromIndividualAccountsDirectly(newCustomer.PartitionKey, newCustomer.RowKey, true);

            //Add replica at head
            this.UpdateConfiguration(fullViewReplicas, 1);

            // repair row on the new head
            Console.WriteLine("Calling TableOperation.Replace(newCustomer)...");
            result = repTable.RepairRow(row.PartitionKey, row.RowKey, null);
            Assert.AreNotEqual(null, result, "result = null");

            // Retrieve Entity
            Console.WriteLine("Calling TableOperation.Retrieve<SampleRtableEntity>(firstName, lastName)...");
            operation = TableOperation.Retrieve <SampleRTableEntity>("firstname1", "lastname1");
            TableResult retrievedResult = repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode,
                            "retrievedResult.HttpStatusCode mismatch");

            ReadFromIndividualAccountsDirectly(newCustomer.PartitionKey, newCustomer.RowKey, true);
        }
Beispiel #2
0
        public void ExceptionWhenUsingSmallerViewId()
        {
            long currentViewId = 100;
            long badViewId     = currentViewId - 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName01";
            string lastName  = "LastName01";
            string email     = "*****@*****.**";
            string phone     = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);

            newCustomer.Email       = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call RefreshRTableEnvJsonConfigBlob to change the viewId of the wrapper to an older value
            //
            Console.WriteLine("Changing the viewId to badViewId {0}", badViewId);
            this.UpdateConfiguration(replicas, 0, false, badViewId);

            //
            // Retrieve with bad viewId
            //
            Console.WriteLine("\nCalling Retrieve with badViewId...");
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Retrieve() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Replace with bad viewId
            //
            Console.WriteLine("\nCalling Replace with badViewId...");
            operation = TableOperation.Replace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Replace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrMerge with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrMerge with badViewId...");
            operation = TableOperation.InsertOrMerge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrMerge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrReplace with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrReplace with badViewId...");
            operation = TableOperation.InsertOrReplace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrReplace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Merge with bad viewId
            //
            Console.WriteLine("\nCalling Merge with badViewId...");
            operation = TableOperation.Merge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Merge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Delete with bad viewId
            //
            Console.WriteLine("\nCalling Delete with badViewId...");
            operation = TableOperation.Delete(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Delete() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }
        }
Beispiel #3
0
        public void ReplaceUsingLargerViewId()
        {
            long currentViewId = 100;
            long futureViewId  = currentViewId + 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName02";
            string lastName  = "LastName02";
            string email     = "*****@*****.**";
            string phone     = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);

            newCustomer.Email       = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call ModifyConfigurationBlob to change the viewId of the wrapper to a larger value
            //
            Console.WriteLine("Changing the viewId to futureViewId {0}", futureViewId);
            this.UpdateConfiguration(replicas, 0, false, futureViewId);

            //
            // Replace entity
            //
            Console.WriteLine("\nCalling Replace with larger viewId...");
            email                = "*****@*****.**";
            phone                = "1-800-123-0002";
            customer.Email       = email;
            customer.PhoneNumber = phone;
            operation            = TableOperation.Replace(customer);
            result               = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");

            // Retrieve Entity
            Console.WriteLine("\nCalling Retrieve() with larger viewId...");
            operation       = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer2 = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("2", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer2._rtable_RowLock, "customer2._rtable_RowLock mismatch");
            Assert.AreEqual(2, customer2._rtable_Version, "customer2._rtable_Version mismatch");
            Assert.AreEqual(false, customer2._rtable_Tombstone, "customer2._rtable_Tombstone mismatch");
            Assert.AreEqual(futureViewId, customer2._rtable_ViewId, "customer2._rtable_ViewId mismatch");
            Assert.AreEqual(phone, customer2.PhoneNumber, "customer2.PhoneNumber mismatch");
            Assert.AreEqual(email, customer2.Email, "customer2.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Delete entity
            //
            Console.WriteLine("\nCalling Delete with larger viewId...");
            operation = TableOperation.Delete(customer);
            TableResult deleteResult = repTable.Execute(operation);

            Assert.AreNotEqual(null, deleteResult, "deleteResult = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, deleteResult.HttpStatusCode, "deleteResult.HttpStatusCode mismatch");
            Assert.IsNotNull(deleteResult.Result, "deleteResult.Result = null");

            // Retrieve
            Console.WriteLine("Calling TableOperation.Retrieve() after Delete() was called...");
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult2 = repTable.Execute(operation);

            Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult2.HttpStatusCode, "retrievedResult2.HttpStatusCode mismatch");
            Assert.IsNull(retrievedResult2.Result, "retrievedResult2.Result != null");
        }