public async Task <bool> InsertRow(MembershipEntry entry, TableVersion tableVersion) { try { RedisMembershipEntry rentry = RedisMembershipEntry.Create(clusterId, entry, "0"); RedisMembershipCollection collection = null; var val = await database.StringGetAsync(clusterId); if (!val.IsNull) { collection = serializer.Deserialize <RedisMembershipCollection>(val); collection.Add(rentry); } else { collection = new RedisMembershipCollection(); collection.Add(rentry); } bool ret = await database.StringSetAsync(clusterId, serializer.Serialize(collection)); return(ret); } catch (Exception ex) { logger?.LogError(ex, "Redis membership table key '{0}' failed insert row.", clusterId); throw ex; } }
public async Task <bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion) { bool ret = false; try { while (true) { long ticks = DateTime.UtcNow.Ticks; await database.StringSetAsync("locktoken", ticks.ToString(), new TimeSpan(0, 0, 10)); if (string.IsNullOrEmpty(etag)) { etag = "0"; } var rentry = RedisMembershipEntry.Create(clusterId, entry, etag); var val = await database.StringGetAsync(clusterId); if (!val.IsNull) { RedisMembershipCollection collection = serializer.Deserialize <RedisMembershipCollection>(val); var items = collection.Where((x) => x.DeploymentId == clusterId && x.Address.ToParsableString() == rentry.Address.ToParsableString()); if (items != null && items.Count() > 0) { RedisMembershipEntry oldEntry = items.First(); rentry.LastIndex = oldEntry.LastIndex++; collection.Remove(oldEntry); collection.Add(rentry); string tokenValue = await database.StringGetAsync("locktoken"); if (tokenValue != ticks.ToString()) { continue; } else { ret = await database.StringSetAsync(clusterId, serializer.Serialize(collection)); break; } } } } return(ret); } catch (Exception ex) { logger?.LogError(ex, "Redis membership table key '{0}' failed update row.", clusterId); throw ex; } }
public async Task <bool> InsertRow(MembershipEntry entry, TableVersion tableVersion) { bool ret = false; try { while (true) { long ticks = DateTime.UtcNow.Ticks; await database.StringSetAsync("locktoken", ticks.ToString(), new TimeSpan(0, 0, 10)); RedisMembershipEntry rentry = RedisMembershipEntry.Create(clusterId, entry, "0"); RedisMembershipCollection collection = null; var val = await database.StringGetAsync(clusterId); if (!val.IsNull) { collection = serializer.Deserialize <RedisMembershipCollection>(val); collection.Add(rentry); } else { collection = new RedisMembershipCollection(); collection.Add(rentry); } string tokenValue = await database.StringGetAsync("locktoken"); if (tokenValue != ticks.ToString()) { continue; } else { ret = await database.StringSetAsync(clusterId, serializer.Serialize(collection)); break; } } return(ret); } catch (Exception ex) { logger?.LogError(ex, "Redis membership table key '{0}' failed insert row.", clusterId); throw ex; } }
public static RedisMembershipEntry Create(string deploymentId, MembershipEntry entry, String etag) { var ret = new RedisMembershipEntry { DeploymentId = deploymentId, Address = entry.SiloAddress, IAmAliveTime = entry.IAmAliveTime, LastIndex = Convert.ToUInt64(etag), Hostname = entry.HostName, ProxyPort = entry.ProxyPort, StartTime = entry.StartTime, Status = entry.Status, SiloName = entry.SiloName, UpdateZone = entry.UpdateZone, FaultZone = entry.FaultZone, SuspectingSilos = entry.SuspectTimes?.Select(silo => new SuspectingSilo { Id = silo.Item1.ToParsableString(), Time = silo.Item2 }).ToList() }; return(ret); }
public async Task <bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion) { try { bool ret = false; if (string.IsNullOrEmpty(etag)) { etag = "0"; } var rentry = RedisMembershipEntry.Create(clusterId, entry, etag); var val = await database.StringGetAsync(clusterId); if (!val.IsNull) { RedisMembershipCollection collection = serializer.Deserialize <RedisMembershipCollection>(val); var items = collection.Where((x) => x.DeploymentId == clusterId && x.Address.ToParsableString() == rentry.Address.ToParsableString()); if (items != null && items.Count() > 0) { RedisMembershipEntry oldEntry = items.First(); rentry.LastIndex = oldEntry.LastIndex++; collection.Remove(oldEntry); collection.Add(rentry); ret = await database.StringSetAsync(clusterId, serializer.Serialize(collection)); } } return(ret); } catch (Exception ex) { logger?.LogError(ex, "Redis membership table key '{0}' failed update row.", clusterId); throw ex; } }