From 733c427a5b3ecdb4e541f1cb59ce664a128a8c9a Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 26 Jan 2022 10:04:06 +0300 Subject: [PATCH] Feature - TransactionalOperation.syncSlaves setting added #4083 --- .../org/redisson/api/TransactionOptions.java | 43 +++++++++++++++---- .../transaction/RedissonTransaction.java | 5 +++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/redisson/src/main/java/org/redisson/api/TransactionOptions.java b/redisson/src/main/java/org/redisson/api/TransactionOptions.java index e531ef88f..5608a2cf3 100644 --- a/redisson/src/main/java/org/redisson/api/TransactionOptions.java +++ b/redisson/src/main/java/org/redisson/api/TransactionOptions.java @@ -29,6 +29,7 @@ public final class TransactionOptions { private int retryAttempts = 3; private long retryInterval = 1500; + private int syncSlaves = 0; private long syncTimeout = 5000; private long timeout = 5000; @@ -87,8 +88,8 @@ public final class TransactionOptions { *

* Default is 1500 milliseconds * - * @param retryInterval - time interval - * @param retryIntervalUnit - time interval unit + * @param retryInterval time interval + * @param retryIntervalUnit time interval unit * @return self instance */ public TransactionOptions retryInterval(long retryInterval, TimeUnit retryIntervalUnit) { @@ -97,14 +98,13 @@ public final class TransactionOptions { } /** - * Synchronization data timeout between Redis master participating in transaction and its slaves. - *

- * Default is 5000 milliseconds - * - * @param syncTimeout - synchronization timeout - * @param syncUnit - synchronization timeout time unit + * Use {@link #syncSlaves} method instead. + * + * @param syncTimeout synchronization timeout + * @param syncUnit synchronization timeout time unit * @return self instance */ + @Deprecated public TransactionOptions syncSlavesTimeout(long syncTimeout, TimeUnit syncUnit) { this.syncTimeout = syncUnit.toMillis(syncTimeout); return this; @@ -113,6 +113,33 @@ public final class TransactionOptions { return syncTimeout; } + /** + * Synchronize write operations execution within defined timeout + * across specified amount of Redis slave nodes. + *

+ * Default slaves value is 0 which means available slaves + * at the moment of execution and -1 means no sync at all. + *

+ * Default timeout value is 5000 milliseconds + * NOTE: Redis 3.0+ required + * + * @param slaves slaves amount for synchronization. + * Default value is 0 which means available slaves + * at the moment of execution and -1 means no sync at all. + * @param timeout synchronization timeout + * @param unit synchronization timeout time unit + * @return self instance + */ + public TransactionOptions syncSlaves(int slaves, long timeout, TimeUnit unit) { + this.syncSlaves = slaves; + this.syncTimeout = unit.toMillis(timeout); + return this; + } + + public int getSyncSlaves() { + return syncSlaves; + } + public long getTimeout() { return timeout; } diff --git a/redisson/src/main/java/org/redisson/transaction/RedissonTransaction.java b/redisson/src/main/java/org/redisson/transaction/RedissonTransaction.java index 8b0b84b70..f24b27376 100644 --- a/redisson/src/main/java/org/redisson/transaction/RedissonTransaction.java +++ b/redisson/src/main/java/org/redisson/transaction/RedissonTransaction.java @@ -218,6 +218,11 @@ public class RedissonTransaction implements RTransaction { private BatchOptions createOptions() { MasterSlaveEntry entry = commandExecutor.getConnectionManager().getEntrySet().iterator().next(); int syncSlaves = entry.getAvailableSlaves(); + if (options.getSyncSlaves() == -1) { + syncSlaves = 0; + } else if (options.getSyncSlaves() > 0) { + syncSlaves = options.getSyncSlaves(); + } BatchOptions batchOptions = BatchOptions.defaults() .syncSlaves(syncSlaves, options.getSyncTimeout(), TimeUnit.MILLISECONDS)