public void Send(NodeConnectionInfo dest, DisconnectedFromCluster req) { LogStatus("disconnect " + dest, async() => { var requestUri = string.Format("raft/disconnectFromCluster?term={0}&from={1}&clusterTopologyId={2}", req.Term, req.From, req.ClusterTopologyId); using (var request = CreateRequest(dest, null, requestUri, HttpMethods.Get, _log)) { var httpResponseMessage = await request.ExecuteAsync().ConfigureAwait(false); UpdateConnectionFailureCounts(dest, httpResponseMessage); var reply = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); if (httpResponseMessage.IsSuccessStatusCode == false) { _log.Warn("Error sending disconnecton notification to {0}. Status: {1}\r\n{2}\r\nreason:{3}", dest.Name, httpResponseMessage.StatusCode, httpResponseMessage, reply, httpResponseMessage.ReasonPhrase); return; } if (httpResponseMessage.StatusCode == HttpStatusCode.NotAcceptable) { _log.Warn("Error sending disconnecton notification to {0}. Status: NotAcceptable\r\nreason:{1}\r\ncontent{2}", dest.Name, httpResponseMessage.ReasonPhrase, reply); } SendToSelf(new NothingToDo()); } }); }
public void Handle(DisconnectedFromCluster req) { if (FromOurTopology(req) == false) { _log.Info("Got a disconnection notification message outside my cluster topology (id: {0}), ignoring", req.ClusterTopologyId); return; } if (req.Term < Engine.PersistentState.CurrentTerm) { _log.Info("Got disconnection notification from an older term, ignoring"); return; } if (req.From != Engine.CurrentLeader) { _log.Info("Got disconnection notification from {0}, who isn't the current leader, ignoring.", req.From); return; } _log.Warn("Got disconnection notification from the leader, clearing topology and moving to idle follower state"); var tcc = new TopologyChangeCommand { Requested = new Topology(req.ClusterTopologyId) }; Engine.PersistentState.SetCurrentTopology(tcc.Requested, 0L); Engine.StartTopologyChange(tcc); Engine.CommitTopologyChange(tcc); Engine.SetState(RaftEngineState.Follower); }
public Task <HttpResponseMessage> DisconnectFromCluster([FromUri] DisconnectedFromCluster request) { var taskCompletionSource = new TaskCompletionSource <HttpResponseMessage>(); _bus.Publish(request, taskCompletionSource); return(taskCompletionSource.Task); }
public void Send(NodeConnectionInfo dest, DisconnectedFromCluster req) { if (_linkedTokenSource.IsCancellationRequested) { return; } _sender.Send(dest, req); }
public void Send(NodeConnectionInfo dest, DisconnectedFromCluster req) { HttpClient client; using (GetConnection(dest, out client)) { LogStatus("disconnect " + dest, async() => { var message = await client.GetAsync(string.Format("raft/disconnectFromCluster?term={0}&from={1}&clusterTopologyId={2}", req.Term, req.From, req.ClusterTopologyId)); var reply = await message.Content.ReadAsStringAsync(); if (message.IsSuccessStatusCode == false) { _log.Warn("Error sending disconnecton notification to {0}. Status: {1}\r\n{2}", dest.Name, message.StatusCode, message, reply); return; } SendToSelf(new NothingToDo()); }); } }
public void Send(NodeConnectionInfo dest, DisconnectedFromCluster req) { _sender.Send(dest, req); }
public void Send(NodeConnectionInfo dest, DisconnectedFromCluster req) { _parent.AddToQueue(this, dest.Name, req); }