Example #1
0
        //
        // Gossip
        //

        private static Proto.Msg.Gossip GossipToProto(Gossip gossip)
        {
            var allMembers        = gossip.Members.ToList();
            var allAddresses      = gossip.Members.Select(x => x.UniqueAddress).ToList();
            var addressMapping    = allAddresses.ZipWithIndex();
            var allRoles          = allMembers.Aggregate(ImmutableHashSet.Create <string>(), (set, member) => set.Union(member.Roles));
            var roleMapping       = allRoles.ZipWithIndex();
            var allHashes         = gossip.Version.Versions.Keys.Select(x => x.ToString()).ToList();
            var hashMapping       = allHashes.ZipWithIndex();
            var allAppVersions    = allMembers.Select(i => i.AppVersion.Version).ToImmutableHashSet();
            var appVersionMapping = allAppVersions.ZipWithIndex();

            int MapUniqueAddress(UniqueAddress address) => MapWithErrorMessage(addressMapping, address, "address");

            int MapAppVersion(AppVersion appVersion) => MapWithErrorMessage(appVersionMapping, appVersion.Version, "appVersion");

            Proto.Msg.Member MemberToProto(Member m)
            {
                var protoMember = new Proto.Msg.Member();

                protoMember.AddressIndex = MapUniqueAddress(m.UniqueAddress);
                protoMember.UpNumber     = m.UpNumber;
                protoMember.Status       = (Proto.Msg.Member.Types.MemberStatus)m.Status;
                protoMember.RolesIndexes.AddRange(m.Roles.Select(s => MapWithErrorMessage(roleMapping, s, "role")));
                protoMember.AppVersionIndex = MapAppVersion(m.AppVersion);
                return(protoMember);
            }

            var reachabilityProto = ReachabilityToProto(gossip.Overview.Reachability, addressMapping);
            var membersProtos     = gossip.Members.Select((Func <Member, Proto.Msg.Member>)MemberToProto);
            var seenProtos        = gossip.Overview.Seen.Select((Func <UniqueAddress, int>)MapUniqueAddress);

            var overview = new Proto.Msg.GossipOverview();

            overview.Seen.AddRange(seenProtos);
            overview.ObserverReachability.AddRange(reachabilityProto);

            var message = new Proto.Msg.Gossip();

            message.AllAddresses.AddRange(allAddresses.Select(UniqueAddressToProto));
            message.AllRoles.AddRange(allRoles);
            message.AllHashes.AddRange(allHashes);
            message.Members.AddRange(membersProtos);
            message.Overview = overview;
            message.Version  = VectorClockToProto(gossip.Version, hashMapping);
            message.AllAppVersions.AddRange(allAppVersions);
            return(message);
        }
Example #2
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)));
        }