@Override public void executeCommand(Command command, ExecutionHandlerContext context) { CacheTransactionManager txm = context.getCacheTransactionManager(); if (!context.hasTransaction()) { command.setResponse(Coder.getNilResponse(context.getByteBufAllocator())); return; } TransactionId transactionId = context.getTransactionID(); txm.resume(transactionId); boolean hasError = hasError(context.getTransactionQueue()); if (hasError) txm.rollback(); else { try { txm.commit(); } catch (CommitConflictException e) { command.setResponse( Coder.getErrorResponse( context.getByteBufAllocator(), RedisConstants.ERROR_COMMIT_CONFLICT)); context.clearTransaction(); return; } } ByteBuf response = constructResponseExec(context); command.setResponse(response); context.clearTransaction(); }
private ByteBuf constructResponseExec(ExecutionHandlerContext context) { Queue<Command> cQ = context.getTransactionQueue(); ByteBuf response = context.getByteBufAllocator().buffer(); response.writeByte(Coder.ARRAY_ID); response.writeBytes(Coder.intToBytes(cQ.size())); response.writeBytes(Coder.CRLFar); for (Command c : cQ) { ByteBuf r = c.getResponse(); response.writeBytes(r); } return response; }
private boolean hasError(Queue<Command> queue) { for (Command c : queue) { if (c.hasError()) return true; } return false; }