From 1d1671ef80edaf6222b7290fc0d91cc2c7647e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80?= <78294896+qyi71@users.noreply.github.com> Date: Thu, 30 May 2024 18:05:28 +0800 Subject: [PATCH] [3.3] jedis from 3.10.0 to 5.1.0 and metadata implementing TTL functionality in redis (#14248) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Try fix redis server in windows env * feat: 1.bump jedis from 3.10.0 to 5.1.0 2.metadata implementing TTL functionality in redis * feat: guaranteed publish command exec --------- Co-authored-by: Albumen Kevin Co-authored-by: 其一 --- .../support/AbstractMetadataReport.java | 2 +- .../dubbo-metadata-report-redis/pom.xml | 2 +- .../store/redis/RedisMetadataReport.java | 21 ++++++++++++++----- .../store/redis/RedisMetadataReportTest.java | 1 - 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java index 6d2dcb7a5b..f21e99b3df 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java @@ -85,7 +85,7 @@ public abstract class AbstractMetadataReport implements MetadataReport { protected static final String DEFAULT_ROOT = "dubbo"; - private static final int ONE_DAY_IN_MILLISECONDS = 60 * 24 * 60 * 1000; + protected static final int ONE_DAY_IN_MILLISECONDS = 60 * 24 * 60 * 1000; private static final int FOUR_HOURS_IN_MILLISECONDS = 60 * 4 * 60 * 1000; // Log output protected final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(getClass()); diff --git a/dubbo-metadata/dubbo-metadata-report-redis/pom.xml b/dubbo-metadata/dubbo-metadata-report-redis/pom.xml index bdeb867c57..2cc33a888c 100644 --- a/dubbo-metadata/dubbo-metadata-report-redis/pom.xml +++ b/dubbo-metadata/dubbo-metadata-report-redis/pom.xml @@ -25,7 +25,7 @@ dubbo-metadata-report-redis - 3.10.0 + 5.1.0 diff --git a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java index 7c64220faa..6c2493ccff 100644 --- a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java +++ b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java @@ -53,9 +53,11 @@ import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.Transaction; +import redis.clients.jedis.params.SetParams; import redis.clients.jedis.util.JedisClusterCRC16; import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CYCLE_REPORT_KEY; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR; import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY; @@ -64,6 +66,7 @@ import static org.apache.dubbo.common.constants.LoggerCodeConstants.TRANSPORT_FA import static org.apache.dubbo.metadata.MetadataConstants.META_DATA_STORE_TAG; import static org.apache.dubbo.metadata.ServiceNameMapping.DEFAULT_MAPPING_GROUP; import static org.apache.dubbo.metadata.ServiceNameMapping.getAppNames; +import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADATA_REPORT_CYCLE_REPORT; /** * RedisMetadataReport @@ -80,12 +83,17 @@ public class RedisMetadataReport extends AbstractMetadataReport { private String password; private final String root; private final ConcurrentHashMap mappingDataListenerMap = new ConcurrentHashMap<>(); + private SetParams jedisParams = SetParams.setParams(); public RedisMetadataReport(URL url) { super(url); timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT); password = url.getPassword(); this.root = url.getGroup(DEFAULT_ROOT); + if (url.getParameter(CYCLE_REPORT_KEY, DEFAULT_METADATA_REPORT_CYCLE_REPORT)) { + // ttl default is twice the cycle-report time + jedisParams.ex(ONE_DAY_IN_MILLISECONDS * 2); + } if (url.getParameter(CLUSTER_KEY, false)) { jedisClusterNodes = new HashSet<>(); List urls = url.getBackupUrls(); @@ -153,7 +161,7 @@ public class RedisMetadataReport extends AbstractMetadataReport { private void storeMetadataInCluster(BaseMetadataIdentifier metadataIdentifier, String v) { try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { - jedisCluster.set(metadataIdentifier.getIdentifierKey() + META_DATA_STORE_TAG, v); + jedisCluster.set(metadataIdentifier.getIdentifierKey() + META_DATA_STORE_TAG, v, jedisParams); } catch (Throwable e) { String msg = "Failed to put " + metadataIdentifier + " to redis cluster " + v + ", cause: " + e.getMessage(); @@ -164,7 +172,7 @@ public class RedisMetadataReport extends AbstractMetadataReport { private void storeMetadataStandalone(BaseMetadataIdentifier metadataIdentifier, String v) { try (Jedis jedis = pool.getResource()) { - jedis.set(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), v); + jedis.set(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), v, jedisParams); } catch (Throwable e) { String msg = "Failed to put " + metadataIdentifier + " to redis " + v + ", cause: " + e.getMessage(); logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); @@ -272,7 +280,7 @@ public class RedisMetadataReport extends AbstractMetadataReport { private boolean storeMappingInCluster(String key, String field, String value, String ticket) { try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { - Jedis jedis = jedisCluster.getConnectionFromSlot(JedisClusterCRC16.getSlot(key)); + Jedis jedis = new Jedis(jedisCluster.getConnectionFromSlot(JedisClusterCRC16.getSlot(key))); jedis.watch(key); String oldValue = jedis.hget(key, field); if (null == oldValue || null == ticket || oldValue.equals(ticket)) { @@ -286,6 +294,7 @@ public class RedisMetadataReport extends AbstractMetadataReport { } else { jedis.unwatch(); } + jedis.close(); } catch (Throwable e) { String msg = "Failed to put " + key + ":" + field + " to redis " + value + ", cause: " + e.getMessage(); logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); @@ -305,9 +314,11 @@ public class RedisMetadataReport extends AbstractMetadataReport { if (null == oldValue || null == ticket || oldValue.equals(ticket)) { Transaction transaction = jedis.multi(); transaction.hset(key, field, value); - transaction.publish(buildPubSubKey(), field); List result = transaction.exec(); - return null != result; + if (null != result) { + jedis.publish(buildPubSubKey(), field); + return true; + } } jedis.unwatch(); } catch (Throwable e) { diff --git a/dubbo-metadata/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportTest.java b/dubbo-metadata/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportTest.java index 1b0e01709a..85569d49c9 100644 --- a/dubbo-metadata/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportTest.java +++ b/dubbo-metadata/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportTest.java @@ -253,7 +253,6 @@ class RedisMetadataReportTest { @Test void testWrongAuthRedisMetadata() throws ClassNotFoundException { - registryUrl = registryUrl.setPassword("123456"); redisMetadataReport = (RedisMetadataReport) new RedisMetadataReportFactory().createMetadataReport(registryUrl); try { testStoreProvider(redisMetadataReport, "1.0.0.redis.md.p1", 3000);