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
			};
		}
Пример #2
0
		public void Send(NodeConnectionInfo dest, CanInstallSnapshotRequest req)
		{
			_sender.Send(dest, req);
		}
Пример #3
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
			};
		}
Пример #4
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);
				});
			}
		}