private void ParseCommand(ref ReadOnlySequence <byte> buffer) { if (_clientManager.SupportAcknowledgement) { ReadAcknowledgement(ref buffer); } short cmdType = 0; if (_clientManager.ClientVersion >= 5000) { var cmdTypeBuffer = buffer.Slice(0, 2); if (cmdTypeBuffer.First.Span.Length >= 2) { cmdType = HelperFxn.ConvertToShort(cmdTypeBuffer.First.Span); } else { cmdType = HelperFxn.ConvertToShort(cmdTypeBuffer.ToArray()); } buffer = buffer.Slice(2, buffer.End); } var commandLengthBuffer = buffer.Slice(0, _headerLength); var cmdLength = RequestDeserializer.ToInt32(commandLengthBuffer.ToArray(), 0, _headerLength); buffer = buffer.Slice(_headerLength, buffer.End); var commandBuffer = buffer.Slice(0, cmdLength); object command = null; using (var stream = new MemoryStream(commandBuffer.ToArray())) command = RequestDeserializer.Deserialize(cmdType, stream); buffer = buffer.Slice(cmdLength, buffer.End); if (CommandHelper.IsBasicCRUDOperation((Common.Protobuf.Command.Type)cmdType)) { _cmdManager.ProcessCommand(_clientManager, command, cmdType, _acknowledgementId, null, buffer.Length > 0); } else { //Due to response pipelining, old responses of basic CRUD operations are queued for sending //therefore before executing this long running command, we should send those responses _clientManager.SendPendingResponses(true); ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessCommandAsync), new LongRunningCommand() { Command = command, CommandType = cmdType, AcknowledgementId = _acknowledgementId }); } _expectedLength = null; _acknowledgementId = -1; }
private bool ReadHeader(ref ReadOnlySequence <byte> buffer) { if (buffer.Length >= _headerLength) { _expectedLength = RequestDeserializer.ToInt32(buffer.Slice(0, _headerLength).ToArray(), 0, _headerLength); buffer = buffer.Slice(_headerLength, buffer.End); return(true); } return(false); }