Search in sources :

Example 1 with CompareAndSetCommand

use of com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand in project sofa-jraft by sofastack.

the class AtomicStateMachine method onApply.

@Override
public void onApply(final Iterator iter) {
    while (iter.hasNext()) {
        final Closure done = iter.done();
        CommandType cmdType;
        final ByteBuffer data = iter.getData();
        Object cmd = null;
        LeaderTaskClosure closure = null;
        if (done != null) {
            closure = (LeaderTaskClosure) done;
            cmdType = closure.getCmdType();
            cmd = closure.getCmd();
        } else {
            final byte b = data.get();
            final byte[] cmdBytes = new byte[data.remaining()];
            data.get(cmdBytes);
            cmdType = CommandType.parseByte(b);
            switch(cmdType) {
                case GET:
                    cmd = CommandCodec.decodeCommand(cmdBytes, GetCommand.class);
                    break;
                case SET:
                    cmd = CommandCodec.decodeCommand(cmdBytes, SetCommand.class);
                    break;
                case CAS:
                    cmd = CommandCodec.decodeCommand(cmdBytes, CompareAndSetCommand.class);
                    break;
                case INC:
                    cmd = CommandCodec.decodeCommand(cmdBytes, IncrementAndGetCommand.class);
                    break;
            }
        }
        final String key = ((BaseRequestCommand) cmd).getKey();
        final AtomicLong counter = getCounter(key, true);
        Object response = null;
        switch(cmdType) {
            case GET:
                response = new ValueCommand(counter.get());
                break;
            case SET:
                final SetCommand setCmd = (SetCommand) cmd;
                counter.set(setCmd.getValue());
                response = new BooleanCommand(true);
                break;
            case CAS:
                final CompareAndSetCommand casCmd = (CompareAndSetCommand) cmd;
                response = new BooleanCommand(counter.compareAndSet(casCmd.getExpect(), casCmd.getNewValue()));
                break;
            case INC:
                final IncrementAndGetCommand incCmd = (IncrementAndGetCommand) cmd;
                final long ret = counter.addAndGet(incCmd.getDetal());
                response = new ValueCommand(ret);
                break;
        }
        if (closure != null) {
            closure.setResponse(response);
            closure.run(Status.OK());
        }
        iter.next();
    }
}
Also used : Closure(com.alipay.sofa.jraft.Closure) BooleanCommand(com.alipay.sofa.jraft.test.atomic.command.BooleanCommand) IncrementAndGetCommand(com.alipay.sofa.jraft.test.atomic.command.IncrementAndGetCommand) ByteBuffer(java.nio.ByteBuffer) IncrementAndGetCommand(com.alipay.sofa.jraft.test.atomic.command.IncrementAndGetCommand) GetCommand(com.alipay.sofa.jraft.test.atomic.command.GetCommand) CompareAndSetCommand(com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand) AtomicLong(java.util.concurrent.atomic.AtomicLong) BaseRequestCommand(com.alipay.sofa.jraft.test.atomic.command.BaseRequestCommand) ValueCommand(com.alipay.sofa.jraft.test.atomic.command.ValueCommand) CompareAndSetCommand(com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand) SetCommand(com.alipay.sofa.jraft.test.atomic.command.SetCommand)

Example 2 with CompareAndSetCommand

use of com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand in project sofa-jraft by sofastack.

the class AtomicClient method compareAndSet.

public boolean compareAndSet(PeerId peer, String key, long expect, long newVal) throws InterruptedException {
    try {
        final CompareAndSetCommand request = new CompareAndSetCommand();
        request.setKey(key);
        request.setNewValue(newVal);
        request.setExpect(expect);
        final Object response = this.rpcClient.invokeSync(peer.getEndpoint(), request, cliOptions.getRpcDefaultTimeout());
        final BooleanCommand cmd = (BooleanCommand) response;
        return cmd.isSuccess();
    } catch (final Throwable t) {
        throw new IllegalStateException("Remoting error:" + t.getMessage());
    }
}
Also used : CompareAndSetCommand(com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand) BooleanCommand(com.alipay.sofa.jraft.test.atomic.command.BooleanCommand)

Aggregations

BooleanCommand (com.alipay.sofa.jraft.test.atomic.command.BooleanCommand)2 CompareAndSetCommand (com.alipay.sofa.jraft.test.atomic.command.CompareAndSetCommand)2 Closure (com.alipay.sofa.jraft.Closure)1 BaseRequestCommand (com.alipay.sofa.jraft.test.atomic.command.BaseRequestCommand)1 GetCommand (com.alipay.sofa.jraft.test.atomic.command.GetCommand)1 IncrementAndGetCommand (com.alipay.sofa.jraft.test.atomic.command.IncrementAndGetCommand)1 SetCommand (com.alipay.sofa.jraft.test.atomic.command.SetCommand)1 ValueCommand (com.alipay.sofa.jraft.test.atomic.command.ValueCommand)1 ByteBuffer (java.nio.ByteBuffer)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1