public void ClusterMessages_must_be_serializable()
        {
            var address        = new Address("akka.tcp", "system", "some.host.org", 4711);
            var uniqueAddress  = new UniqueAddress(address, 17);
            var address2       = new Address("akka.tcp", "system", "other.host.org", 4711);
            var uniqueAddress2 = new UniqueAddress(address2, 18);

            CheckSerialization(new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar")));
            CheckSerialization(new ClusterUserAction.Leave(address));
            CheckSerialization(new ClusterUserAction.Down(address));
            CheckSerialization(new InternalClusterAction.InitJoin());
            CheckSerialization(new InternalClusterAction.InitJoinAck(address));
            CheckSerialization(new InternalClusterAction.InitJoinNack(address));
            CheckSerialization(new ClusterHeartbeatSender.Heartbeat(address));
            CheckSerialization(new ClusterHeartbeatSender.HeartbeatRsp(uniqueAddress));

            var node1 = new VectorClock.Node("node1");
            var node2 = new VectorClock.Node("node2");
            var node3 = new VectorClock.Node("node3");
            var node4 = new VectorClock.Node("node4");
            var g1    =
                new Gossip(ImmutableSortedSet.Create(a1, b1, c1, d1)).Increment(node1)
                .Increment(node2)
                .Seen(a1.UniqueAddress)
                .Seen(b1.UniqueAddress);
            var g2            = g1.Increment(node3).Increment(node4).Seen(a1.UniqueAddress).Seen(c1.UniqueAddress);
            var reachability3 =
                Reachability.Empty.Unreachable(a1.UniqueAddress, e1.UniqueAddress)
                .Unreachable(b1.UniqueAddress, e1.UniqueAddress);
            var g3 = g2.Copy(members: ImmutableSortedSet.Create(a1, b1, c1, d1, e1),
                             overview: g2.Overview.Copy(reachability: reachability3));

            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g1));
            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g2));
            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g3));

            CheckSerialization(new GossipStatus(a1.UniqueAddress, g1.Version));
            CheckSerialization(new GossipStatus(a1.UniqueAddress, g2.Version));
            CheckSerialization(new GossipStatus(a1.UniqueAddress, g3.Version));

            CheckSerialization(new InternalClusterAction.Welcome(uniqueAddress, g2));

            var mg = new MetricsGossip(ImmutableHashSet.Create <NodeMetrics>(new[]
            {
                new NodeMetrics(a1.Address, 4711, ImmutableHashSet.Create <Metric>(new Metric("foo", 1.2, null))),
                new NodeMetrics(b1.Address, 4712,
                                ImmutableHashSet.Create <Metric>(new Metric("foo", 2.1, new EWMA(100.0, 0.18))
                                                                 , new Metric("bar1", Double.MinValue, null), new Metric("bar2", float.MaxValue, null),
                                                                 new Metric("bar3", int.MaxValue, null), new Metric("bar4", long.MaxValue, null),
                                                                 new Metric("bar5", double.MaxValue, null)))
            }));

            CheckSerialization(new MetricsGossipEnvelope(a1.Address, mg, true));
        }
示例#2
0
        /// <summary>
        /// Receives changes from peer nodes, merges remote with local gossip nodes, then publishes
        /// changes to the event stream for load balancing router consumption, and gossip back.
        /// </summary>
        private void ReceiveGossip(MetricsGossipEnvelope envelope)
        {
            // remote node might not have same view of member nodes, this side should only care
            // about nodes that are known here, otherwise removed nodes can come back
            var otherGossip = envelope.Gossip.Filter(_nodes.Select(n => n).ToImmutableHashSet());

            _latestGossip = _latestGossip.Merge(otherGossip);

            // changes will be published in the period collect task
            if (!envelope.Reply)
            {
                ReplyGossipTo(envelope.FromAddress);
            }
        }
