private static Reachability ReachabilityFromProto(IEnumerable <Proto.Msg.ObserverReachability> reachabilityProto, List <UniqueAddress> addressMapping) { 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.SubjectReachability) { var subject = addressMapping[s.AddressIndex]; var record = new Reachability.Record(observer, subject, (Reachability.ReachabilityStatus)s.Status, s.Version); recordBuilder.Add(record); } } return(new Reachability(recordBuilder.ToImmutable(), versionsBuilder.ToImmutable())); }
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))); }