Ejemplo n.º 1
0
        public override void CompleteRMW(long ctx, core.Status status)
        {
            byte *d    = responseObject.obj.bufferPtr;
            var   dend = d + responseObject.obj.buffer.Length;

            if ((int)(dend - dcurr) < 7)
            {
                SendAndReset(ref d, ref dend);
            }

            hrw.Write(MessageType.PendingResult, ref dcurr, (int)(dend - dcurr));
            hrw.Write((MessageType)(ctx >> 32), ref dcurr, (int)(dend - dcurr));
            Write((int)(ctx & 0xffffffff), ref dcurr, (int)(dend - dcurr));
            Write(ref status, ref dcurr, (int)(dend - dcurr));
            msgnum++;
        }
Ejemplo n.º 2
0
        public override void CompleteRead(ref Output output, long ctx, core.Status status)
        {
            byte *d    = networkSender.GetResponseObjectHead();
            var   dend = networkSender.GetResponseObjectTail();

            if ((int)(dend - dcurr) < 7 + networkSender.GetMaxSizeSettings.MaxOutputSize)
            {
                SendAndReset(ref d, ref dend);
            }

            hrw.Write(MessageType.PendingResult, ref dcurr, (int)(dend - dcurr));
            hrw.Write((MessageType)(ctx >> 32), ref dcurr, (int)(dend - dcurr));
            Write((int)(ctx & 0xffffffff), ref dcurr, (int)(dend - dcurr));
            Write(ref status, ref dcurr, (int)(dend - dcurr));
            if (status.Found)
            {
                serializer.Write(ref output, ref dcurr, (int)(dend - dcurr));
            }
            msgnum++;
        }
Ejemplo n.º 3
0
        public override void CompleteRead(ref Output output, long ctx, core.Status status)
        {
            byte *d    = responseObject.obj.bufferPtr;
            var   dend = d + responseObject.obj.buffer.Length;

            if ((int)(dend - dcurr) < 7 + maxSizeSettings.MaxOutputSize)
            {
                SendAndReset(ref d, ref dend);
            }

            hrw.Write(MessageType.PendingResult, ref dcurr, (int)(dend - dcurr));
            hrw.Write((MessageType)(ctx >> 32), ref dcurr, (int)(dend - dcurr));
            Write((int)(ctx & 0xffffffff), ref dcurr, (int)(dend - dcurr));
            Write(ref status, ref dcurr, (int)(dend - dcurr));
            if (status != core.Status.NOTFOUND)
            {
                serializer.Write(ref output, ref dcurr, (int)(dend - dcurr));
            }
            msgnum++;
        }
Ejemplo n.º 4
0
        private unsafe void ProcessBatch(byte[] buf, int offset)
        {
            GetResponseObject();

            fixed(byte *b = &buf[offset])
            {
                byte *d    = responseObject.obj.bufferPtr;
                var   dend = d + responseObject.obj.buffer.Length;

                dcurr = d + sizeof(int); // reserve space for size
                int origPendingSeqNo = pendingSeqNo;

                var     src    = b;
                ref var header = ref Unsafe.AsRef <BatchHeader>(src);

                src += BatchHeader.Size;
                core.Status status = default;

                dcurr += BatchHeader.Size;
                start  = 0;
                msgnum = 0;
                for (msgnum = 0; msgnum < header.numMessages; msgnum++)
                {
                    var message = (MessageType)(*src++);
                    switch (message)
                    {
                    case MessageType.Upsert:
                    case MessageType.UpsertAsync:
                        if ((int)(dend - dcurr) < 2)
                        {
                            SendAndReset(ref d, ref dend);
                        }

                        status = session.Upsert(ref serializer.ReadKeyByRef(ref src), ref serializer.ReadValueByRef(ref src));
                        hrw.Write(message, ref dcurr, (int)(dend - dcurr));
                        Write(ref status, ref dcurr, (int)(dend - dcurr));
                        break;

                    case MessageType.Read:
                    case MessageType.ReadAsync:
                        if ((int)(dend - dcurr) < 2 + maxSizeSettings.MaxOutputSize)
                        {
                            SendAndReset(ref d, ref dend);
                        }

                        long ctx = ((long)message << 32) | (long)pendingSeqNo;
                        status = session.Read(ref serializer.ReadKeyByRef(ref src), ref serializer.ReadInputByRef(ref src),
                                              ref serializer.AsRefOutput(dcurr + 2, (int)(dend - dcurr)), ctx, 0);

                        hrw.Write(message, ref dcurr, (int)(dend - dcurr));
                        Write(ref status, ref dcurr, (int)(dend - dcurr));

                        if (status == core.Status.PENDING)
                        {
                            Write(pendingSeqNo++, ref dcurr, (int)(dend - dcurr));
                        }
                        else if (status == core.Status.OK)
                        {
                            serializer.SkipOutput(ref dcurr);
                        }
                        break;

                    case MessageType.RMW:
                    case MessageType.RMWAsync:
                        if ((int)(dend - dcurr) < 2)
                        {
                            SendAndReset(ref d, ref dend);
                        }

                        ctx    = ((long)message << 32) | (long)pendingSeqNo;
                        status = session.RMW(ref serializer.ReadKeyByRef(ref src), ref serializer.ReadInputByRef(ref src), ctx);

                        hrw.Write(message, ref dcurr, (int)(dend - dcurr));
                        Write(ref status, ref dcurr, (int)(dend - dcurr));
                        if (status == core.Status.PENDING)
                        {
                            Write(pendingSeqNo++, ref dcurr, (int)(dend - dcurr));
                        }
                        break;

                    case MessageType.Delete:
                    case MessageType.DeleteAsync:
                        if ((int)(dend - dcurr) < 2)
                        {
                            SendAndReset(ref d, ref dend);
                        }

                        status = session.Delete(ref serializer.ReadKeyByRef(ref src));
                        hrw.Write(message, ref dcurr, (int)(dend - dcurr));
                        Write(ref status, ref dcurr, (int)(dend - dcurr));
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                if (origPendingSeqNo != pendingSeqNo)
                {
                    session.CompletePending(true);
                }

                // Send replies
                if (msgnum - start > 0)
                {
                    Send(d);
                }
                else
                {
                    responseObject.Dispose();
                }
            }
Ejemplo n.º 5
0
 public abstract void CompleteRMW(long ctx, core.Status status);
Ejemplo n.º 6
0
 public abstract void CompleteRead(ref Output output, long ctx, core.Status status);
Ejemplo n.º 7
0
 public void RMWCompletionCallback(ref Key key, ref Input input, long ctx, core.Status status)
 {
     serverNetworkSession.CompleteRMW(ctx, status);
     functions.RMWCompletionCallback(ref key, ref input, ctx, status);
 }
Ejemplo n.º 8
0
 public void ReadCompletionCallback(ref Key key, ref Input input, ref Output output, long ctx, core.Status status)
 {
     serverNetworkSession.CompleteRead(ref output, ctx, status);
     functions.ReadCompletionCallback(ref key, ref input, ref output, ctx, status);
 }