This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 17d01bb08d9 [fix](multicatalog) make lastdbofcatalog a session
variable (#37826)
17d01bb08d9 is described below
commit 17d01bb08d96a1fcc54e9b93834407833eaffb38
Author: Yulei-Yang <[email protected]>
AuthorDate: Tue Jul 23 11:12:05 2024 +0800
[fix](multicatalog) make lastdbofcatalog a session variable (#37826)
bp #37828
---
.../main/java/org/apache/doris/catalog/Env.java | 6 ++---
.../org/apache/doris/datasource/CatalogMgr.java | 29 ++++++++++------------
.../java/org/apache/doris/qe/ConnectContext.java | 15 +++++++++++
.../hive/test_external_catalog_hive.groovy | 17 +++++++++++--
4 files changed, 46 insertions(+), 21 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index ba877001cf8..b496c880bce 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -4833,7 +4833,7 @@ public class Env {
this.alter.getClusterHandler().cancel(stmt);
}
- // Switch catalog of this sesseion.
+ // Switch catalog of this session.
public void changeCatalog(ConnectContext ctx, String catalogName) throws
DdlException {
CatalogIf catalogIf = catalogMgr.getCatalogNullable(catalogName);
if (catalogIf == null) {
@@ -4845,11 +4845,11 @@ public class Env {
if (StringUtils.isNotEmpty(currentDB)) {
// When dropped the current catalog in current context, the
current catalog will be null.
if (ctx.getCurrentCatalog() != null) {
-
catalogMgr.addLastDBOfCatalog(ctx.getCurrentCatalog().getName(), currentDB);
+ ctx.addLastDBOfCatalog(ctx.getCurrentCatalog().getName(),
currentDB);
}
}
ctx.changeDefaultCatalog(catalogName);
- String lastDb = catalogMgr.getLastDB(catalogName);
+ String lastDb = ctx.getLastDBOfCatalog(catalogName);
if (StringUtils.isNotEmpty(lastDb)) {
ctx.setDatabase(lastDb);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
index ac809812260..3f2571c4146 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
@@ -95,8 +95,6 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
private final Map<Long, CatalogIf<? extends DatabaseIf<? extends
TableIf>>> idToCatalog = Maps.newConcurrentMap();
// this map will be regenerated from idToCatalog, so not need to persist.
private final Map<String, CatalogIf> nameToCatalog =
Maps.newConcurrentMap();
- // record last used database of every catalog
- private final Map<String, String> lastDBOfCatalog =
Maps.newConcurrentMap();
// Use a separate instance to facilitate access.
// internalDataSource still exists in idToCatalog and nameToCatalog
@@ -136,7 +134,9 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
if (catalog != null) {
catalog.onClose();
nameToCatalog.remove(catalog.getName());
- lastDBOfCatalog.remove(catalog.getName());
+ if (ConnectContext.get() != null) {
+ ConnectContext.get().removeLastDBOfCatalog(catalog.getName());
+ }
Env.getCurrentEnv().getExtMetaCacheMgr().removeCache(catalog.getId());
if (!Strings.isNullOrEmpty(catalog.getResource())) {
Resource catalogResource =
Env.getCurrentEnv().getResourceMgr().getResource(catalog.getResource());
@@ -200,14 +200,6 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
ErrorCode.ERR_UNKNOWN_CATALOG));
}
- public void addLastDBOfCatalog(String catalog, String db) {
- lastDBOfCatalog.put(catalog, db);
- }
-
- public String getLastDB(String catalog) {
- return lastDBOfCatalog.get(catalog);
- }
-
public List<Long> getCatalogIds() {
return Lists.newArrayList(idToCatalog.keySet());
}
@@ -288,7 +280,9 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
replayDropCatalog(log);
Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_DROP_CATALOG,
log);
- lastDBOfCatalog.remove(stmt.getCatalogName());
+ if (ConnectContext.get() != null) {
+
ConnectContext.get().removeLastDBOfCatalog(stmt.getCatalogName());
+ }
Env.getCurrentEnv().getQueryStats().clear(catalog.getId());
} finally {
@@ -313,10 +307,13 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
replayAlterCatalogName(log);
Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_ALTER_CATALOG_NAME,
log);
- String db = lastDBOfCatalog.get(stmt.getCatalogName());
- if (db != null) {
- lastDBOfCatalog.remove(stmt.getCatalogName());
- lastDBOfCatalog.put(log.getNewCatalogName(), db);
+ ConnectContext ctx = ConnectContext.get();
+ if (ctx != null) {
+ String db = ctx.getLastDBOfCatalog(stmt.getCatalogName());
+ if (db != null) {
+ ctx.removeLastDBOfCatalog(stmt.getCatalogName());
+ ctx.addLastDBOfCatalog(log.getNewCatalogName(), db);
+ }
}
} finally {
writeUnlock();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
index 89d04a762ce..9a2dcb176e4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
@@ -146,6 +146,9 @@ public class ConnectContext {
protected String defaultCatalog = InternalCatalog.INTERNAL_CATALOG_NAME;
protected boolean isSend;
+ // record last used database of every catalog
+ private final Map<String, String> lastDBOfCatalog =
Maps.newConcurrentMap();
+
protected AuditEventBuilder auditEventBuilder = new AuditEventBuilder();
protected String remoteIP;
@@ -265,6 +268,18 @@ public class ConnectContext {
return this.isSend;
}
+ public void addLastDBOfCatalog(String catalog, String db) {
+ lastDBOfCatalog.put(catalog, db);
+ }
+
+ public String getLastDBOfCatalog(String catalog) {
+ return lastDBOfCatalog.get(catalog);
+ }
+
+ public String removeLastDBOfCatalog(String catalog) {
+ return lastDBOfCatalog.get(catalog);
+ }
+
public void setNotEvalNondeterministicFunction(boolean
notEvalNondeterministicFunction) {
this.notEvalNondeterministicFunction = notEvalNondeterministicFunction;
}
diff --git
a/regression-test/suites/external_table_p2/hive/test_external_catalog_hive.groovy
b/regression-test/suites/external_table_p2/hive/test_external_catalog_hive.groovy
index 45b0b7dc9ca..05c82d70bdc 100644
---
a/regression-test/suites/external_table_p2/hive/test_external_catalog_hive.groovy
+++
b/regression-test/suites/external_table_p2/hive/test_external_catalog_hive.groovy
@@ -132,10 +132,23 @@ suite("test_external_catalog_hive", "p2") {
sql """alter catalog ${catalog_name} rename hms;"""
sql """switch hms;"""
-
- def res3 = sql """select count(*) from test.hive_test limit 10;"""
+ sql """use test;"""
+ def res3 = sql """select count(*) from hive_test limit 10;"""
logger.info("recoding select: " + res3.toString())
+ def user = 'account_user_test'
+ def pwd = 'C123_567p'
+ try_sql("DROP USER ${user}")
+ sql """CREATE USER '${user}' IDENTIFIED BY '${pwd}'"""
+ sql """GRANT SELECT_PRIV on *.*.* to '${user}'"""
+ connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
+ sql """switch hms;"""
+ test {
+ sql "show tables"
+ exception "errCode = 2, detailMessage = No database selected"
+ }
+ }
+
sql """alter catalog hms rename ${catalog_name};"""
// test wrong access controller
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]