示例#3
0
        public void Cluster_messages_should_be_serializable()
        {
            var metrics = ImmutableHashSet <NodeMetrics> .Empty;

            metrics = metrics.Add(new NodeMetrics(_a1.Address, 4711, new []
            {
                new NodeMetrics.Types.Metric("foo", 1.2, Option <NodeMetrics.Types.EWMA> .None)
            }));
            metrics = metrics.Add(new NodeMetrics(_b1.Address, 4712, new []
            {
                new NodeMetrics.Types.Metric("foo", 2.1, new NodeMetrics.Types.EWMA(value: 100, alpha: 0.18)),
                new NodeMetrics.Types.Metric("bar1", double.MaxValue, Option <NodeMetrics.Types.EWMA> .None),
                new NodeMetrics.Types.Metric("bar2", float.MaxValue, Option <NodeMetrics.Types.EWMA> .None),
                new NodeMetrics.Types.Metric("bar3", int.MaxValue, Option <NodeMetrics.Types.EWMA> .None),
                new NodeMetrics.Types.Metric("bar4", long.MaxValue, Option <NodeMetrics.Types.EWMA> .None),
            }));

            var gossip = new MetricsGossip(metrics);

            CheckSerialization(new MetricsGossipEnvelope(_a1.Address, gossip, true));
        }
        public void ClusterMessages_must_be_serializable()
        {
            var address = new Address("akka.tcp", "system", "some.host.org", 4711);
            var uniqueAddress = new UniqueAddress(address, 17);
            var address2 = new Address("akka.tcp", "system", "other.host.org", 4711);
            var uniqueAddress2 = new UniqueAddress(address2, 18);
            CheckSerialization(new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo","bar")));
            CheckSerialization(new ClusterUserAction.Leave(address));
            CheckSerialization(new ClusterUserAction.Down(address));
            CheckSerialization(new InternalClusterAction.InitJoin());
            CheckSerialization(new InternalClusterAction.InitJoinAck(address));
            CheckSerialization(new InternalClusterAction.InitJoinNack(address));
            CheckSerialization(new ClusterHeartbeatSender.Heartbeat(address));
            CheckSerialization(new ClusterHeartbeatSender.HeartbeatRsp(uniqueAddress));

            var node1 = new VectorClock.Node("node1");
            var node2 = new VectorClock.Node("node2");
            var node3 = new VectorClock.Node("node3");
            var node4 = new VectorClock.Node("node4");
            var g1 =
                new Gossip(ImmutableSortedSet.Create(a1, b1, c1, d1)).Increment(node1)
                    .Increment(node2)
                    .Seen(a1.UniqueAddress)
                    .Seen(b1.UniqueAddress);
            var g2 = g1.Increment(node3).Increment(node4).Seen(a1.UniqueAddress).Seen(c1.UniqueAddress);
            var reachability3 =
                Reachability.Empty.Unreachable(a1.UniqueAddress, e1.UniqueAddress)
                    .Unreachable(b1.UniqueAddress, e1.UniqueAddress);
            var g3 = g2.Copy(members: ImmutableSortedSet.Create(a1, b1, c1, d1, e1),
                overview: g2.Overview.Copy(reachability: reachability3));
            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g1));
            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g2));
            CheckSerialization(new GossipEnvelope(a1.UniqueAddress, uniqueAddress2, g3));

            CheckSerialization(new GossipStatus(a1.UniqueAddress, g1.Version));
            CheckSerialization(new GossipStatus(a1.UniqueAddress, g2.Version));
            CheckSerialization(new GossipStatus(a1.UniqueAddress, g3.Version));

            CheckSerialization(new InternalClusterAction.Welcome(uniqueAddress, g2));

            var mg = new MetricsGossip(ImmutableHashSet.Create<NodeMetrics>(new[]
            {
                new NodeMetrics(a1.Address, 4711, ImmutableHashSet.Create<Metric>(new Metric("foo", 1.2, null))),
                new NodeMetrics(b1.Address, 4712,
                    ImmutableHashSet.Create<Metric>(new Metric("foo", 2.1, new EWMA(100.0, 0.18))
                        , new Metric("bar1", Double.MinValue, null), new Metric("bar2", float.MaxValue, null),
                        new Metric("bar3", int.MaxValue, null), new Metric("bar4", long.MaxValue, null), 
                        new Metric("bar5", double.MaxValue, null)))
            }));
            CheckSerialization(new MetricsGossipEnvelope(a1.Address, mg, true));
        }
示例#5
0
 /// <summary>
 /// Samples the latest metrics for the node, updates metrics statistics in
 /// <see cref="MetricsGossip"/>, and publishes the change to the event bus.
 ///
 /// <seealso cref="IMetricsCollector"/>
 /// </summary>
 private void Sample()
 {
     _latestGossip += _collector.Sample();
     Publish();
 }
示例#6
0
 /// <summary>
 /// Removes a member from the member node ring.
 /// </summary>
 private void RemoveMember(Member member)
 {
     _nodes        = _nodes.Remove(member.Address);
     _latestGossip = _latestGossip.Remove(member.Address);
     Publish();
 }