use of org.redisson.command.CommandBatchService.ConnectionEntry in project redisson by redisson.
the class RedisQueuedBatchExecutor method sendCommand.
@Override
protected void sendCommand(CompletableFuture<R> attemptPromise, RedisConnection connection) {
MasterSlaveEntry msEntry = getEntry(source);
ConnectionEntry connectionEntry = connections.get(msEntry);
boolean syncSlaves = options.getSyncSlaves() > 0;
if (source.getRedirect() == Redirect.ASK) {
List<CommandData<?, ?>> list = new ArrayList<>(2);
CompletableFuture<Void> promise = new CompletableFuture<>();
list.add(new CommandData<>(promise, codec, RedisCommands.ASKING, new Object[] {}));
if (connectionEntry.isFirstCommand()) {
list.add(new CommandData<>(promise, codec, RedisCommands.MULTI, new Object[] {}));
connectionEntry.setFirstCommand(false);
}
list.add(new CommandData<>(attemptPromise, codec, command, params));
CompletableFuture<Void> main = new CompletableFuture<>();
writeFuture = connection.send(new CommandsData(main, list, true, syncSlaves));
} else {
if (log.isDebugEnabled()) {
log.debug("acquired connection for command {} and params {} from slot {} using node {}... {}", command, LogHelper.toString(params), source, connection.getRedisClient().getAddr(), connection);
}
if (connectionEntry.isFirstCommand()) {
List<CommandData<?, ?>> list = new ArrayList<>(2);
list.add(new CommandData<>(new CompletableFuture<>(), codec, RedisCommands.MULTI, new Object[] {}));
list.add(new CommandData<>(attemptPromise, codec, command, params));
CompletableFuture<Void> main = new CompletableFuture<>();
writeFuture = connection.send(new CommandsData(main, list, true, syncSlaves));
connectionEntry.setFirstCommand(false);
} else {
if (RedisCommands.EXEC.getName().equals(command.getName())) {
Entry entry = commands.get(msEntry);
List<CommandData<?, ?>> list = new ArrayList<>();
if (options.isSkipResult()) {
list.add(new CommandData<>(new CompletableFuture<>(), codec, RedisCommands.CLIENT_REPLY, new Object[] { "OFF" }));
}
list.add(new CommandData<>(attemptPromise, codec, command, params));
if (options.isSkipResult()) {
list.add(new CommandData<>(new CompletableFuture<>(), codec, RedisCommands.CLIENT_REPLY, new Object[] { "ON" }));
}
if (options.getSyncSlaves() > 0) {
BatchCommandData<?, ?> waitCommand = new BatchCommandData(RedisCommands.WAIT, new Object[] { this.options.getSyncSlaves(), this.options.getSyncTimeout() }, index.incrementAndGet());
list.add(waitCommand);
entry.getCommands().add(waitCommand);
}
CompletableFuture<Void> main = new CompletableFuture<>();
writeFuture = connection.send(new CommandsData(main, list, new ArrayList(entry.getCommands()), options.isSkipResult(), false, true, syncSlaves));
} else {
CompletableFuture<Void> main = new CompletableFuture<>();
List<CommandData<?, ?>> list = new ArrayList<>();
list.add(new CommandData<>(attemptPromise, codec, command, params));
writeFuture = connection.send(new CommandsData(main, list, true, syncSlaves));
}
}
}
}
use of org.redisson.command.CommandBatchService.ConnectionEntry in project redisson by redisson.
the class RedisQueuedBatchExecutor method getConnection.
@Override
protected CompletableFuture<RedisConnection> getConnection() {
MasterSlaveEntry msEntry = getEntry(source);
ConnectionEntry entry = connections.get(msEntry);
if (entry == null) {
entry = new ConnectionEntry();
ConnectionEntry oldEntry = connections.putIfAbsent(msEntry, entry);
if (oldEntry != null) {
entry = oldEntry;
}
}
if (entry.getConnectionFuture() != null) {
return entry.getConnectionFuture();
}
synchronized (this) {
if (entry.getConnectionFuture() != null) {
return entry.getConnectionFuture();
}
CompletableFuture<RedisConnection> connectionFuture;
if (this.options.getExecutionMode() == ExecutionMode.REDIS_WRITE_ATOMIC) {
connectionFuture = connectionManager.connectionWriteOp(source, null);
} else {
connectionFuture = connectionManager.connectionReadOp(source, null);
}
connectionFuture.toCompletableFuture().join();
entry.setConnectionFuture(connectionFuture);
entry.setCancelCallback(() -> {
handleError(connectionFuture, new CancellationException());
});
return connectionFuture;
}
}
Aggregations