Skip to content

Commit

Permalink
Add RuleItemManager and remove StandaloneDeliverEventSubscriberRegist…
Browse files Browse the repository at this point in the history
…ry (apache#31772)
  • Loading branch information
menghaoranss authored and taojintianxia committed Jun 21, 2024
1 parent 0c318ac commit a159db7
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
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;
Expand All @@ -49,9 +48,7 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
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;
Expand Down Expand Up @@ -275,29 +278,32 @@ public Collection<MetaDataVersion> alterRuleConfiguration(final String databaseN
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();
}
}
Expand Down

This file was deleted.

0 comments on commit a159db7

Please sign in to comment.