コード例 #1
0
        protected override void WriteFramingExtras(OperationBuilder builder)
        {
            if (PreserveTtl)
            {
                Span <byte> preserveTtlByte = stackalloc byte[1];
                preserveTtlByte[0] = 5 << 4;
                builder.Write(preserveTtlByte);
            }

            if (DurabilityLevel == DurabilityLevel.None)
            {
                return;
            }

            // TODO: omit timeout bytes if no timeout provided
            Span <byte> bytes = stackalloc byte[2];

            var framingExtra = new FramingExtraInfo(RequestFramingExtraType.DurabilityRequirements, (byte)(bytes.Length - 1));

            bytes[0] = framingExtra.Byte;
            bytes[1] = (byte)DurabilityLevel;

            // TODO: improve timeout, coerce to 1500ms, etc
            //var timeout = DurabilityTimeout.HasValue ? DurabilityTimeout.Value.TotalMilliseconds : 0;
            //Converter.FromUInt16((ushort)timeout, bytes, 2);

            builder.Write(bytes);
        }
コード例 #2
0
        public override void WriteFramingExtras(OperationBuilder builder)
        {
            if (DurabilityLevel == DurabilityLevel.None)
            {
                return;
            }

            // TODO: omit timeout bytes if no timeout provided
            Span <byte> bytes = stackalloc byte[4];

            var framingExtra = new FramingExtraInfo(RequestFramingExtraType.DurabilityRequirements, (byte)(bytes.Length - 1));

            bytes[0] = (byte)(framingExtra.Byte | (byte)0x03);
            bytes[1] = (byte)DurabilityLevel;

            var userTimeout = DurabilityTimeout.Value.TotalMilliseconds;

            ushort deadline;

            if (userTimeout >= ushort.MaxValue)
            {
                // -1 because 0xffff is going to be reserved by the cluster. 1ms less doesn't matter.
                deadline = ushort.MaxValue - 1;
            }
            else
            {
                // per spec 90% of the timeout is used as the deadline
                deadline = (ushort)(userTimeout * 0.9);
            }

            if (deadline < SyncReplicationTimeoutFloorMs)
            {
                // we need to ensure a floor value
                deadline = SyncReplicationTimeoutFloorMs;
            }

            ByteConverter.FromUInt16(deadline, bytes);
            builder.Write(bytes);
        }