Пример #1
0
        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 CompareExchangeCommand(key, updateJson, index);
                using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                {
                    (var raftIndex, _) = await ServerStore.SendToLeaderAsync(command);

                    await ServerStore.Cluster.WaitForIndexNotification(raftIndex);

                    using (context.OpenReadTransaction())
                    {
                        var res = ServerStore.Cluster.GetCmpXchg(context, key);
                        context.Write(writer, new DynamicJsonValue
                        {
                            [nameof(CmpXchgResult <object> .Index)]      = res.Index,
                            [nameof(CmpXchgResult <object> .Value)]      = res.Value,
                            [nameof(CmpXchgResult <object> .Successful)] = res.Index == raftIndex
                        });
                    }
                    writer.Flush();
                }
            }
        }
Пример #2
0
        public static Result <Command> FromString(string command, string[] parameters)
        {
            try
            {
                if (!Enum.TryParse <CommandType>(command, ignoreCase: true, out var parsedCommandType))
                {
                    throw new ArgumentException(message: $"Could not parse `{nameof(CommandType)}` from string `{command}`", paramName: nameof(command));
                }

                Command?parsedCommand = null;
                switch (parsedCommandType)
                {
                case CommandType.Get:
                    parsedCommand = new GetCommand();
                    break;

                case CommandType.Set:
                    parsedCommand = new SetCommand()
                    {
                        Value = Encoding.UTF8.GetBytes(parameters[1]),
                    };
                    break;

                case CommandType.CompareExchange:
                    parsedCommand = new CompareExchangeCommand()
                    {
                        Comparand = Encoding.UTF8.GetBytes(parameters[1]),
                        Value     = Encoding.UTF8.GetBytes(parameters[2]),
                    };
                    break;

                case CommandType.CompareRemove:
                    parsedCommand = new CompareRemoveCommand()
                    {
                        Comparand = Encoding.UTF8.GetBytes(parameters[1]),
                    };
                    break;

                case CommandType.Remove:
                    parsedCommand = new RemoveCommand();
                    break;

                case CommandType.PrefixEnumerate:
                    parsedCommand = new PrefixEnumerateCommand();
                    break;
                }

                Contract.Assert(parsedCommand != null);

                parsedCommand.Key = Encoding.UTF8.GetBytes(parameters[0]);

                return(new Result <Command>(parsedCommand));
            }
            catch (Exception e)
            {
                return(new Result <Command>(e, message: $"Failed to parse request `{command}` with parameters `{string.Join(", ", parameters)}`"));
            }
        }
Пример #3
0
        public async Task PutCmpXchgValue()
        {
            var key = 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 CompareExchangeCommand(key, updateJson, index);

                var(raftIndex, _) = await ServerStore.SendToLeaderAsync(command);

                await ServerStore.Cluster.WaitForIndexNotification(raftIndex);

                HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
            }
        }