예제 #1
0
        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;
        }
예제 #2
0
        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);
        }