Пример #1
0
        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);
                }
            });
        }
Пример #2
0
        public Task <HttpResponseMessage> CanInstallSnapshot([FromUri] CanInstallSnapshotRequest request)
        {
            var taskCompletionSource = new TaskCompletionSource <HttpResponseMessage>();

            _bus.Publish(request, taskCompletionSource);
            return(taskCompletionSource.Task);
        }
Пример #3
0
        public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req)
        {
            if (_linkedTokenSource.IsCancellationRequested)
            {
                return;
            }

            _sender.Send(dest, req);
        }
Пример #4
0
 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
     });
 }
Пример #5
0
        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
            });
        }
Пример #6
0
        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);
                });
            }
        }
Пример #7
0
 public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req)
 {
     _sender.Send(dest, req);
 }
Пример #8
0
 public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req)
 {
     _parent.AddToQueue(this, dest.Name, req);
 }