예제 #1
0
        internal string ToFullString(bool full = false)
        {
            if (!full)
            {
                return(ToString());
            }

            List <SiloAddress> suspecters = SuspectTimes == null
                ? null
                : SuspectTimes.Select(tuple => tuple.Item1).ToList();
            List <DateTime> timestamps = SuspectTimes == null
                ? null
                : SuspectTimes.Select(tuple => tuple.Item2).ToList();

            return(string.Format("[SiloAddress={0} SiloName={1} Status={2} HostName={3} ProxyPort={4} " +
                                 "RoleName={5} UpdateZone={6} FaultZone={7} StartTime = {8} IAmAliveTime = {9} {10} {11}]",
                                 SiloAddress.ToLongString(),
                                 SiloName,
                                 Status,
                                 HostName,
                                 ProxyPort,
                                 RoleName,
                                 UpdateZone,
                                 FaultZone,
                                 LogFormatter.PrintDate(StartTime),
                                 LogFormatter.PrintDate(IAmAliveTime),
                                 suspecters == null
                    ? ""
                    : "Suspecters = " + Utils.EnumerableToString(suspecters, sa => sa.ToLongString()),
                                 timestamps == null
                    ? ""
                    : "SuspectTimes = " + Utils.EnumerableToString(timestamps, LogFormatter.PrintDate)
                                 ));
        }
예제 #2
0
        public void AddSuspector(SiloAddress suspectingSilo, DateTime suspectingTime)
        {
            SuspectTimes ??= new List <Tuple <SiloAddress, DateTime> >();

            var suspector = new Tuple <SiloAddress, DateTime>(suspectingSilo, suspectingTime);

            SuspectTimes.Add(suspector);
        }
 public MembershipEntry ToEntry()
 {
     return(new MembershipEntry
     {
         FaultZone = FaultZone,
         HostName = HostName,
         IAmAliveTime = LogFormatter.ParseDate(IAmAliveTime),
         ProxyPort = ProxyPort,
         RoleName = RoleName,
         SiloAddress = SiloAddressClass.FromParsableString(SiloAddress),
         SiloName = SiloName,
         Status = (SiloStatus)Status,
         StartTime = LogFormatter.ParseDate(StartTime),
         SuspectTimes = SuspectTimes.Select(x => x.ToTuple()).ToList(),
         UpdateZone = UpdateZone
     });
 }
예제 #4
0
        internal List <Tuple <SiloAddress, DateTime> > GetFreshVotes(TimeSpan expiration)
        {
            if (SuspectTimes == null)
            {
                return(EmptyList);
            }
            DateTime now = DateTime.UtcNow;

            return(SuspectTimes.FindAll(voter =>
            {
                DateTime otherVoterTime = voter.Item2;
                // If now is smaller than otherVoterTime, than assume the otherVoterTime is fresh.
                // This could happen if clocks are not synchronized and the other voter clock is ahead of mine.
                if (now < otherVoterTime)
                {
                    return true;
                }

                return now.Subtract(otherVoterTime) < expiration;
            }));
        }