Пример #1
0
        public void MemberOrdering_must_work_with_sorted_set()
        {
            var address1 = new Address("akka.tcp", "sys1", "host1", 9001);
            var address2 = address1.WithPort(9002);
            var address3 = address1.WithPort(9003);

            ImmutableSortedSet
            .Create(TestMember.Create(address1, MemberStatus.Joining))
            .Remove(TestMember.Create(address1, MemberStatus.Up))
            .Should().BeEmpty();

            ImmutableSortedSet
            .Create(TestMember.Create(address1, MemberStatus.Exiting))
            .Remove(TestMember.Create(address1, MemberStatus.Removed))
            .Should().BeEmpty();

            ImmutableSortedSet
            .Create(TestMember.Create(address1, MemberStatus.Up))
            .Remove(TestMember.Create(address1, MemberStatus.Exiting))
            .Should().BeEmpty();

            ImmutableSortedSet
            .Create(
                TestMember.Create(address2, MemberStatus.Up),
                TestMember.Create(address3, MemberStatus.Joining),
                TestMember.Create(address1, MemberStatus.Exiting))
            .Remove(
                TestMember.Create(address1, MemberStatus.Removed))
            .Should().BeEquivalentTo(
                TestMember.Create(address2, MemberStatus.Up),
                TestMember.Create(address3, MemberStatus.Joining));
        }
Пример #2
0
        public void A_gossip_must_find_two_oldest_as_targets_for_Exiting_change()
        {
            Member a1 = TestMember.Create(new Address("akka.tcp", "sys", "a4", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 1);
            Member a2 = TestMember.Create(new Address("akka.tcp", "sys", "a3", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 2);
            Member a3 = TestMember.Create(new Address("akka.tcp", "sys", "a2", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 3);
            Member a4 = TestMember.Create(new Address("akka.tcp", "sys", "a1", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 4);

            var a1Exiting = a1.Copy(MemberStatus.Leaving).Copy(MemberStatus.Exiting);
            var gossip    = new Gossip(ImmutableSortedSet.Create(a1Exiting, a2, a3, a4));
            var r         = ClusterCoreDaemon.GossipTargetsForExitingMembers(gossip, new Member[] { a1Exiting });

            r.Should().BeEquivalentTo(new[] { a1Exiting, a2 });
        }
Пример #3
0
        public void MemberOrdering_must_order_members_by_host_and_port()
        {
            var members = new SortedSet <Member>
            {
                TestMember.Create(Address.Parse("akka://sys@darkstar:1112"), MemberStatus.Up),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1113"), MemberStatus.Joining),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1111"), MemberStatus.Up),
            };;

            var seq = members.ToList();

            seq.Count.Should().Be(3);
            seq[0].Should().Be(TestMember.Create(Address.Parse("akka://sys@darkstar:1111"), MemberStatus.Up));
            seq[1].Should().Be(TestMember.Create(Address.Parse("akka://sys@darkstar:1112"), MemberStatus.Up));
            seq[2].Should().Be(TestMember.Create(Address.Parse("akka://sys@darkstar:1113"), MemberStatus.Joining));
        }
Пример #4
0
        public void MemberOrdering_must_be_sorted_by_address_correctly()
        {
            // sorting should be done on host and port, only
            var m1 = TestMember.Create(new Address("akka.tcp", "sys1", "host1", 9000), MemberStatus.Up);
            var m2 = TestMember.Create(new Address("akka.tcp", "sys1", "host1", 10000), MemberStatus.Up);
            var m3 = TestMember.Create(new Address("cluster", "sys2", "host2", 8000), MemberStatus.Up);
            var m4 = TestMember.Create(new Address("cluster", "sys2", "host2", 9000), MemberStatus.Up);
            var m5 = TestMember.Create(new Address("cluster", "sys1", "host2", 10000), MemberStatus.Up);

            var expected = new List <Member> {
                m1, m2, m3, m4, m5
            };
            var shuffled = expected.Shuffle().ToImmutableList();

            new SortedSet <Member>(shuffled).Should().BeEquivalentTo(expected);
            shuffled.Sort().Should().BeEquivalentTo(expected);
        }
Пример #5
0
        public void MemberOrdering_must_have_stable_equals_and_hash_code()
        {
            var address = new Address("akka.tcp", "sys1", "host1", 9000);
            var m1      = TestMember.Create(address, MemberStatus.Joining);
            var m11     = Member.Create(new UniqueAddress(address, -3), ImmutableHashSet.Create <string>());
            var m2      = m1.Copy(status: MemberStatus.Up);
            var m22     = m11.Copy(status: MemberStatus.Up);
            var m3      = TestMember.Create(address.WithPort(10000), MemberStatus.Up);

            Assert.Equal(m1, m2);
            Assert.Equal(m1.GetHashCode(), m2.GetHashCode());
            Assert.NotEqual(m3, m2);
            Assert.NotEqual(m3, m1);
            Assert.Equal(m11, m22);
            Assert.NotEqual(m1, m11);
            Assert.NotEqual(m2, m22);
        }
Пример #6
0
        public void MemberOrdering_must_order_members_by_host_and_port()
        {
            var sortedSet = new SortedSet <Member>
            {
                TestMember.Create(Address.Parse("akka://sys@darkstar:1112"), MemberStatus.Up),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1113"), MemberStatus.Joining),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1111"), MemberStatus.Up),
            };;

            var expected = new List <Member>
            {
                TestMember.Create(Address.Parse("akka://sys@darkstar:1111"), MemberStatus.Up),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1112"), MemberStatus.Up),
                TestMember.Create(Address.Parse("akka://sys@darkstar:1113"), MemberStatus.Joining),
            };

            Assert.Equal(expected, sortedSet.ToList());
        }
