internal ReceivedLogEntry(ref ReadOnlyMemory <byte> prologue, PipeReader reader) { var count = EntriesExchange.ParseLogEntryPrologue(prologue.Span, out length, out term, out timestamp, out isSnapshot); prologue = prologue.Slice(count); this.reader = reader; }
internal ReceivedLogEntry(ref ReadOnlyMemory <byte> prologue, PipeReader reader) { var count = EntriesExchange.ParseLogEntryPrologue(prologue.Span, out metadata); prologue = prologue.Slice(count); this.reader = reader; }
private void BeginReceiveEntries(EndPoint sender, ReadOnlySpan <byte> announcement, CancellationToken token) { lookupIndex = -1; state = State.AppendEntriesReceived; EntriesExchange.ParseAnnouncement(announcement, out var remotePort, out var term, out var prevLogIndex, out var prevLogTerm, out var commitIndex, out remainingCount); ChangePort(ref sender, remotePort); task = server.ReceiveEntriesAsync(sender, term, this, prevLogIndex, prevLogTerm, commitIndex, token); }
private async ValueTask <(PacketHeaders, int, bool)> TransmissionControl(Memory <byte> output, CancellationToken token) { MessageType responseType; int count; bool isContinueReceiving; var resultTask = Cast <Task <Result <bool> > >(task); var stateTask = transmissionStateTrigger.WaitAsync(this, IsValidStateForResponsePredicate, token); // wait for result or state transition if (ReferenceEquals(resultTask, await Task.WhenAny(resultTask, stateTask).ConfigureAwait(false))) { // result obtained, finalize transmission task = null; state = State.ReceivingEntriesFinished; remainingCount = 0; count = IExchange.WriteResult(resultTask.Result, output.Span); isContinueReceiving = false; responseType = MessageType.None; } else { // should be in sync with IsValidStateForResponse switch (state) { case State.ReceivingEntriesFinished: count = IExchange.WriteResult(await resultTask.ConfigureAwait(false), output.Span); isContinueReceiving = false; responseType = MessageType.None; break; case State.ReadyToReceiveEntry: count = EntriesExchange.CreateNextEntryResponse(output.Span, lookupIndex); isContinueReceiving = true; responseType = MessageType.NextEntry; break; case State.ReceivingEntry: count = 0; isContinueReceiving = true; responseType = MessageType.Continue; break; default: throw new InvalidOperationException(); } } return(new PacketHeaders(responseType, FlowControl.Ack), count, isContinueReceiving); }