public async Task SendJoinServerAsync(NodeConnectionInfo nodeConnectionInfo) { try { await raftEngine.AddToClusterAsync(nodeConnectionInfo).ConfigureAwait(false); } catch (NotLeadingException) { await SendJoinServerInternalAsync(raftEngine.GetLeaderNode(WaitForLeaderTimeoutInSeconds), nodeConnectionInfo).ConfigureAwait(false); } }
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)); }
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]; }
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]); }