public async Task <Boolean> UpdateRow(MembershipEntry entry, String etag, TableVersion tableVersion) { //Update Silo Liveness try { var siloRegistration = ConsulSiloRegistrationAssembler.FromMembershipEntry(_deploymentId, entry, etag); var updateKV = ConsulSiloRegistrationAssembler.ToKVPair(siloRegistration); //If the KV.CAS() call returns false then the update failed var tryUpdate = await _consulClient.KV.CAS(updateKV); if (!tryUpdate.Response) { _logger.Debug("ConsulMembershipProvider failed the CAS check when updating the registration for silo {0}.", entry.SiloAddress); return(false); } return(true); } catch (Exception ex) { _logger.Info("ConsulMembershipProvider failed to update the registration for silo {0}: {1}.", entry.SiloAddress, ex); throw; } }
internal static KVPair ToIAmAliveKVPair(String deploymentId, SiloAddress siloAddress, DateTime iAmAliveTime) { var ret = new KVPair(ConsulSiloRegistrationAssembler.ParseSiloIAmAliveKey(deploymentId, siloAddress)); ret.Value = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(iAmAliveTime)); return(ret); }
internal static KVPair ToKVPair(ConsulSiloRegistration siloRegistration) { var ret = new KVPair(ConsulSiloRegistrationAssembler.ParseDeploymentSiloKey(siloRegistration.DeploymentId, siloRegistration.Address)); ret.ModifyIndex = siloRegistration.LastIndex; ret.Value = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(siloRegistration)); return(ret); }
private MembershipTableData AssembleMembershipTableData(params ConsulSiloRegistration[] silos) { var membershipEntries = silos .Where(silo => silo != null) .Select(silo => ConsulSiloRegistrationAssembler.ToMembershipEntry(silo)) .ToList(); return(new MembershipTableData(membershipEntries, _tableVersion)); }
private async Task <ConsulSiloRegistration> GetConsulSiloRegistration(SiloAddress siloAddress) { var siloKey = ConsulSiloRegistrationAssembler.ParseDeploymentSiloKey(_deploymentId, siloAddress); var siloKVEntry = await _consulClient.KV.List(siloKey); if (siloKVEntry.Response == null) { return(null); } var siloKV = siloKVEntry.Response.Single(KV => KV.Key.Equals(siloKey, StringComparison.OrdinalIgnoreCase)); var iAmAliveKV = siloKVEntry.Response.SingleOrDefault(KV => KV.Key.Equals(ConsulSiloRegistrationAssembler.ParseSiloIAmAliveKey(siloKey), StringComparison.OrdinalIgnoreCase)); var siloRegistration = ConsulSiloRegistrationAssembler.FromKVPairs(_deploymentId, siloKV, iAmAliveKV); return(siloRegistration); }
public async Task <MembershipTableData> ReadAll() { var deploymentKVAddresses = await _consulClient.KV.List(ConsulSiloRegistrationAssembler.ParseDeploymentKVPrefix(_deploymentId)); if (deploymentKVAddresses.Response == null) { _logger.Debug("Could not find any silo registrations for deployment {0}.", _deploymentId); return(new MembershipTableData(_tableVersion)); } var allSiloRegistrations = deploymentKVAddresses.Response .Where(siloKV => !siloKV.Key.EndsWith(ConsulSiloRegistrationAssembler.SiloIAmAliveSuffix, StringComparison.OrdinalIgnoreCase)) .Select(siloKV => { var iAmAliveKV = deploymentKVAddresses.Response.Where(kv => kv.Key.Equals(ConsulSiloRegistrationAssembler.ParseSiloIAmAliveKey(siloKV.Key), StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); return(ConsulSiloRegistrationAssembler.FromKVPairs(_deploymentId, siloKV, iAmAliveKV)); }).ToArray(); return(AssembleMembershipTableData(allSiloRegistrations)); }
public async Task <Boolean> InsertRow(MembershipEntry entry, TableVersion tableVersion) { try { //Use "0" as the eTag then Consul KV CAS will treat the operation as an insert and return false if the KV already exiats. var consulSiloRegistration = ConsulSiloRegistrationAssembler.FromMembershipEntry(_deploymentId, entry, "0"); var insertKV = ConsulSiloRegistrationAssembler.ToKVPair(consulSiloRegistration); var tryUpdate = await _consulClient.KV.CAS(insertKV); if (!tryUpdate.Response) { _logger.Debug("ConsulMembershipProvider failed to insert the row because a registration already exists for silo {0}.", entry.SiloAddress); return(false); } return(true); } catch (Exception ex) { _logger.Info("ConsulMembershipProvider failed to insert registration for silo {0}; {1}.", entry.SiloAddress, ex); throw; } }
public async Task DeleteMembershipTableEntries(String deploymentId) { await _consulClient.KV.DeleteTree(ConsulSiloRegistrationAssembler.ParseDeploymentKVPrefix(_deploymentId)); }
public async Task UpdateIAmAlive(MembershipEntry entry) { var iAmAliveKV = ConsulSiloRegistrationAssembler.ToIAmAliveKVPair(_deploymentId, entry.SiloAddress, entry.IAmAliveTime); await _consulClient.KV.Put(iAmAliveKV); }