public async Task AzureMembership_ReadAll_1() { MembershipTableData data = await membership.ReadAll(); TableVersion tableVersion = data.Version; logger.Info("Membership.ReadAll returned VableVersion={0} Data={1}", tableVersion, data); Assert.AreEqual(0, data.Members.Count, "Number of records returned - no table version row"); DateTime now = DateTime.UtcNow; MembershipEntry entry = new MembershipEntry { SiloAddress = siloAddress, StartTime = now, Status = SiloStatus.Active, }; TableVersion newTableVersion = tableVersion.Next(); bool ok = await membership.InsertRow(entry, newTableVersion); Assert.IsTrue(ok, "InsertRow completed successfully"); data = await membership.ReadAll(); tableVersion = data.Version; logger.Info("Membership.ReadAll returned VableVersion={0} Data={1}", tableVersion, data); Assert.AreEqual(1, data.Members.Count, "Number of records returned - data row only"); Assert.IsNotNull(tableVersion.VersionEtag, "New version ETag should not be null"); Assert.AreNotEqual(newTableVersion.VersionEtag, tableVersion.VersionEtag, "New VersionEtag differetnfrom last"); Assert.AreEqual(newTableVersion.Version, tableVersion.Version, "New table version number"); MembershipEntry MembershipEntry = data.Members[0].Item1; string eTag = data.Members[0].Item2; logger.Info("Membership.ReadAll returned MembershipEntry ETag={0} Entry={1}", eTag, MembershipEntry); Assert.IsNotNull(eTag, "ETag should not be null"); Assert.IsNotNull(MembershipEntry, "MembershipEntry should not be null"); }
private async Task MembershipTable_UpdateRow(IMembershipTable membership) { MembershipEntry MembershipEntry = CreateMembershipEntryForTest(); MembershipTableData MembershipData = await membership.ReadAll(); TableVersion tableVer = MembershipData.Version; Assert.AreEqual(0, MembershipData.Members.Count, "Should be no data initially: {0}", MembershipData); logger.Info("Calling InsertRow with Entry = {0} TableVersion = {1}", MembershipEntry, tableVer); bool ok = await membership.InsertRow(MembershipEntry, tableVer); Assert.IsTrue(ok, "InsertRow OK"); MembershipData = await membership.ReadAll(); Assert.AreEqual(1, MembershipData.Members.Count, "Should be one row after insert: {0}", MembershipData); Tuple <MembershipEntry, string> newEntryData = MembershipData.Get(MembershipEntry.SiloAddress); string eTag = newEntryData.Item2; Assert.IsNotNull(eTag, "ETag should not be null"); tableVer = MembershipData.Version; Assert.IsNotNull(tableVer, "TableVersion should not be null"); tableVer = tableVer.Next(); MembershipEntry = CreateMembershipEntryForTest(); MembershipEntry.Status = SiloStatus.Active; logger.Info("Calling UpdateRow with Entry = {0} eTag = {1} New TableVersion={2}", MembershipEntry, eTag, tableVer); ok = await membership.UpdateRow(MembershipEntry, eTag, tableVer); MembershipData = await membership.ReadAll(); Assert.AreEqual(1, MembershipData.Members.Count, "Should be one row after update: {0}", MembershipData); Assert.IsTrue(ok, "UpdateRow OK - Table Data = {0}", MembershipData); }
protected async Task MembershipTable_CleanupDefunctSiloEntries(bool extendedProtocol = true) { MembershipTableData data = await membershipTable.ReadAll(); logger.Info("Membership.ReadAll returned VableVersion={0} Data={1}", data.Version, data); Assert.Equal(0, data.Members.Count); TableVersion newTableVersion = data.Version.Next(); MembershipEntry oldEntry = CreateMembershipEntryForTest(); oldEntry.IAmAliveTime = oldEntry.IAmAliveTime.AddDays(-10); oldEntry.StartTime = oldEntry.StartTime.AddDays(-10); bool ok = await membershipTable.InsertRow(oldEntry, newTableVersion); Assert.True(ok, "InsertRow failed"); newTableVersion = newTableVersion.Next(); MembershipEntry newEntry = CreateMembershipEntryForTest(); ok = await membershipTable.InsertRow(newEntry, newTableVersion); Assert.True(ok, "InsertRow failed"); data = await membershipTable.ReadAll(); logger.Info("Membership.ReadAll returned VableVersion={0} Data={1}", data.Version, data); Assert.Equal(2, data.Members.Count); await membershipTable.CleanupDefunctSiloEntries(oldEntry.IAmAliveTime.AddDays(3)); data = await membershipTable.ReadAll(); logger.Info("Membership.ReadAll returned VableVersion={0} Data={1}", data.Version, data); Assert.Equal(1, data.Members.Count); }
private async Task <bool> DeclareDead(MembershipEntry entry, string etag, TableVersion tableVersion, DateTime time) { if (this.clusterMembershipOptions.LivenessEnabled) { entry = entry.Copy(); // Add the killer (myself) to the suspect list, for easier diagnosis later on. entry.AddSuspector(myAddress, time); if (log.IsEnabled(LogLevel.Debug)) { log.LogDebug("Going to DeclareDead silo {SiloAddress} in the table. About to write entry {Entry}.", entry.SiloAddress, entry.ToFullString()); } entry.Status = SiloStatus.Dead; bool ok = await membershipTableProvider.UpdateRow(entry, etag, tableVersion.Next()); if (ok) { if (log.IsEnabled(LogLevel.Debug)) { log.LogDebug("Successfully updated {SiloAddress} status to Dead in the membership table.", entry.SiloAddress); } var table = await membershipTableProvider.ReadAll(); this.ProcessTableUpdate(table, "DeclareDead"); GossipToOthers(entry.SiloAddress, entry.Status).Ignore(); return(true); } log.LogInformation( (int)ErrorCode.MembershipMarkDeadWriteFailed, "Failed to update {SiloAddress} status to Dead in the membership table, due to write conflicts. Will retry.", entry.SiloAddress); return(false); } log.LogInformation((int)ErrorCode.MembershipCantWriteLivenessDisabled, "Want to mark silo {SiloAddress} as DEAD, but will ignore because Liveness is Disabled.", entry.SiloAddress); return(true); }