public static MembershipTableSnapshot Create(MembershipEntry localSiloEntry, MembershipTableData table)
        {
            if (localSiloEntry is null)
            {
                throw new ArgumentNullException(nameof(localSiloEntry));
            }
            if (table is null)
            {
                throw new ArgumentNullException(nameof(table));
            }

            var entries = ImmutableDictionary.CreateBuilder <SiloAddress, MembershipEntry>();

            if (table.Members != null)
            {
                foreach (var item in table.Members)
                {
                    var entry = item.Item1;
                    entries.Add(entry.SiloAddress, entry);
                }
            }

            if (entries.TryGetValue(localSiloEntry.SiloAddress, out var existing))
            {
                entries[localSiloEntry.SiloAddress] = existing.WithStatus(localSiloEntry.Status);
            }
            else
            {
                entries[localSiloEntry.SiloAddress] = localSiloEntry;
            }

            var version = new MembershipVersion(table.Version.Version);

            return(new MembershipTableSnapshot(localSiloEntry, version, entries.ToImmutable()));
        }
 public MembershipTableSnapshot(
     MembershipEntry localSilo,
     MembershipVersion version,
     ImmutableDictionary <SiloAddress, MembershipEntry> entries)
 {
     this.LocalSilo = localSilo;
     this.Version   = version;
     this.Entries   = entries;
 }
        private bool IsKnownDeadSilo(SiloAddress siloAddress, MembershipVersion membershipVersion)
        {
            var current = this.clusterMembershipService.CurrentSnapshot;

            // Check if the target silo is in the cluster
            if (current.Members.TryGetValue(siloAddress, out var value))
            {
                // It is, check if it's alive
                return(value.Status.IsTerminating());
            }

            // We didn't find it in the cluster. If the silo entry is too old, it has been cleaned in the membership table: the entry isn't valid anymore.
            // Otherwise, maybe the membership service isn't up to date yet. The entry should be valid
            return(current.Version > membershipVersion);
        }
Exemple #4
0
 private void NotifyMembershipTableChanged(MembershipVersion version, Identity applicant)
 {
     foreach (var member in membershipMembers.Values)
     {
         if (member.Identity != applicant)
         {
             try
             {
                 member.MembershipTableChanged(version);
             }
             catch (Exception ex)
             {
                 logger.Warn("{0}.{1} error:{2}", nameof(ClusterMembershipService), nameof(TableChanged), ex);
             }
         }
     }
 }
Exemple #5
0
        public void MembershipTableChanged(MembershipVersion version)
        {
            if (membershipManager.Version == null || membershipManager.Version < version)
            {
                MembershipSnapshot membershipSnapshot;

                try
                {
                    membershipSnapshot = clusterMembershipService.CreateSnapshot();
                }
                catch (Exception ex)
                {
                    logger.Warn("{0}.{1} error:{2}", nameof(GatewayMembershipService), nameof(IClusterMembershipService.CreateSnapshot), ex);
                    return;
                }

                membershipManager.UpdateFromSnapshot(membershipSnapshot);
            }
        }
Exemple #6
0
 public void MembershipTableChanged(MembershipVersion version)
 {
     systemTarget.MembershipTableChanged(version);
 }
Exemple #7
0
 public void Deconstruct(out MembershipVersion version, out SiloAddress siloAddress)
 {
     version     = MembershipVersion;
     siloAddress = SiloAddress;
 }
Exemple #8
0
 public VersionedSuccessor(MembershipVersion membershipVersion, SiloAddress siloAddress)
 {
     MembershipVersion = membershipVersion;
     SiloAddress       = siloAddress;
 }
 public ValueTask Refresh(MembershipVersion minimumVersion = default) => new ValueTask();