This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 75c5b587ee9 Add RuleItemManager and remove
StandaloneDeliverEventSubscriberRegistry (#31772)
75c5b587ee9 is described below
commit 75c5b587ee9bea1b5028e161f60463d5d8141e94
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Jun 20 16:29:06 2024 +0800
Add RuleItemManager and remove StandaloneDeliverEventSubscriberRegistry
(#31772)
---
.../mode/service/MetaDataContextManager.java | 4 ++
.../mode/service/manager/RuleItemManager.java | 83 ++++++++++++++++++++++
.../StandaloneContextManagerBuilder.java | 5 +-
.../StandaloneMetaDataManagerPersistService.java | 32 +++++----
.../StandaloneDeliverEventSubscriberRegistry.java | 32 ---------
5 files changed, 107 insertions(+), 49 deletions(-)
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
index 9eef46a5900..8451bc82891 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.service.manager.ConfigurationManager;
import org.apache.shardingsphere.mode.service.manager.ResourceMetaDataManager;
+import org.apache.shardingsphere.mode.service.manager.RuleItemManager;
import
org.apache.shardingsphere.mode.service.manager.ShardingSphereDatabaseManager;
import java.util.concurrent.atomic.AtomicReference;
@@ -38,10 +39,13 @@ public class MetaDataContextManager {
private final ResourceMetaDataManager resourceMetaDataManager;
+ private final RuleItemManager ruleItemManager;
+
public MetaDataContextManager(final AtomicReference<MetaDataContexts>
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
final PersistServiceFacade
persistServiceFacade) {
databaseManager = new ShardingSphereDatabaseManager(metaDataContexts);
configurationManager = new ConfigurationManager(metaDataContexts,
computeNodeInstanceContext, persistServiceFacade);
resourceMetaDataManager = new
ResourceMetaDataManager(metaDataContexts, persistServiceFacade);
+ ruleItemManager = new RuleItemManager(metaDataContexts,
persistServiceFacade, configurationManager);
}
}
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
new file mode 100644
index 00000000000..69b17a9da94
--- /dev/null
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.service.manager;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
+import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.service.PersistServiceFacade;
+import
org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Rule item manager.
+ */
+@RequiredArgsConstructor
+public class RuleItemManager {
+
+ private final AtomicReference<MetaDataContexts> metaDataContexts;
+
+ private final PersistServiceFacade persistServiceFacade;
+
+ private final ConfigurationManager configurationManager;
+
+ /**
+ * Alter with rule item.
+ *
+ * @param event alter rule item event
+ */
+ @SuppressWarnings({"rawtypes", "unchecked", "unused"})
+ public void alterRuleItem(final AlterRuleItemEvent event) {
+ if
(!event.getActiveVersion().equals(persistServiceFacade.getMetaDataPersistService().getMetaDataVersionPersistService()
+ .getActiveVersionByFullPath(event.getActiveVersionKey()))) {
+ return;
+ }
+ RuleItemConfigurationChangedProcessor processor =
TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class,
event.getType());
+ String yamlContent =
persistServiceFacade.getMetaDataPersistService().getMetaDataVersionPersistService()
+ .getVersionPathByActiveVersion(event.getActiveVersionKey(),
event.getActiveVersion());
+ String databaseName = event.getDatabaseName();
+ RuleConfiguration currentRuleConfig =
processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+ synchronized (this) {
+ processor.changeRuleItemConfiguration(event, currentRuleConfig,
processor.swapRuleItemConfiguration(event, yamlContent));
+ configurationManager.alterRuleConfiguration(databaseName,
currentRuleConfig);
+ }
+ }
+
+ /**
+ * Drop with rule item.
+ *
+ * @param event drop rule item event
+ */
+ @SuppressWarnings({"rawtypes", "unchecked", "unused"})
+ public void dropRuleItem(final DropRuleItemEvent event) {
+ String databaseName = event.getDatabaseName();
+ if
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName)) {
+ return;
+ }
+ RuleItemConfigurationChangedProcessor processor =
TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class,
event.getType());
+ RuleConfiguration currentRuleConfig =
processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+ synchronized (this) {
+ processor.dropRuleItemConfiguration(event, currentRuleConfig);
+ configurationManager.dropRuleConfiguration(databaseName,
currentRuleConfig);
+ }
+ }
+}
diff --git
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index ace35f29171..528a6e85ddb 100644
---
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -27,7 +27,6 @@ import org.apache.shardingsphere.mode.lock.GlobalLockContext;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
-import
org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneDeliverEventSubscriberRegistry;
import
org.apache.shardingsphere.mode.manager.standalone.workerid.generator.StandaloneWorkerIdGenerator;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
@@ -49,9 +48,7 @@ public final class StandaloneContextManagerBuilder implements
ContextManagerBuil
MetaDataPersistService persistService = new
MetaDataPersistService(repository);
ComputeNodeInstanceContext computeNodeInstanceContext =
buildComputeNodeInstanceContext(param, eventBusContext);
MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(persistService, param,
computeNodeInstanceContext);
- ContextManager result = new ContextManager(metaDataContexts,
computeNodeInstanceContext, repository);
- new StandaloneDeliverEventSubscriberRegistry(result).register();
- return result;
+ return new ContextManager(metaDataContexts,
computeNodeInstanceContext, repository);
}
private ComputeNodeInstanceContext buildComputeNodeInstanceContext(final
ContextManagerBuilderParameter param, final EventBusContext eventBusContext) {
diff --git
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
index f5600759226..0edcdfbc62c 100644
---
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
+++
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
@@ -29,6 +29,9 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchema
import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import
org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
+import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
import
org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType;
import
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
@@ -275,29 +278,32 @@ public final class
StandaloneMetaDataManagerPersistService implements MetaDataMa
Collection<MetaDataVersion> metaDataVersions =
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
.persistConfigurations(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
Collections.singletonList(toBeAlteredRuleConfig));
contextManager.getPersistServiceFacade().getMetaDataPersistService().getMetaDataVersionPersistService().switchActiveVersion(metaDataVersions);
- sendDatabaseRuleChangedEvent(databaseName, metaDataVersions);
+ for (MetaDataVersion each : metaDataVersions) {
+ Optional<GovernanceEvent> ruleItemEvent =
buildAlterRuleItemEvent(databaseName, each, Type.UPDATED);
+ if (ruleItemEvent.isPresent() && ruleItemEvent.get()
instanceof AlterRuleItemEvent) {
+
contextManager.getMetaDataContextManager().getRuleItemManager().alterRuleItem((AlterRuleItemEvent)
ruleItemEvent.get());
+ }
+ }
clearServiceCache();
}
return Collections.emptyList();
}
- private void sendDatabaseRuleChangedEvent(final String databaseName, final
Collection<MetaDataVersion> metaDataVersions) {
- for (MetaDataVersion each : metaDataVersions) {
- sendDatabaseRuleChangedEvent(databaseName, each);
- }
- }
-
- private void sendDatabaseRuleChangedEvent(final String databaseName, final
MetaDataVersion metaDataVersion) {
- ruleConfigurationEventBuilder.build(databaseName, new
DataChangedEvent(metaDataVersion.getActiveVersionNodePath(),
metaDataVersion.getNextActiveVersion(), Type.UPDATED))
- .ifPresent(optional ->
contextManager.getComputeNodeInstanceContext().getEventBusContext().post(optional));
+ private Optional<GovernanceEvent> buildAlterRuleItemEvent(final String
databaseName, final MetaDataVersion metaDataVersion, final Type type) {
+ return ruleConfigurationEventBuilder.build(databaseName, new
DataChangedEvent(metaDataVersion.getActiveVersionNodePath(),
metaDataVersion.getNextActiveVersion(), type));
}
@Override
public void removeRuleConfigurationItem(final String databaseName, final
RuleConfiguration toBeRemovedRuleConfig) {
if (null != toBeRemovedRuleConfig) {
- sendDatabaseRuleChangedEvent(databaseName,
-
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
- .deleteConfigurations(databaseName,
Collections.singleton(toBeRemovedRuleConfig)));
+ Collection<MetaDataVersion> metaDataVersions =
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
+ .deleteConfigurations(databaseName,
Collections.singleton(toBeRemovedRuleConfig));
+ for (MetaDataVersion metaDataVersion : metaDataVersions) {
+ Optional<GovernanceEvent> ruleItemEvent =
buildAlterRuleItemEvent(databaseName, metaDataVersion, Type.DELETED);
+ if (ruleItemEvent.isPresent() && ruleItemEvent.get()
instanceof DropRuleItemEvent) {
+
contextManager.getMetaDataContextManager().getRuleItemManager().dropRuleItem((DropRuleItemEvent)
ruleItemEvent.get());
+ }
+ }
clearServiceCache();
}
}
diff --git
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
deleted file mode 100644
index 210fd1bf319..00000000000
---
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mode.manager.standalone.subscriber;
-
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.mode.subsciber.DeliverEventSubscriberRegistry;
-import org.apache.shardingsphere.mode.subsciber.RuleItemChangedSubscriber;
-
-/**
- * Standalone deliver event subscriber registry.
- */
-public final class StandaloneDeliverEventSubscriberRegistry extends
DeliverEventSubscriberRegistry {
-
- public StandaloneDeliverEventSubscriberRegistry(final ContextManager
contextManager) {
- super(contextManager, new RuleItemChangedSubscriber(contextManager));
- }
-}