public void Start()
        {
            lock (StateLock)
            {
                if (IsStarted)
                {
                    throw new InvalidOperationException("Cluster is already started");
                }
                if (IsDisposed)
                {
                    throw new ObjectDisposedException("Cluster is already disposed");
                }

                OnStarting();

                allNodes     = endpoints.Select(CreateNode).ToArray();
                ioQueue      = new NodeQueue(allNodes);
                workingNodes = allNodes.ToArray();
                allNodes.IntoDictionary(reconnectPolicies, n => n, reconnectPolicyFactory.Create);

                locator.Initialize(allNodes);
                worker.Start();

                OnStarted();
            }
        }
		public virtual void Start()
		{
			allNodes = endpoints.Select(CreateNode).ToArray();
			ioQueue = new NodeQueue(allNodes);
			workingNodes = allNodes.ToArray();
			locator.Initialize(allNodes);

			worker.Start();
		}
        public virtual void Start()
        {
            allNodes     = endpoints.Select(CreateNode).ToArray();
            ioQueue      = new NodeQueue(allNodes);
            workingNodes = allNodes.ToArray();
            locator.Initialize(allNodes);

            worker.Start();
        }
Exemple #4
0
        public virtual void Start()
        {
            lock (StateLock)
            {
                if (isDisposed)
                {
                    throw new ObjectDisposedException("Cluster is already disposed");
                }
                if (allNodes != null)
                {
                    throw new InvalidOperationException("Cluster is already initialized");
                }

                allNodes     = endpoints.Select(CreateNode).ToArray();
                ioQueue      = new NodeQueue(allNodes);
                workingNodes = allNodes.ToArray();
                locator.Initialize(allNodes);

                worker.Start();
            }
        }
        private NodeQueue ioQueue;         // the nodes that has IO pending

        protected ClusterBase(IEnumerable <IPEndPoint> endpoints, INodeLocator locator, IReconnectPolicyFactory reconnectPolicyFactory)
        {
            var finalEndpoints = (endpoints ?? throw new ArgumentNullException(nameof(endpoints))).ToArray();

            if (finalEndpoints.Length < 1)
            {
                throw new ArgumentException("Must provide at least one endpoint to connect to", nameof(endpoints));
            }

            this.endpoints              = finalEndpoints;
            this.locator                = locator ?? throw new ArgumentNullException(nameof(locator));
            this.reconnectPolicies      = new Dictionary <INode, IReconnectPolicy>();
            this.reconnectPolicyFactory = reconnectPolicyFactory;
            this.ioQueue                = NodeQueue.Empty;

            StateLock     = new object();
            shutdownToken = new CancellationTokenSource();
            workerIsDone  = new ManualResetEventSlim(false);
            worker        = new Thread(Worker)
            {
                Name = "IO Thread {" + String.Join(", ", finalEndpoints.Select(e => e.ToString())) + "}"
            };
        }