// // 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); }
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))); }