diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
index 826b1ab861..9973de61be 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
@@ -1956,7 +1956,7 @@ public class Config extends ConfigBase {
* only for certain test type. E.g. only settting batch_size to small
* value for p0.
*/
- @ConfField(mutable = true, masterOnly = false)
+ @ConfField(mutable = true, masterOnly = false, options = {"p0"})
public static String fuzzy_test_type = "";
/**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
index fd709963a7..548119dfb7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
@@ -49,7 +49,6 @@ import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -416,6 +415,7 @@ public class Database extends MetaObject implements Writable, DatabaseIf
}
}
+ @Override
public boolean registerTable(TableIf table) {
boolean result = true;
Table olapTable = (Table) table;
@@ -851,11 +851,6 @@ public class Database extends MetaObject implements Writable, DatabaseIf
return null;
}
- @Override
- public Map getIdToTable() {
- return new HashMap<>(idToTable);
- }
-
public void replayUpdateDbProperties(Map properties) {
dbProperties.updateProperties(properties);
if (PropertyAnalyzer.hasBinlogConfig(properties)) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/DatabaseIf.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/DatabaseIf.java
index 6c0d46ffe9..3aae592dec 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/DatabaseIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/DatabaseIf.java
@@ -31,7 +31,6 @@ import org.apache.logging.log4j.Logger;
import java.util.Arrays;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -75,7 +74,7 @@ public interface DatabaseIf {
List getTables();
- default List getTablesOrEmpty() {
+ default List getTablesIgnoreException() {
try {
return getTables();
} catch (Exception e) {
@@ -281,6 +280,4 @@ public interface DatabaseIf {
default long getLastUpdateTime() {
return -1L;
}
-
- Map getIdToTable();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
index 65bf7d308f..9552250369 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
@@ -24,6 +24,7 @@ import org.apache.doris.common.DdlException;
import org.apache.doris.common.FeConstants;
import org.apache.doris.common.proc.BaseProcResult;
import org.apache.doris.common.util.Util;
+import org.apache.doris.datasource.ExternalCatalog;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -125,20 +126,8 @@ public class JdbcResource extends Resource {
CONNECTION_POOL_MAX_LIFE_TIME,
CONNECTION_POOL_MAX_WAIT_TIME,
CONNECTION_POOL_KEEP_ALIVE,
- TEST_CONNECTION
- ).build();
- private static final ImmutableList OPTIONAL_PROPERTIES = new ImmutableList.Builder().add(
- ONLY_SPECIFIED_DATABASE,
- LOWER_CASE_META_NAMES,
- META_NAMES_MAPPING,
- INCLUDE_DATABASE_LIST,
- EXCLUDE_DATABASE_LIST,
- CONNECTION_POOL_MIN_SIZE,
- CONNECTION_POOL_MAX_SIZE,
- CONNECTION_POOL_MAX_LIFE_TIME,
- CONNECTION_POOL_MAX_WAIT_TIME,
- CONNECTION_POOL_KEEP_ALIVE,
- TEST_CONNECTION
+ TEST_CONNECTION,
+ ExternalCatalog.USE_META_CACHE
).build();
// The default value of optional properties
@@ -157,6 +146,8 @@ public class JdbcResource extends Resource {
OPTIONAL_PROPERTIES_DEFAULT_VALUE.put(CONNECTION_POOL_MAX_WAIT_TIME, "5000");
OPTIONAL_PROPERTIES_DEFAULT_VALUE.put(CONNECTION_POOL_KEEP_ALIVE, "false");
OPTIONAL_PROPERTIES_DEFAULT_VALUE.put(TEST_CONNECTION, "true");
+ OPTIONAL_PROPERTIES_DEFAULT_VALUE.put(ExternalCatalog.USE_META_CACHE,
+ String.valueOf(ExternalCatalog.DEFAULT_USE_META_CACHE));
}
// timeout for both connection and read. 10 seconds is long enough.
@@ -225,7 +216,7 @@ public class JdbcResource extends Resource {
@Override
public void applyDefaultProperties() {
- for (String s : OPTIONAL_PROPERTIES) {
+ for (String s : OPTIONAL_PROPERTIES_DEFAULT_VALUE.keySet()) {
if (!configs.containsKey(s)) {
configs.put(s, OPTIONAL_PROPERTIES_DEFAULT_VALUE.get(s));
}
@@ -487,3 +478,4 @@ public class JdbcResource extends Resource {
}
}
}
+
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
index 028fe186b2..8bbdfe1d5f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
@@ -17,8 +17,6 @@
package org.apache.doris.catalog;
-import org.apache.doris.alter.Alter;
-import org.apache.doris.analysis.AlterTableStmt;
import org.apache.doris.analysis.CreateViewStmt;
import org.apache.doris.common.Pair;
@@ -43,17 +41,6 @@ public abstract class MysqlCompatibleDatabase extends Database {
*/
protected abstract void initTables();
- /**
- * Currently, rename a table of InfoSchemaDb will throw exception
- * {@link Alter#processAlterTable(AlterTableStmt)}
- * so we follow this design.
- * @note: Rename a table of mysql database in MYSQL ls allowed.
- */
- @Override
- public boolean registerTable(TableIf table) {
- return super.registerTable(table);
- }
-
@Override
public void unregisterTable(String name) {
// Do nothing
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
index 39efce4c70..d017ba7829 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
@@ -41,6 +41,7 @@ import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -108,10 +109,14 @@ public class RefreshManager {
private void refreshDbInternal(long catalogId, long dbId, boolean invalidCache) {
ExternalCatalog catalog = (ExternalCatalog) Env.getCurrentEnv().getCatalogMgr().getCatalog(catalogId);
- ExternalDatabase db = catalog.getDbForReplay(dbId);
- db.setUnInitialized(invalidCache);
- LOG.info("refresh database {} in catalog {} with invalidCache {}", db.getFullName(), catalog.getName(),
- invalidCache);
+ Optional> db = catalog.getDbForReplay(dbId);
+ // Database may not exist if 'use_meta_cache' is true.
+ // Because each FE fetch the meta data independently.
+ db.ifPresent(e -> {
+ e.setUnInitialized(invalidCache);
+ LOG.info("refresh database {} in catalog {} with invalidCache {}", e.getFullName(),
+ catalog.getName(), invalidCache);
+ });
}
// Refresh table
@@ -163,13 +168,22 @@ public class RefreshManager {
LOG.warn("failed to find catalog replaying refresh table {}", log.getCatalogId());
return;
}
- ExternalDatabase db = catalog.getDbForReplay(log.getDbId());
- TableIf table = db.getTableForReplay(log.getTableId());
- refreshTableInternal(catalog, db, table, log.getLastUpdateTime());
+ Optional> db = catalog.getDbForReplay(log.getDbId());
+ // See comment in refreshDbInternal for why db and table may be null.
+ if (!db.isPresent()) {
+ LOG.warn("failed to find db replaying refresh table {}", log.getDbId());
+ return;
+ }
+ Optional extends ExternalTable> table = db.get().getTableForReplay(log.getTableId());
+ if (!table.isPresent()) {
+ LOG.warn("failed to find table replaying refresh table {}", log.getTableId());
+ return;
+ }
+ refreshTableInternal(catalog, db.get(), table.get(), log.getLastUpdateTime());
}
public void refreshExternalTableFromEvent(String catalogName, String dbName, String tableName,
- long updateTime, boolean ignoreIfNotExists) throws DdlException {
+ long updateTime) throws DdlException {
CatalogIf catalog = Env.getCurrentEnv().getCatalogMgr().getCatalog(catalogName);
if (catalog == null) {
throw new DdlException("No catalog found with name: " + catalogName);
@@ -179,17 +193,11 @@ public class RefreshManager {
}
DatabaseIf db = catalog.getDbNullable(dbName);
if (db == null) {
- if (!ignoreIfNotExists) {
- throw new DdlException("Database " + dbName + " does not exist in catalog " + catalog.getName());
- }
return;
}
TableIf table = db.getTableNullable(tableName);
if (table == null) {
- if (!ignoreIfNotExists) {
- throw new DdlException("Table " + tableName + " does not exist in db " + dbName);
- }
return;
}
refreshTableInternal(catalog, db, table, updateTime);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/CacheFactory.java b/fe/fe-core/src/main/java/org/apache/doris/common/CacheFactory.java
index fbb004e5c9..50f4664797 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/CacheFactory.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/CacheFactory.java
@@ -22,6 +22,7 @@ import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
import com.github.benmanes.caffeine.cache.CacheLoader;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
+import com.github.benmanes.caffeine.cache.RemovalListener;
import com.github.benmanes.caffeine.cache.Ticker;
import org.jetbrains.annotations.NotNull;
@@ -74,9 +75,13 @@ public class CacheFactory {
}
// Build a loading cache, with executor, it will use given executor for refresh
- public LoadingCache buildCache(CacheLoader cacheLoader, ExecutorService executor) {
+ public LoadingCache buildCache(CacheLoader cacheLoader,
+ RemovalListener removalListener, ExecutorService executor) {
Caffeine