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++; }
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++; }
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++; }
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(); } }
public abstract void CompleteRMW(long ctx, core.Status status);
public abstract void CompleteRead(ref Output output, long ctx, core.Status status);
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); }
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); }