Пример #7
0
        public void MemberOrdering_must_consistent_ordering_and_equals()
        {
            var address1 = new Address("akka.tcp", "sys1", "host1", 9001);
            var address2 = address1.WithPort(9002);

            var x = TestMember.Create(address1, MemberStatus.Exiting);
            var y = TestMember.Create(address1, MemberStatus.Removed);
            var z = TestMember.Create(address2, MemberStatus.Up);

            Member.Ordering.Compare(x, y).Should().Be(0);
            Member.Ordering.Compare(x, z).Should().Be(Member.Ordering.Compare(y, z));

            //different uid
            var a = TestMember.Create(address1, MemberStatus.Joining);
            var b = Member.Create(new UniqueAddress(address1, -3), ImmutableHashSet <string> .Empty, AppVersion.Zero);

            Member.Ordering.Compare(a, b).Should().Be(1);
            Member.Ordering.Compare(b, a).Should().Be(-1);
        }
Пример #8
0
        public void LeaderOrdering_must_order_members_with_status_joining_exiting_down_last()
        {
            var address = new Address("akka.tcp", "sys1", "host1", 5000);
            var m1      = TestMember.Create(address, MemberStatus.Joining);
            var m2      = TestMember.Create(address.WithPort(7000), MemberStatus.Joining);
            var m3      = TestMember.Create(address.WithPort(3000), MemberStatus.Exiting);
            var m4      = TestMember.Create(address.WithPort(6000), MemberStatus.Exiting);
            var m5      = TestMember.Create(address.WithPort(2000), MemberStatus.Down);
            var m6      = TestMember.Create(address.WithPort(4000), MemberStatus.Down);
            var m7      = TestMember.Create(address.WithPort(8000), MemberStatus.Up);
            var m8      = TestMember.Create(address.WithPort(9000), MemberStatus.Up);

            var expected = new List <Member> {
                m7, m8, m1, m2, m3, m4, m5, m6
            };
            var shuffled = expected.Shuffle().ToImmutableList();

            shuffled.Sort(Member.LeaderStatusOrdering).Should().BeEquivalentTo(expected);
        }
Пример #9
0
        public void MemberOrdering_must_consistent_ordering_and_equals()
        {
            var address1 = new Address("akka.tcp", "sys1", "host1", 9001);
            var address2 = address1.WithPort(9002);

            var x = TestMember.Create(address1, MemberStatus.Exiting);
            var y = TestMember.Create(address1, MemberStatus.Removed);
            var z = TestMember.Create(address2, MemberStatus.Up);

            Assert.Equal(0, Member.Ordering.Compare(x, y));
            Assert.Equal(Member.Ordering.Compare(y, z), Member.Ordering.Compare(x, z));

            //different uid
            var a = TestMember.Create(address1, MemberStatus.Joining);
            var b = Member.Create(new UniqueAddress(address1, -3), ImmutableHashSet.Create <string>());

            Assert.Equal(1, Member.Ordering.Compare(a, b));
            Assert.Equal(-1, Member.Ordering.Compare(b, a));
        }
