Ejemplo n.º 1
0
        /// <summary>
        /// The set of Akka.Cluster nodes designated for receiving heartbeats from this node.
        /// </summary>
        /// <param name="sender">The node sending heartbeats.</param>
        /// <returns>An organized ring of unique nodes.</returns>
        public IImmutableSet <UniqueAddress> Receivers(UniqueAddress sender)
        {
            if (_useAllAsReceivers)
            {
                return(NodeRing.Remove(sender));
            }
            else
            {
                // Pick nodes from the iterator until n nodes that are not unreachable have been selected.
                // Intermediate unreachable nodes up to `monitoredByNrOfMembers` are also included in the result.
                // The reason for not limiting it to strictly monitoredByNrOfMembers is that the leader must
                // be able to continue its duties (e.g. removal of downed nodes) when many nodes are shutdown
                // at the same time and nobody in the remaining cluster is monitoring some of the shutdown nodes.
                (int, ImmutableSortedSet <UniqueAddress>) Take(int n, IEnumerator <UniqueAddress> iter, ImmutableSortedSet <UniqueAddress> acc, ImmutableHashSet <UniqueAddress> unreachable, int monitoredByNumberOfNodes)
                {
                    while (true)
                    {
                        if (iter.MoveNext() == false || n == 0)
                        {
                            iter.Dispose(); // dispose enumerator
                            return(n, acc);
                        }
                        else
                        {
                            var next          = iter.Current;
                            var isUnreachable = unreachable.Contains(next);
                            if (isUnreachable && acc.Count >= monitoredByNumberOfNodes)
                            {
                            }
                            else if (isUnreachable)
                            {
                                acc = acc.Add(next);
                            }
                            else
                            {
                                n   = n - 1;
                                acc = acc.Add(next);
                            }
                        }
                    }
                }

                var(remaining, slice1) = Take(MonitoredByNumberOfNodes, NodeRing.From(sender).Skip(1).GetEnumerator(), ImmutableSortedSet <UniqueAddress> .Empty, Unreachable, MonitoredByNumberOfNodes);

                IImmutableSet <UniqueAddress> slice = remaining == 0
                    ? slice1 // or, wrap-around
                    : Take(remaining, NodeRing.TakeWhile(x => x != sender).GetEnumerator(), slice1, Unreachable, MonitoredByNumberOfNodes).Item2;

                return(slice);
            }
        }
Ejemplo n.º 2
0
        public ImmutableHashSet <UniqueAddress> Receivers(UniqueAddress sender)
        {
            if (_useAllAsReceivers)
            {
                return(NodeRing.Remove(sender).ToImmutableHashSet());
            }
            var slice = NodeRing.From(sender).Skip(1).Take(MonitoredByNumberOfNodes).ToList(); //grab members furthest from this peer

            if (slice.Count < MonitoredByNumberOfNodes)
            {
                slice = slice.Concat(NodeRing.Take(MonitoredByNumberOfNodes - slice.Count)).ToList();
            }
            return(slice.ToImmutableHashSet());
        }
Ejemplo n.º 3
0
        public override Node Release(CanvasHolder canvasHolder, Generators.IDGenerator generator)
        {
            Node generatedNode = new Node(x, y, width);

            generatedNode.Title = title;
            foreach (NodeRingHolder nodeRingHolder in canvasHolder.nodeRingHolders)
            {
                if (nodeRingHolder.parentId == this.id)
                {
                    nodeRingHolder.SetParent(generatedNode);
                    NodeRing generatedNodeRing = nodeRingHolder.Release(canvasHolder, generator);
                    generatedNode.AddElement(generatedNodeRing);
                }
            }
            generator.Add(id, generatedNode);
            return(generatedNode);
        }
        public CanvasHolder(Canvas canvas)
        {
            var canvasDrawables = canvas.Drawbles;

            translation = canvas.Translation;
            List <NodeHolder>     nodeHoldersList     = new List <NodeHolder>();
            List <NodeRingHolder> nodeRingHoldersList = new List <NodeRingHolder>();
            List <WireHolder>     wireHoldersList     = new List <WireHolder>();
            IDGenerator           idGenerator         = new IDGenerator();

            foreach (Drawable d in canvasDrawables)
            {
                if (d.GetType() == typeof(Node))
                {
                    Node            node               = (Node)d;
                    ID              nodeId             = idGenerator.Add(node);
                    List <Drawable> nodeElements       = node.Elements;
                    int[]           nodeHolderElements = new int[nodeElements.Count];
                    for (int i = 0; i < nodeElements.Count; i++)
                    {
                        NodeRing nodeRing   = (NodeRing)nodeElements[i];
                        ID       nodeRingId = idGenerator.Add(nodeRing);
                        nodeHolderElements[i] = nodeRingId.value;
                        nodeRingHoldersList.Add(new NodeRingHolder(nodeRingId.value, nodeId.value, nodeRing.Title, nodeRing.Color, nodeRing.Direction));
                    }
                    nodeHoldersList.Add(new NodeHolder(nodeId.value, node.BoundingBox.X, node.BoundingBox.Y, node.BoundingBox.Width, node.Title, nodeHolderElements));
                }
            }
            foreach (Drawable d in canvasDrawables)
            {
                if (d.GetType() == typeof(Wire))
                {
                    Wire wire   = (Wire)d;
                    ID   wireId = idGenerator.Add(wire);
                    wireHoldersList.Add(new WireHolder(wireId.value, idGenerator.Find(wire.Start.Drawable).value, idGenerator.Find(wire.End.Drawable).value));
                }
            }
            nodeHolders     = nodeHoldersList.ToArray();
            nodeRingHolders = nodeRingHoldersList.ToArray();
            wireHolders     = wireHoldersList.ToArray();
        }
Ejemplo n.º 5
0
 public NodeRingIndex(NodeRing nodeRing, int newIndex)
 {
     this.nodeRing = nodeRing;
     this.newIndex = newIndex;
 }