Beispiel #1
0
        private static Gossip GossipFrom(Proto.Msg.Gossip gossip)
        {
            var addressMapping = gossip.AllAddresses.Select(UniqueAddressFrom).ToList();
            var roleMapping    = gossip.AllRoles.ToList();
            var hashMapping    = gossip.AllHashes.ToList();

            Member MemberFromProto(Proto.Msg.Member member) =>
            Member.Create(
                addressMapping[member.AddressIndex],
                member.UpNumber,
                (MemberStatus)member.Status,
                member.RolesIndexes.Select(x => roleMapping[x]).ToImmutableHashSet());

            var members      = gossip.Members.Select((Func <Proto.Msg.Member, Member>)MemberFromProto).ToImmutableSortedSet(Member.Ordering);
            var reachability = ReachabilityFromProto(gossip.Overview.ObserverReachability, addressMapping);
            var seen         = gossip.Overview.Seen.Select(x => addressMapping[x]).ToImmutableHashSet();
            var overview     = new GossipOverview(seen, reachability);

            return(new Gossip(members, overview, VectorClockFrom(gossip.Version, hashMapping)));
        }
        private Gossip GossipFromProto(Msg.Gossip gossip)
        {
            var addressMapping = gossip.AllAddressesList.Select(UniqueAddressFromProto).ToList();
            var roleMapping    = gossip.AllRolesList.ToList();
            var hashMapping    = gossip.AllHashesList.ToList();

            Func <IEnumerable <Msg.ObserverReachability>, Reachability> reachabilityFromProto = reachabilityProto =>
            {
                var recordBuilder   = ImmutableList.CreateBuilder <Reachability.Record>();
                var versionsBuilder = ImmutableDictionary.CreateBuilder <UniqueAddress, long>();
                foreach (var o in reachabilityProto)
                {
                    var observer = addressMapping[o.AddressIndex];
                    versionsBuilder.Add(observer, o.Version);
                    foreach (var s in o.SubjectReachabilityList)
                    {
                        var subject = addressMapping[s.AddressIndex];
                        var record  = new Reachability.Record(observer, subject, ReachabilityStatusFromProto[s.Status],
                                                              s.Version);
                        recordBuilder.Add(record);
                    }
                }

                return(new Reachability(recordBuilder.ToImmutable(), versionsBuilder.ToImmutable()));
            };

            Func <Msg.Member, Member> memberFromProto = member => Member.Create(addressMapping[member.AddressIndex], member.HasUpNumber ? member.UpNumber : 0, MemberStatusFromProto[member.Status],
                                                                                member.RolesIndexesList.Select(x => roleMapping[x]).ToImmutableHashSet());

            var members      = gossip.MembersList.Select(memberFromProto).ToImmutableSortedSet(Member.Ordering);
            var reachability = reachabilityFromProto(gossip.Overview.ObserverReachabilityList);
            var seen         = gossip.Overview.SeenList.Select(x => addressMapping[x]).ToImmutableHashSet();
            var overview     = new GossipOverview(seen, reachability);

            return(new Gossip(members, overview, VectorClockFromProto(gossip.Version, hashMapping)));
        }