public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req) { LogStatus("can install snapshot to " + dest, async() => { var requestUri = string.Format("raft/canInstallSnapshot?term={0}&index={1}&from={2}&clusterTopologyId={3}", req.Term, req.Index, 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 && httpResponseMessage.StatusCode != HttpStatusCode.NotAcceptable) { _log.Warn("Error checking if can install snapshot to {0}. Status: {1}\r\n{2}\r\nreason:{3}", dest.Name, httpResponseMessage.StatusCode, reply, httpResponseMessage.ReasonPhrase); return; } if (httpResponseMessage.StatusCode == HttpStatusCode.NotAcceptable) { _log.Warn("Error checking if can install snapshot to {0}. Status: NotAcceptable\r\nreason:{1}\r\ncontent{2}", dest.Name, httpResponseMessage.ReasonPhrase, reply); } var canInstallSnapshotResponse = JsonConvert.DeserializeObject <CanInstallSnapshotResponse>(reply); SendToSelf(canInstallSnapshotResponse); } }); }
public Task <HttpResponseMessage> CanInstallSnapshot([FromUri] CanInstallSnapshotRequest request) { var taskCompletionSource = new TaskCompletionSource <HttpResponseMessage>(); _bus.Publish(request, taskCompletionSource); return(taskCompletionSource.Task); }
public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req) { if (_linkedTokenSource.IsCancellationRequested) { return; } _sender.Send(dest, req); }
public override CanInstallSnapshotResponse Handle(CanInstallSnapshotRequest req) { if (_installingSnapshot == null) { return(base.Handle(req)); } return(new CanInstallSnapshotResponse { From = Engine.Name, ClusterTopologyId = Engine.CurrentTopology.TopologyId, IsCurrentlyInstalling = true, Message = "The node is in the process of installing a snapshot", Success = false }); }
public virtual CanInstallSnapshotResponse Handle(CanInstallSnapshotRequest req) { var lastLogEntry = Engine.PersistentState.LastLogEntry(); var index = lastLogEntry.Index; if (FromOurTopology(req) == false) { _log.Info("Got a can install snapshot message outside my cluster topology (id: {0}), ignoring", req.ClusterTopologyId); return(new CanInstallSnapshotResponse { From = Engine.Name, ClusterTopologyId = Engine.CurrentTopology.TopologyId, IsCurrentlyInstalling = false, Message = "Cannot install a snapshot from a node outside my topoloyg. My topology id is: " + req.ClusterTopologyId, Success = false, Index = index, Term = Engine.PersistentState.CurrentTerm }); } if (req.Term <= Engine.PersistentState.CurrentTerm && req.Index <= index) { return(new CanInstallSnapshotResponse { From = Engine.Name, ClusterTopologyId = Engine.CurrentTopology.TopologyId, IsCurrentlyInstalling = false, Message = String.Format("Term or Index do not match the ones on this node. Cannot install snapshot. (CurrentTerm = {0}, req.Term = {1}, LastLogEntry index = {2}, req.Index = {3}", Engine.PersistentState.CurrentTerm, req.Term, index, req.Index), Success = false, Index = index, Term = Engine.PersistentState.CurrentTerm }); } Engine.SetState(RaftEngineState.SnapshotInstallation); return(new CanInstallSnapshotResponse { From = Engine.Name, ClusterTopologyId = Engine.CurrentTopology.TopologyId, IsCurrentlyInstalling = false, Message = "Everything ok, go ahead, install the snapshot!", Success = true }); }
public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req) { HttpClient client; using (GetConnection(dest, out client)) { LogStatus("can install snapshot to " + dest, async() => { var requestUri = string.Format("raft/canInstallSnapshot?term={0}&=index{1}&from={2}&clusterTopologyId={3}", req.Term, req.Index, req.From, req.ClusterTopologyId); var httpResponseMessage = await client.GetAsync(requestUri); var reply = await httpResponseMessage.Content.ReadAsStringAsync(); if (httpResponseMessage.IsSuccessStatusCode == false && httpResponseMessage.StatusCode != HttpStatusCode.NotAcceptable) { _log.Warn("Error checking if can install snapshot to {0}. Status: {1}\r\n{2}", dest.Name, httpResponseMessage.StatusCode, reply); return; } var canInstallSnapshotResponse = JsonConvert.DeserializeObject <CanInstallSnapshotResponse>(reply); SendToSelf(canInstallSnapshotResponse); }); } }
public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req) { _sender.Send(dest, req); }
public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req) { _parent.AddToQueue(this, dest.Name, req); }