Ejemplo n.º 1
0
        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);
                    }
                });
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                }
            });
        }