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); }
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); }