Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix](multicatalog) make lastdbofcatalog a session variable #37826

Merged
merged 3 commits into from
Jul 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
Original file line number Diff line number Diff line change
Expand Up @@ -4833,7 +4833,7 @@ public void cancelAlterCluster(CancelAlterSystemStmt stmt) throws DdlException {
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) {
Expand All @@ -4845,11 +4845,11 @@ public void changeCatalog(ConnectContext ctx, String catalogName) throws DdlExce
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -136,7 +134,9 @@ private CatalogIf removeCatalog(long catalogId) {
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());
Expand Down Expand Up @@ -200,14 +200,6 @@ public CatalogIf getCatalogOrAnalysisException(String name) throws AnalysisExcep
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());
}
Expand Down Expand Up @@ -288,7 +280,9 @@ public void dropCatalog(DropCatalogStmt stmt) throws UserException {
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 {
Expand All @@ -313,10 +307,13 @@ public void alterCatalogName(AlterCatalogNameStmt stmt) throws UserException {
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();
Expand Down
15 changes: 15 additions & 0 deletions fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -265,6 +268,18 @@ public boolean isSend() {
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading