Example #1
0
 public async Task SendJoinServerAsync(NodeConnectionInfo nodeConnectionInfo)
 {
     try
     {
         await raftEngine.AddToClusterAsync(nodeConnectionInfo).ConfigureAwait(false);
     }
     catch (NotLeadingException)
     {
         await SendJoinServerInternalAsync(raftEngine.GetLeaderNode(WaitForLeaderTimeoutInSeconds), nodeConnectionInfo).ConfigureAwait(false);
     }
 }
Example #2
0
        public async Task <HttpResponseMessage> Join([FromUri] string url, [FromUri] string name)
        {
            var uri = new Uri(url);

            name = name ?? uri.Host + (uri.IsDefaultPort ? "" : ":" + uri.Port);

            await RaftEngine.AddToClusterAsync(new NodeConnectionInfo
            {
                Name = name,
                Uri  = uri
            });

            return(new HttpResponseMessage(HttpStatusCode.Accepted));
        }
Example #3
0
		protected RaftEngine CreateNetworkAndGetLeader(int nodeCount, int messageTimeout = -1)
		{
			var leaderIndex = new Random().Next(0, nodeCount);
			if (messageTimeout == -1)
				messageTimeout = Debugger.IsAttached ? 3 * 1000 : 500;
			var nodeNames = new string[nodeCount];
			for (int i = 0; i < nodeCount; i++)
			{
				nodeNames[i] = "node" + i;
			}

			WriteLine("{0} selected as seed", nodeNames[leaderIndex]);
			var allNodesFinishedJoining = new ManualResetEventSlim();
			for (int index = 0; index < nodeNames.Length; index++)
			{
				var nodeName = nodeNames[index];
				var storageEnvironmentOptions = StorageEnvironmentOptions.CreateMemoryOnly();
				storageEnvironmentOptions.OwnsPagers = false;
				var options = CreateNodeOptions(nodeName, messageTimeout, storageEnvironmentOptions, nodeNames);
				if (leaderIndex == index)
				{
					PersistentState.ClusterBootstrap(options);
				}
				storageEnvironmentOptions.OwnsPagers = true;
				var engine = new RaftEngine(options);
				_nodes.Add(engine);
				if (leaderIndex == index)
				{
					engine.TopologyChanged += command =>
					{
						if (command.Requested.AllNodeNames.All(command.Requested.IsVoter))
						{
							allNodesFinishedJoining.Set();
						}
					};
					for (int i = 0; i < nodeNames.Length; i++)
					{
						if (i == leaderIndex)
							continue;
						Assert.True(engine.AddToClusterAsync(new NodeConnectionInfo { Name = nodeNames[i] }).Wait(3000));
					}
				}
			}
			if (nodeCount == 1)
				allNodesFinishedJoining.Set();
			Assert.True(allNodesFinishedJoining.Wait(5000 * nodeCount));

			var raftEngine = _nodes[leaderIndex];


			var transport = (InMemoryTransportHub.InMemoryTransport)_inMemoryTransportHub.CreateTransportFor(raftEngine.Name);
			transport.ForceTimeout();
			Assert.True(_nodes[leaderIndex].WaitForLeader());
			var leader = _nodes.FirstOrDefault(x => x.State == RaftEngineState.Leader);
			Assert.NotNull(leader);

			return _nodes[leaderIndex];
		}
Example #4
0
        protected RaftEngine CreateNetworkAndGetLeader(int nodeCount, int messageTimeout = -1)
        {
            var leaderIndex = new Random().Next(0, nodeCount);

            if (messageTimeout == -1)
            {
                messageTimeout = Debugger.IsAttached ? 3 * 1000 : 500;
            }
            var nodeNames = new string[nodeCount];

            for (int i = 0; i < nodeCount; i++)
            {
                nodeNames[i] = "node" + i;
            }

            WriteLine("{0} selected as seed", nodeNames[leaderIndex]);
            var allNodesFinishedJoining = new ManualResetEventSlim();

            for (int index = 0; index < nodeNames.Length; index++)
            {
                var nodeName = nodeNames[index];
                var storageEnvironmentOptions = StorageEnvironmentOptions.CreateMemoryOnly();
                storageEnvironmentOptions.OwnsPagers = false;
                var options = CreateNodeOptions(nodeName, messageTimeout, storageEnvironmentOptions, nodeNames);
                if (leaderIndex == index)
                {
                    PersistentState.ClusterBootstrap(options);
                }
                storageEnvironmentOptions.OwnsPagers = true;
                var engine = new RaftEngine(options);
                _nodes.Add(engine);
                if (leaderIndex == index)
                {
                    engine.TopologyChanged += command =>
                    {
                        if (command.Requested.AllNodeNames.All(command.Requested.IsVoter))
                        {
                            allNodesFinishedJoining.Set();
                        }
                    };
                    for (int i = 0; i < nodeNames.Length; i++)
                    {
                        if (i == leaderIndex)
                        {
                            continue;
                        }
                        Assert.True(engine.AddToClusterAsync(new NodeConnectionInfo {
                            Name = nodeNames[i]
                        }).Wait(3000));
                    }
                }
            }
            if (nodeCount == 1)
            {
                allNodesFinishedJoining.Set();
            }
            Assert.True(allNodesFinishedJoining.Wait(5000 * nodeCount));

            var raftEngine = _nodes[leaderIndex];


            var transport = (InMemoryTransportHub.InMemoryTransport)_inMemoryTransportHub.CreateTransportFor(raftEngine.Name);

            transport.ForceTimeout();
            Assert.True(_nodes[leaderIndex].WaitForLeader());
            var leader = _nodes.FirstOrDefault(x => x.State == RaftEngineState.Leader);

            Assert.NotNull(leader);

            return(_nodes[leaderIndex]);
        }