Пример #10
0
        public void MemberOrdering_must_be_sorted_by_address_correctly()
        {
            var m1 = TestMember.Create(new Address("akka.tcp", "sys1", "host1", 9000), MemberStatus.Up);
            var m2 = TestMember.Create(new Address("akka.tcp", "sys1", "host1", 10000), MemberStatus.Up);
            var m3 = TestMember.Create(new Address("cluster", "sys2", "host2", 8000), MemberStatus.Up);
            var m4 = TestMember.Create(new Address("cluster", "sys2", "host2", 9000), MemberStatus.Up);
            var m5 = TestMember.Create(new Address("cluster", "sys1", "host2", 10000), MemberStatus.Up);

            var expected = new List <Member> {
                m1, m2, m3, m4, m5
            };

            var shuffled = expected.Shuffle();

            Assert.Equal(expected, new SortedSet <Member>(shuffled));

            shuffled.Sort();
            Assert.Equal(expected, shuffled);
        }
Пример #11
0
        public void A_gossip_must_find_two_oldest_per_role_as_targets_for_Exiting_change()
        {
            Member a1 = TestMember.Create(new Address("akka.tcp", "sys", "a4", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 1);
            Member a2 = TestMember.Create(new Address("akka.tcp", "sys", "a3", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 2);
            Member a3 = TestMember.Create(new Address("akka.tcp", "sys", "a2", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 3);
            Member a4 = TestMember.Create(new Address("akka.tcp", "sys", "a1", 2552), MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 4);
            Member a5 = TestMember.Create(new Address("akka.tcp", "sys", "a5", 2552), MemberStatus.Exiting, ImmutableHashSet <string> .Empty.Add("role1").Add("role2"), upNumber: 5);
            Member a6 = TestMember.Create(new Address("akka.tcp", "sys", "a6", 2552), MemberStatus.Exiting, ImmutableHashSet <string> .Empty.Add("role1").Add("role3"), upNumber: 6);
            Member a7 = TestMember.Create(new Address("akka.tcp", "sys", "a7", 2552), MemberStatus.Exiting, ImmutableHashSet <string> .Empty.Add("role1"), upNumber: 7);
            Member a8 = TestMember.Create(new Address("akka.tcp", "sys", "a8", 2552), MemberStatus.Exiting, ImmutableHashSet <string> .Empty.Add("role1"), upNumber: 8);
            Member a9 = TestMember.Create(new Address("akka.tcp", "sys", "a9", 2552), MemberStatus.Exiting, ImmutableHashSet <string> .Empty.Add("role2"), upNumber: 9);

            IEnumerable <Member> theExiting = new Member[] { a5, a6 };
            var gossip = new Gossip(ImmutableSortedSet.Create(a1, a2, a3, a4, a5, a6, a7, a8, a9));

            var r = ClusterCoreDaemon.GossipTargetsForExitingMembers(gossip, theExiting);

            r.Should().BeEquivalentTo(new[] { a1, a2, a5, a6, a9 });
        }
Пример #12
0
        public void LeaderOrderingMustOrderMembersWithStatusJoiningExitingDownLast()
        {
            var address = new Address("akka.tcp", "sys1", "host1", 5000);
            var m1      = TestMember.Create(address, MemberStatus.Joining);
            var m2      = TestMember.Create(address.Copy(port: 7000), MemberStatus.Joining);
            var m3      = TestMember.Create(address.Copy(port: 3000), MemberStatus.Exiting);
            var m4      = TestMember.Create(address.Copy(port: 6000), MemberStatus.Exiting);
            var m5      = TestMember.Create(address.Copy(port: 2000), MemberStatus.Down);
            var m6      = TestMember.Create(address.Copy(port: 4000), MemberStatus.Down);
            var m7      = TestMember.Create(address.Copy(port: 8000), MemberStatus.Up);
            var m8      = TestMember.Create(address.Copy(port: 9000), MemberStatus.Up);

            var expected = new List <Member> {
                m7, m8, m1, m2, m3, m4, m5, m6
            };
            var shuffled = expected.Shuffle();

            shuffled.Sort(Member.LeaderStatusOrdering);
            Assert.Equal(expected, shuffled);
        }
Пример #13
0
        public void MemberOrdering_must_work_with_sorted_set()
        {
            var address1 = new Address("akka.tcp", "sys1", "host1", 9001);
            var address2 = address1.WithPort(9002);
            var address3 = address1.WithPort(9003);

            var set = new SortedSet <Member>
            {
                TestMember.Create(address1, MemberStatus.Joining)
            };

            set.Remove(TestMember.Create(address1, MemberStatus.Up));
            Assert.Equal(new SortedSet <Member>(), set);

            set = new SortedSet <Member>
            {
                TestMember.Create(address1, MemberStatus.Exiting)
            };
            set.Remove(TestMember.Create(address1, MemberStatus.Removed));
            Assert.Equal(new SortedSet <Member>(), set);

            set = new SortedSet <Member>
            {
                TestMember.Create(address1, MemberStatus.Up)
            };
            set.Remove(TestMember.Create(address1, MemberStatus.Exiting));
            Assert.Equal(new SortedSet <Member>(), set);

            set = new SortedSet <Member>
            {
                TestMember.Create(address2, MemberStatus.Up),
                TestMember.Create(address3, MemberStatus.Joining),
                TestMember.Create(address3, MemberStatus.Exiting)
            };
            set.Remove(TestMember.Create(address1, MemberStatus.Removed));
            Assert.Equal(new SortedSet <Member>
            {
                TestMember.Create(address2, MemberStatus.Up),
                TestMember.Create(address3, MemberStatus.Joining)
            }, set);
        }
Пример #14
0
        public void MemberOrdering_must_have_stable_equals_and_hash_code()
        {
            var address = new Address("akka.tcp", "sys1", "host1", 9000);
            var m1      = TestMember.Create(address, MemberStatus.Joining);
            var m11     = Member.Create(new UniqueAddress(address, -3), ImmutableHashSet <string> .Empty, AppVersion.Zero);
            var m2      = m1.Copy(status: MemberStatus.Up);
            var m22     = m11.Copy(status: MemberStatus.Up);
            var m3      = TestMember.Create(address.WithPort(10000), MemberStatus.Up);

            m1.Should().Be(m2);
            m1.GetHashCode().Should().Be(m2.GetHashCode());

            m3.Should().NotBe(m2);
            m3.Should().NotBe(m1);

            m11.Should().Be(m22);
            m11.GetHashCode().Should().Be(m22.GetHashCode());

            // different uid
            m1.Should().NotBe(m11);
            m2.Should().NotBe(m22);
        }
Пример #15
0
        public void MemberOrdering_must_work_pick_member_with_legal_transition()
        {
            var address1 = new Address("akka.tcp", "sys1", "host1", 9001);
            var address2 = address1.WithPort(9002);
            var address3 = address1.WithPort(9003);

            var s1 = ImmutableSortedSet
                     .Create(TestMember.Create(address1, MemberStatus.Joining))
                     .Add(TestMember.Create(address2, MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 1));

            var s2 = ImmutableSortedSet.Create(TestMember.Create(address1, MemberStatus.Up, ImmutableHashSet <string> .Empty, upNumber: 2));

            var s3 = ImmutableSortedSet
                     .Create(TestMember.Create(address1, MemberStatus.Up))
                     .Add(TestMember.Create(address2, MemberStatus.Up));

            var u1 = Member.PickNextTransition(s2, s1);

            u1.Should().BeEquivalentTo(s3);
            u1.Single(x => x.Address.Equals(address1)).Status.Should().Be(MemberStatus.Up);

            var s4 = ImmutableSortedSet
                     .Create(TestMember.Create(address1, MemberStatus.Up))
                     .Add(TestMember.Create(address2, MemberStatus.Up))
                     .Add(TestMember.Create(address3, MemberStatus.Joining));

            var s5 = ImmutableSortedSet
                     .Create(TestMember.Create(address1, MemberStatus.Up))
                     .Add(TestMember.Create(address2, MemberStatus.Up))
                     .Add(TestMember.Create(address3, MemberStatus.Up));

            var u2 = Member.PickNextTransition(s4, s1);

            u2.Should().BeEquivalentTo(s5);
            u2.Single(x => x.Address.Equals(address1)).Status.Should().Be(MemberStatus.Up);
        }