You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2021/04/09 12:29:35 UTC
[shardingsphere] branch master updated: Can load authority from
diff database types (#10013)
This is an automated email from the ASF dual-hosted git repository.
wuweijie 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 d970cc5 Can load authority from diff database types (#10013)
d970cc5 is described below
commit d970cc576b531be2dc21e6a43e98237aa00e487c
Author: Liang Zhang <te...@163.com>
AuthorDate: Fri Apr 9 20:29:06 2021 +0800
Can load authority from diff database types (#10013)
---
.../authority/spi/PrivilegeLoadAlgorithm.java | 4 +-
.../storage/StoragePrivilegeLoadAlgorithm.java | 5 +--
.../storage/impl/StoragePrivilegeBuilder.java | 46 ++++++++++++++++------
.../authority/rule/AuthorityRule.java | 6 +--
.../rule/builder/AuthorityRuleBuilder.java | 28 +------------
.../authority/GovernanceAuthorityContext.java | 2 +-
6 files changed, 40 insertions(+), 51 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
index 5839494..59f72b5 100644
--- a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.authority.spi;
import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
@@ -34,10 +33,9 @@ public interface PrivilegeLoadAlgorithm extends ShardingSphereAlgorithm {
/**
* Load privileges.
*
- * @param databaseType database type
* @param mataDataMap mata data map
* @param users users
* @return user and privileges map
*/
- Map<ShardingSphereUser, ShardingSpherePrivileges> load(DatabaseType databaseType, Map<String, ShardingSphereMetaData> mataDataMap, Collection<ShardingSphereUser> users);
+ Map<ShardingSphereUser, ShardingSpherePrivileges> load(Map<String, ShardingSphereMetaData> mataDataMap, Collection<ShardingSphereUser> users);
}
diff --git a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
index f292626..65600c0 100644
--- a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
@@ -21,7 +21,6 @@ import org.apache.shardingsphere.authority.loader.storage.impl.StoragePrivilegeB
import org.apache.shardingsphere.authority.loader.storage.impl.StoragePrivilegeLoader;
import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
import org.apache.shardingsphere.authority.spi.PrivilegeLoadAlgorithm;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -40,8 +39,8 @@ public final class StoragePrivilegeLoadAlgorithm implements PrivilegeLoadAlgorit
}
@Override
- public Map<ShardingSphereUser, ShardingSpherePrivileges> load(final DatabaseType databaseType, final Map<String, ShardingSphereMetaData> mataDataMap, final Collection<ShardingSphereUser> users) {
- return StoragePrivilegeBuilder.build(databaseType, new LinkedList<>(mataDataMap.values()), users);
+ public Map<ShardingSphereUser, ShardingSpherePrivileges> load(final Map<String, ShardingSphereMetaData> mataDataMap, final Collection<ShardingSphereUser> users) {
+ return StoragePrivilegeBuilder.build(new LinkedList<>(mataDataMap.values()), users);
}
@Override
diff --git a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
index a19c60a..2eaa7241 100644
--- a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
+++ b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
@@ -17,10 +17,12 @@
package org.apache.shardingsphere.authority.loader.storage.impl;
+import com.google.common.base.Preconditions;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
@@ -28,6 +30,8 @@ import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
@@ -61,35 +65,51 @@ public final class StoragePrivilegeBuilder {
/**
* Build privileges.
*
- * @param databaseType database type
* @param metaDataList meta data list
* @param users users
* @return privileges
*/
- public static Map<ShardingSphereUser, ShardingSpherePrivileges> build(final DatabaseType databaseType,
- final Collection<ShardingSphereMetaData> metaDataList, final Collection<ShardingSphereUser> users) {
- if (metaDataList.isEmpty()) {
- return buildDefaultPrivileges(users);
- }
- Optional<StoragePrivilegeLoader> loader = TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, databaseType.getName(), new Properties());
- return loader.map(optional -> build(metaDataList, users, optional)).orElseGet(() -> buildDefaultPrivileges(users));
+ public static Map<ShardingSphereUser, ShardingSpherePrivileges> build(final Collection<ShardingSphereMetaData> metaDataList, final Collection<ShardingSphereUser> users) {
+ return metaDataList.isEmpty() ? buildDefaultPrivileges(users) : buildWithMetaData(metaDataList, users);
}
- private static Map<ShardingSphereUser, ShardingSpherePrivileges> build(final Collection<ShardingSphereMetaData> metaDataList,
- final Collection<ShardingSphereUser> users, final StoragePrivilegeLoader loader) {
+ private static Map<ShardingSphereUser, ShardingSpherePrivileges> buildWithMetaData(final Collection<ShardingSphereMetaData> metaDataList, final Collection<ShardingSphereUser> users) {
Map<ShardingSphereUser, ShardingSpherePrivileges> result = new LinkedHashMap<>();
for (ShardingSphereMetaData each : metaDataList) {
- result.putAll(build(each, users, loader));
+ result.putAll(buildWithMetaData(each, users));
}
return result;
}
- private static Map<ShardingSphereUser, ShardingSpherePrivileges> build(final ShardingSphereMetaData metaData, final Collection<ShardingSphereUser> users, final StoragePrivilegeLoader loader) {
- Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = load(metaData.getResource().getAllInstanceDataSources(), users, loader);
+ private static Map<ShardingSphereUser, ShardingSpherePrivileges> buildWithMetaData(final ShardingSphereMetaData metaData, final Collection<ShardingSphereUser> users) {
+ DatabaseType databaseType = getDatabaseType(metaData.getResource().getAllInstanceDataSources());
+ Optional<StoragePrivilegeLoader> loader = TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, databaseType.getName(), new Properties());
+ if (!loader.isPresent()) {
+ return buildDefaultPrivileges(users);
+ }
+ Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = load(metaData.getResource().getAllInstanceDataSources(), users, loader.get());
checkPrivileges(result);
return StoragePrivilegeMerger.merge(result, metaData.getName(), metaData.getRuleMetaData().getRules());
}
+ private static DatabaseType getDatabaseType(final Collection<DataSource> dataSources) {
+ DatabaseType result = null;
+ for (DataSource each : dataSources) {
+ DatabaseType databaseType = getDatabaseType(each);
+ Preconditions.checkState(null == result || result == databaseType, String.format("Database type inconsistent with '%s' and '%s'", result, databaseType));
+ result = databaseType;
+ }
+ return null == result ? DatabaseTypeRegistry.getDefaultDatabaseType() : result;
+ }
+
+ private static DatabaseType getDatabaseType(final DataSource dataSource) {
+ try (Connection connection = dataSource.getConnection()) {
+ return DatabaseTypeRegistry.getDatabaseTypeByURL(connection.getMetaData().getURL());
+ } catch (final SQLException ex) {
+ return null;
+ }
+ }
+
private static Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> load(final Collection<DataSource> dataSources,
final Collection<ShardingSphereUser> users, final StoragePrivilegeLoader loader) {
Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = new LinkedHashMap<>(users.size(), 1);
diff --git a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
index d0b3c8c..7386bb2 100644
--- a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
+++ b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.authority.engine.ShardingSphereAuthority;
import org.apache.shardingsphere.authority.engine.impl.DefaultAuthority;
import org.apache.shardingsphere.authority.spi.PrivilegeLoadAlgorithm;
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
@@ -41,11 +40,10 @@ public final class AuthorityRule implements GlobalRule {
ShardingSphereServiceLoader.register(PrivilegeLoadAlgorithm.class);
}
- public AuthorityRule(final AuthorityRuleConfiguration config, final Map<String, ShardingSphereMetaData> mataDataMap, final DatabaseType databaseType,
- final Collection<ShardingSphereUser> users) {
+ public AuthorityRule(final AuthorityRuleConfiguration config, final Map<String, ShardingSphereMetaData> mataDataMap, final Collection<ShardingSphereUser> users) {
PrivilegeLoadAlgorithm privilegeLoader = ShardingSphereAlgorithmFactory.createAlgorithm(config.getPrivilegeLoader(), PrivilegeLoadAlgorithm.class);
ShardingSphereAuthority authority = null == AuthorityContext.getInstance().getAuthority() ? new DefaultAuthority() : AuthorityContext.getInstance().getAuthority();
- authority.init(privilegeLoader.load(databaseType, mataDataMap, users));
+ authority.init(privilegeLoader.load(mataDataMap, users));
AuthorityContext.getInstance().init(authority);
}
}
diff --git a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
index b136d26..5ebc416 100644
--- a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
+++ b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
@@ -17,20 +17,13 @@
package org.apache.shardingsphere.authority.rule.builder;
-import com.google.common.base.Preconditions;
import org.apache.shardingsphere.authority.api.config.AuthorityRuleConfiguration;
import org.apache.shardingsphere.authority.constant.AuthorityOrder;
import org.apache.shardingsphere.authority.rule.AuthorityRule;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.infra.rule.builder.GlobalRuleBuilder;
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
@@ -41,26 +34,7 @@ public final class AuthorityRuleBuilder implements GlobalRuleBuilder<AuthorityRu
@Override
public AuthorityRule build(final Map<String, ShardingSphereMetaData> mataDataMap, final AuthorityRuleConfiguration ruleConfig, final Collection<ShardingSphereUser> users) {
- DatabaseType databaseType = mataDataMap.isEmpty() ? new MySQLDatabaseType() : getDatabaseType(mataDataMap.values().iterator().next().getResource().getDataSources());
- return new AuthorityRule(ruleConfig, mataDataMap, databaseType, users);
- }
-
- private static DatabaseType getDatabaseType(final Map<String, DataSource> dataSourceMap) {
- DatabaseType result = null;
- for (DataSource each : dataSourceMap.values()) {
- DatabaseType databaseType = getDatabaseType(each);
- Preconditions.checkState(null == result || result == databaseType, String.format("Database type inconsistent with '%s' and '%s'", result, databaseType));
- result = databaseType;
- }
- return null == result ? DatabaseTypeRegistry.getDefaultDatabaseType() : result;
- }
-
- private static DatabaseType getDatabaseType(final DataSource dataSource) {
- try (Connection connection = dataSource.getConnection()) {
- return DatabaseTypeRegistry.getDatabaseTypeByURL(connection.getMetaData().getURL());
- } catch (final SQLException ex) {
- return null;
- }
+ return new AuthorityRule(ruleConfig, mataDataMap, users);
}
@Override
diff --git a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
index ac4807b..d4a0e99 100644
--- a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
+++ b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
@@ -104,7 +104,7 @@ public final class GovernanceAuthorityContext implements MetaDataAwareEventSubsc
Optional<StoragePrivilegeLoader> loader = TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, databaseType.getName(), new Properties());
// TODO :Authority, Loader is created here and still created in StoragePrivilegeBuilder
if (loader.isPresent()) {
- Map<ShardingSphereUser, ShardingSpherePrivileges> privileges = StoragePrivilegeBuilder.build(databaseType, metaDataContexts.getMetaDataMap().values(), users);
+ Map<ShardingSphereUser, ShardingSpherePrivileges> privileges = StoragePrivilegeBuilder.build(metaDataContexts.getMetaDataMap().values(), users);
authority.init(getPrivilegesWithPassword(privileges));
}
AuthorityContext.getInstance().init(authority);