protected async Task MembershipTable_UpdateRow(bool extendedProtocol = true) { var tableData = await this.membershipTable.ReadAll(); Assert.NotNull(tableData.Version); Assert.Equal(0, tableData.Version.Version); Assert.Equal(0, tableData.Members.Count); for (int i = 1; i < 10; i++) { var siloEntry = CreateMembershipEntryForTest(); siloEntry.SuspectTimes = new List <Tuple <SiloAddress, DateTime> > { new Tuple <SiloAddress, DateTime>(CreateSiloAddressForTest(), GetUtcNowWithSecondsResolution().AddSeconds(1)), new Tuple <SiloAddress, DateTime>(CreateSiloAddressForTest(), GetUtcNowWithSecondsResolution().AddSeconds(2)) }; TableVersion tableVersion = tableData.Version.Next(); this.logger?.Info("Calling InsertRow with Entry={entry} TableVersion={tableVersion}", siloEntry, tableVersion); bool ok = await this.membershipTable.InsertRow(siloEntry, tableVersion); Assert.True(ok, "InsertRow failed"); tableData = await this.membershipTable.ReadAll(); var etagBefore = tableData.Get(siloEntry.SiloAddress).Item2; Assert.NotNull(etagBefore); if (extendedProtocol) { this.logger?.Info("Calling UpdateRow with Entry={entry} correct eTag={eTag} old version={tableVersion}", siloEntry, etagBefore, tableVersion != null ? tableVersion.ToString() : "null"); ok = await this.membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion); Assert.False(ok, $"row update should have failed - Table Data = {tableData}"); tableData = await this.membershipTable.ReadAll(); } tableVersion = tableData.Version.Next(); this.logger?.Info("Calling UpdateRow with Entry={entry} correct eTag={eTag} correct version={tableVersion}", siloEntry, etagBefore, tableVersion != null ? tableVersion.ToString() : "null"); ok = await this.membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion); Assert.True(ok, $"UpdateRow failed - Table Data = {tableData}"); this.logger?.Info("Calling UpdateRow with Entry={entry} old eTag={eTag} old version={tableVersion}", siloEntry, etagBefore, tableVersion != null ? tableVersion.ToString() : "null"); ok = await this.membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion); Assert.False(ok, $"row update should have failed - Table Data = {tableData}"); tableData = await this.membershipTable.ReadAll(); var tuple = tableData.Get(siloEntry.SiloAddress); //Assert.Equal(tuple.Item1.ToFullString(true), siloEntry.ToFullString(true)); var etagAfter = tuple.Item2; if (extendedProtocol) { this.logger?.Info("Calling UpdateRow with Entry={entry} correct eTag={eTag} old version={tableVersion}", siloEntry, etagAfter, tableVersion != null ? tableVersion.ToString() : "null"); ok = await this.membershipTable.UpdateRow(siloEntry, etagAfter, tableVersion); Assert.False(ok, $"row update should have failed - Table Data = {tableData}"); } tableData = await this.membershipTable.ReadAll(); etagBefore = etagAfter; etagAfter = tableData.Get(siloEntry.SiloAddress).Item2; Assert.Equal(etagBefore, etagAfter); Assert.NotNull(tableData.Version); if (extendedProtocol) { Assert.Equal(tableVersion.Version, tableData.Version.Version); } Assert.Equal(i, tableData.Members.Count); } }
public async Task <bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion) { try { if (logger.IsVerbose) { logger.Verbose("UpdateRow entry = {0}, etag = {1}, table version = {2}", entry.ToFullString(), etag, tableVersion); } var siloEntry = Convert(entry, tableManager.DeploymentId); var versionEntry = tableManager.CreateTableVersionEntry(tableVersion.Version); bool result = await tableManager.UpdateSiloEntryConditionally(siloEntry, etag, versionEntry, tableVersion.VersionEtag); if (result == false) { logger.Warn(ErrorCode.AzureTable_24, String.Format("Update failed due to contention on the table. Will retry. Entry {0}, eTag {1}, table version = {2} ", entry.ToFullString(), etag, tableVersion)); } return(result); } catch (Exception exc) { logger.Warn(ErrorCode.AzureTable_25, String.Format("Intermediate error updating entry {0} tableVersion {1} to the table {2}.", entry.ToFullString(), (tableVersion == null ? "null" : tableVersion.ToString()), tableManager.TableName), exc); throw; } }
public async Task <bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion) { try { if (logger.IsEnabled(LogLevel.Debug)) { logger.Debug("UpdateRow entry = {0}, etag = {1}, table version = {2}", entry.ToFullString(), etag, tableVersion); } var siloEntry = Convert(entry, tableManager.DeploymentId); var versionEntry = tableManager.CreateTableVersionEntry(tableVersion.Version); bool result = await tableManager.UpdateSiloEntryConditionally(siloEntry, etag, versionEntry, tableVersion.VersionEtag); if (result == false) { logger.Warn((int)TableStorageErrorCode.AzureTable_24, $"Update failed due to contention on the table. Will retry. Entry {entry.ToFullString()}, eTag {etag}, table version = {tableVersion} "); } return(result); } catch (Exception exc) { logger.Warn((int)TableStorageErrorCode.AzureTable_25, $"Intermediate error updating entry {entry.ToFullString()} tableVersion {(tableVersion == null ? "null" : tableVersion.ToString())} to the table {tableManager.TableName}.", exc); throw; } }
public async Task <bool> InsertRow(MembershipEntry entry, TableVersion tableVersion) { try { if (logger.IsEnabled(LogLevel.Debug)) { logger.Debug("InsertRow entry = {0}, table version = {1}", entry.ToFullString(), tableVersion); } var tableEntry = Convert(entry, tableManager.DeploymentId); var versionEntry = tableManager.CreateTableVersionEntry(tableVersion.Version); bool result = await tableManager.InsertSiloEntryConditionally( tableEntry, versionEntry, tableVersion.VersionEtag); if (result == false) { logger.Warn(ErrorCode.AzureTable_22, $"Insert failed due to contention on the table. Will retry. Entry {entry.ToFullString()}, table version = {tableVersion}"); } return(result); } catch (Exception exc) { logger.Warn(ErrorCode.AzureTable_23, $"Intermediate error inserting entry {entry.ToFullString()} tableVersion {(tableVersion == null ? "null" : tableVersion.ToString())} to the table {tableManager.TableName}.", exc); throw; } }
public async Task<bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion) { try { if (logger.IsVerbose) logger.Verbose("UpdateRow entry = {0}, etag = {1}, table version = {2}", entry.ToFullString(), etag, tableVersion); var siloEntry = Convert(entry, tableManager.DeploymentId); var versionEntry = tableManager.CreateTableVersionEntry(tableVersion.Version); bool result = await tableManager.UpdateSiloEntryConditionally(siloEntry, etag, versionEntry, tableVersion.VersionEtag); if (result == false) logger.Warn(ErrorCode.AzureTable_24, String.Format("Update failed due to contention on the table. Will retry. Entry {0}, eTag {1}, table version = {2} ", entry.ToFullString(), etag, tableVersion)); return result; } catch (Exception exc) { logger.Warn(ErrorCode.AzureTable_25, String.Format("Intermediate error updating entry {0} tableVersion {1} to the table {2}.", entry.ToFullString(), (tableVersion == null ? "null" : tableVersion.ToString()), tableManager.TableName), exc); throw; } }
public async Task<bool> InsertRow(MembershipEntry entry, TableVersion tableVersion) { try { if (logger.IsVerbose) logger.Verbose("InsertRow entry = {0}, table version = {1}", entry.ToFullString(), tableVersion); var tableEntry = Convert(entry, tableManager.DeploymentId); var versionEntry = tableManager.CreateTableVersionEntry(tableVersion.Version); bool result = await tableManager.InsertSiloEntryConditionally( tableEntry, versionEntry, tableVersion.VersionEtag); if (result == false) logger.Warn(ErrorCode.AzureTable_22, $"Insert failed due to contention on the table. Will retry. Entry {entry.ToFullString()}, table version = {tableVersion}"); return result; } catch (Exception exc) { logger.Warn(ErrorCode.AzureTable_23, $"Intermediate error inserting entry {entry.ToFullString()} tableVersion {(tableVersion == null ? "null" : tableVersion.ToString())} to the table {tableManager.TableName}.", exc); throw; } }