use of com.alipay.sofa.jraft.test.atomic.command.BooleanCommand 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();
}
}
use of com.alipay.sofa.jraft.test.atomic.command.BooleanCommand in project sofa-jraft by sofastack.
the class BaseAsyncUserProcessor method createTask.
private Task createTask(RpcContext asyncCtx, T request, CommandType cmdType) {
final LeaderTaskClosure closure = new LeaderTaskClosure();
closure.setCmd(request);
closure.setCmdType(cmdType);
closure.setDone(status -> {
if (status.isOk()) {
asyncCtx.sendResponse(closure.getResponse());
} else {
asyncCtx.sendResponse(new BooleanCommand(false, status.getErrorMsg()));
}
});
final byte[] cmdBytes = CommandCodec.encodeCommand(request);
final ByteBuffer data = ByteBuffer.allocate(cmdBytes.length + 1);
data.put(cmdType.toByte());
data.put(cmdBytes);
data.flip();
return new Task(data, closure);
}
use of com.alipay.sofa.jraft.test.atomic.command.BooleanCommand in project sofa-jraft by sofastack.
the class AtomicClient method get.
public long get(PeerId peer, String key, boolean readFromQuorum, boolean readByStateMachine) throws KeyNotFoundException, InterruptedException {
try {
final GetCommand request = new GetCommand(key);
request.setReadFromQuorum(readFromQuorum);
request.setReadByStateMachine(readByStateMachine);
final Object response = this.rpcClient.invokeSync(peer.getEndpoint(), request, cliOptions.getRpcDefaultTimeout());
final BooleanCommand cmd = (BooleanCommand) response;
if (cmd.isSuccess()) {
return ((ValueCommand) cmd).getVlaue();
} else {
if (cmd.getErrorMsg().equals("key not found")) {
throw new KeyNotFoundException();
} else {
throw new IllegalStateException("Server error:" + cmd.getErrorMsg());
}
}
} catch (final Throwable t) {
t.printStackTrace();
throw new IllegalStateException("Remoting error:" + t.getMessage());
}
}
use of com.alipay.sofa.jraft.test.atomic.command.BooleanCommand 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());
}
}
Aggregations