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