diff --git a/broker/src/main/java/org/apache/rocketmq/broker/config/v1/RocksDBSubscriptionGroupManager.java b/broker/src/main/java/org/apache/rocketmq/broker/config/v1/RocksDBSubscriptionGroupManager.java index ff47152569..b208169e41 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/config/v1/RocksDBSubscriptionGroupManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/config/v1/RocksDBSubscriptionGroupManager.java @@ -78,7 +78,6 @@ public class RocksDBSubscriptionGroupManager extends SubscriptionGroupManager { return true; } - private boolean merge() { if (!UtilAll.isPathExists(this.configFilePath()) && !UtilAll.isPathExists(this.configFilePath() + ".bak")) { log.info("subGroup json file does not exist, so skip merge"); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java b/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java index bfb5c9dcd0..f75fd21610 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java @@ -17,6 +17,8 @@ package org.apache.rocketmq.broker.slave; import java.io.IOException; +import java.util.Iterator; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -24,6 +26,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.loadbalance.MessageRequestModeManager; import org.apache.rocketmq.broker.subscription.SubscriptionGroupManager; +import org.apache.rocketmq.broker.topic.TopicConfigManager; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.TopicConfig; import org.apache.rocketmq.common.constant.LoggerName; @@ -77,20 +80,28 @@ public class SlaveSynchronize { try { TopicConfigAndMappingSerializeWrapper topicWrapper = this.brokerController.getBrokerOuterAPI().getAllTopicConfig(masterAddrBak); - if (!this.brokerController.getTopicConfigManager().getDataVersion() - .equals(topicWrapper.getDataVersion())) { + TopicConfigManager topicConfigManager = this.brokerController.getTopicConfigManager(); + if (!topicConfigManager.getDataVersion().equals(topicWrapper.getDataVersion())) { - this.brokerController.getTopicConfigManager().getDataVersion() - .assignNewOne(topicWrapper.getDataVersion()); + topicConfigManager.getDataVersion().assignNewOne(topicWrapper.getDataVersion()); ConcurrentMap newTopicConfigTable = topicWrapper.getTopicConfigTable(); - //delete - ConcurrentMap topicConfigTable = this.brokerController.getTopicConfigManager().getTopicConfigTable(); - topicConfigTable.entrySet().removeIf(item -> !newTopicConfigTable.containsKey(item.getKey())); - //update - topicConfigTable.putAll(newTopicConfigTable); + ConcurrentMap topicConfigTable = topicConfigManager.getTopicConfigTable(); - this.brokerController.getTopicConfigManager().persist(); + //delete + Iterator> iterator = topicConfigTable.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (!newTopicConfigTable.containsKey(entry.getKey())) { + iterator.remove(); + } + topicConfigManager.deleteTopicConfig(entry.getKey()); + } + + //update + newTopicConfigTable.values().forEach(topicConfigManager::updateSingleTopicConfigWithoutPersist); + + topicConfigManager.persist(); } if (topicWrapper.getTopicQueueMappingDetailMap() != null && !topicWrapper.getMappingDataVersion().equals(this.brokerController.getTopicQueueMappingManager().getDataVersion())) { @@ -165,19 +176,24 @@ public class SlaveSynchronize { if (!this.brokerController.getSubscriptionGroupManager().getDataVersion() .equals(subscriptionWrapper.getDataVersion())) { - SubscriptionGroupManager subscriptionGroupManager = - this.brokerController.getSubscriptionGroupManager(); - subscriptionGroupManager.getDataVersion().assignNewOne( - subscriptionWrapper.getDataVersion()); + SubscriptionGroupManager subscriptionGroupManager = this.brokerController.getSubscriptionGroupManager(); + subscriptionGroupManager.getDataVersion().assignNewOne(subscriptionWrapper.getDataVersion()); ConcurrentMap curSubscriptionGroupTable = subscriptionGroupManager.getSubscriptionGroupTable(); ConcurrentMap newSubscriptionGroupTable = subscriptionWrapper.getSubscriptionGroupTable(); // delete - curSubscriptionGroupTable.entrySet().removeIf(e -> !newSubscriptionGroupTable.containsKey(e.getKey())); + Iterator> iterator = curSubscriptionGroupTable.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry configEntry = iterator.next(); + if (!newSubscriptionGroupTable.containsKey(configEntry.getKey())) { + iterator.remove(); + } + subscriptionGroupManager.deleteSubscriptionGroupConfig(configEntry.getKey()); + } // update - curSubscriptionGroupTable.putAll(newSubscriptionGroupTable); + newSubscriptionGroupTable.values().forEach(subscriptionGroupManager::updateSubscriptionGroupConfigWithoutPersist); // persist subscriptionGroupManager.persist(); LOGGER.info("Update slave Subscription Group from master, {}", masterAddrBak); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java b/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java index f62a3e4a09..d85342e1a1 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java @@ -143,7 +143,7 @@ public class SubscriptionGroupManager extends ConfigManager { this.persist(); } - protected void updateSubscriptionGroupConfigWithoutPersist(SubscriptionGroupConfig config) { + public void updateSubscriptionGroupConfigWithoutPersist(SubscriptionGroupConfig config) { Map newAttributes = request(config); Map currentAttributes = current(config.getGroupName()); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index 4530c10002..b20cafc101 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -497,7 +497,7 @@ public class TopicConfigManager extends ConfigManager { } } - protected void updateSingleTopicConfigWithoutPersist(final TopicConfig topicConfig) { + public void updateSingleTopicConfigWithoutPersist(final TopicConfig topicConfig) { checkNotNull(topicConfig, "topicConfig shouldn't be null"); Map newAttributes = request(topicConfig);