public async Task PutCompareExchangeValue() { var key = GetStringQueryString("key"); var raftRequestId = GetRaftRequestIdFromQuery(); // ReSharper disable once PossibleInvalidOperationException var index = GetLongQueryString("index", true).Value; await ServerStore.EnsureNotPassiveAsync(); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) { var updateJson = await context.ReadForMemoryAsync(RequestBodyStream(), "read-unique-value"); var command = new AddOrUpdateCompareExchangeCommand(Database.Name, key, updateJson, index, context, raftRequestId); using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream())) { (var raftIndex, var response) = await ServerStore.SendToLeaderAsync(context, command); await ServerStore.Cluster.WaitForIndexNotification(raftIndex); var result = (CompareExchangeCommandBase.CompareExchangeResult)response; context.Write(writer, new DynamicJsonValue { [nameof(CompareExchangeResult <object> .Index)] = result.Index, [nameof(CompareExchangeResult <object> .Value)] = result.Value, [nameof(CompareExchangeResult <object> .Successful)] = result.Index == raftIndex }); } } }
public async Task PutCmpXchgValue() { var prefix = Database.Name + "/"; var key = prefix + GetStringQueryString("key"); // ReSharper disable once PossibleInvalidOperationException var index = GetLongQueryString("index", true).Value; ServerStore.EnsureNotPassive(); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) { var updateJson = await context.ReadForMemoryAsync(RequestBodyStream(), "read-unique-value"); var command = new AddOrUpdateCompareExchangeCommand(key, updateJson, index); using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream())) { (var raftIndex, var res) = await ServerStore.SendToLeaderAsync(command); await ServerStore.Cluster.WaitForIndexNotification(raftIndex); using (context.OpenReadTransaction()) { var tuple = ((long Index, object Value))res; context.Write(writer, new DynamicJsonValue { [nameof(CmpXchgResult <object> .Index)] = tuple.Index, [nameof(CmpXchgResult <object> .Value)] = tuple.Value, [nameof(CmpXchgResult <object> .Successful)] = tuple.Index == raftIndex }); } writer.Flush(); } } }