public void SendInstallSnapshot(int peerId, long term, long index, long length, int partSize, int part, byte[] data, InstallSnapshotResponseHandler handler) { if (rafts.TryGetValue(peerId, out var r)) { Task.Run(() => { // await Task.Delay(randomDelay()); try { r.HandleInstallSnapshotRequest(term, index, length, partSize, part, data, handler); } catch (Exception) { //logger.error(t.getMessage(), t); } }); } }
public void HandleInstallSnapshotRequest(long term, long index, long length, int partSize, int part, byte[] data, InstallSnapshotResponseHandler handler) { logger.LogInformation($"handleInstallSnapshot: length={length} part={part}"); RescheduleElection(); var file = new FileInfo(Path.Combine(Log.LogDirectoryName, "raft.installing.snapshot")); if (file.Exists && part == 0) { file.Delete(); } if (part == 0 || file.Exists) { if (file.Length == partSize * part) { try { using (var stream = file.OpenWrite()) { using (var raf = new BinaryWriter(stream)) { raf.Seek(partSize * part, SeekOrigin.Begin); raf.Write(data); if (stream.Length == length) { File.Move(file.FullName, Path.Combine(Log.LogDirectoryName, "raft.snapshot")); Log.LoadSnapshot(); RescheduleElection(); } handler(true); return; } } } catch (IOException e) { logger.LogError(e.Message); } } } handler(false); }
void IRaftRPC.SendInstallSnapshot(int peerId, long term, long index, long length, int partSize, int part, byte[] data, InstallSnapshotResponseHandler handler) { var peer = Configuration.GetPeer(peerId); var msg = new RequestMessage(peerId, term, index, length, partSize, part, Convert.ToBase64String(data)); Task.Run(async() => { var response = await sender.SendMessage(peer, msg) as ResponseMessage; if (response != null) { handler(response.Success); } }); }