924060929 commented on code in PR #68196:
URL: https://github.com/apache/doris/pull/68196#discussion_r4129315852
##########
fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalMetaCacheMgr.java:
##########
@@ -497,16 +552,28 @@ public void invalidateDb(ExternalDatabase<?> database) {
}
public void invalidateTable(long catalogId, String dbName, String
tableName) {
- invalidateLanceTableAccess(catalogId);
- routeCatalogEngines(catalogId, cache -> safeInvalidate(
- cache, catalogId, "invalidateTable",
- () -> cache.invalidateTable(catalogId, dbName, tableName)));
+ Optional<ExternalDatabase<? extends ExternalTable>> db =
Optional.empty();
+ try {
+ invalidateLanceTableAccess(catalogId);
+ db = getCachedDb(catalogId, dbName);
+ routeCatalogEngines(catalogId, cache -> safeInvalidate(
+ cache, catalogId, "invalidateTable",
+ () -> cache.invalidateTable(catalogId, dbName,
tableName)));
+ } finally {
+ invalidateTableRowCount(catalogId, db, tableName);
+ }
}
public void invalidateTableByEngine(long catalogId, String engine, String
dbName, String tableName) {
- routeSpecifiedEngine(engine, cache -> safeInvalidate(
- cache, catalogId, "invalidateTableByEngine",
- () -> cache.invalidateTable(catalogId, dbName, tableName)));
+ Optional<ExternalDatabase<? extends ExternalTable>> db =
Optional.empty();
+ try {
+ db = getCachedDb(catalogId, dbName);
+ routeSpecifiedEngine(engine, cache -> safeInvalidate(
Review Comment:
已在 24c9873937a 修复:invalidateTableByEngine(以及同类表/分区入口)先失效行数,再路由引擎缓存,最后再次失效,覆盖
HMS 分区元数据切换窗口。顺序测试与 FE 构建通过。
##########
fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalMetaCacheMgr.java:
##########
@@ -486,8 +507,42 @@ public void removeCatalogByEngine(long catalogId, String
engine) {
}
public void invalidateDb(long catalogId, String dbName) {
- routeCatalogEngines(catalogId, cache -> safeInvalidate(
- cache, catalogId, "invalidateDb", () ->
cache.invalidateDb(catalogId, dbName)));
+ Optional<ExternalDatabase<? extends ExternalTable>> db =
getCachedDb(catalogId, dbName);
+ if (db.isPresent()) {
+ invalidateDb(catalogId, db.get().getId(), db.get().getFullName());
+ return;
+ }
+ Optional<Pair<String, Long>> identity =
getDbIdentityForReplay(catalogId, dbName);
+ if (identity.isPresent()) {
+ invalidateDb(catalogId, identity.get().second,
identity.get().first);
+ } else {
+ invalidateDb(catalogId, dbName, OptionalLong.empty(), true);
+ }
+ }
+
+ public void invalidateDb(long catalogId, long dbId, String dbName) {
+ invalidateDb(catalogId, dbName, OptionalLong.of(dbId), true);
+ }
+
+ void invalidateDb(long catalogId, long dbId, String dbName, boolean
invalidateRowCountCache) {
+ invalidateDb(catalogId, dbName, OptionalLong.of(dbId),
invalidateRowCountCache);
+ }
+
+ private void invalidateDb(long catalogId, String dbName, OptionalLong
dbId, boolean invalidateRowCountCache) {
+ try {
+ routeCatalogEngines(catalogId, cache -> safeInvalidate(
Review Comment:
已在 24c9873937a 修复:catalog/db 路由失效前先对 row-count cache
加围栏,路由结束后再加一次,避免新元数据与旧计数短暂组合。新增测试在引擎失效回调内部验证先前围栏已生效;相关 FE 单测及构建通过。
##########
fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalCatalog.java:
##########
@@ -173,6 +173,25 @@ public synchronized void invalidatePaimonDatabase(String
remoteDbName) throws Ex
}));
}
+ public synchronized void invalidatePaimonDatabaseByLocalName(String
localDbName) throws Exception {
+ if (!isInitialized()) {
+ return;
+ }
+ withSdkCatalogCacheWriteLock(() -> executionAuthenticator.execute(()
-> {
+ boolean caseSensitive = catalog.caseSensitive();
+ int nameMode = getLowerCaseDatabaseNames();
+ invalidateCachedPaimonTables(identifier -> {
+ String remoteName = identifier.getDatabaseName();
+ String candidateLocalName = nameMode == 2 ? remoteName :
fromRemoteDatabaseName(remoteName);
+ if (nameMode == 1) {
+ candidateLocalName =
candidateLocalName.toLowerCase(Locale.ROOT);
Review Comment:
已在 24c9873937a 修复:Paimon mode-1 SDK 缓存的候选名称与 ExternalCatalog 使用相同的默认 Locale
小写规则。新增 Turkish locale 下 SDK-only 缓存失效测试,相关 FE 单测通过。
##########
fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java:
##########
@@ -941,19 +954,46 @@ public Optional<ExternalDatabase<? extends
ExternalTable>> getDbForReplay(String
LOG.debug("getDbForReplay from metacache, db: {}.{}, catalog id:
{}, is catalog init: {}",
this.name, dbName, this.id, isInitialized());
}
- if (!isInitialized()) {
+ if (!isInitialized() || metaCache == null) {
return Optional.empty();
}
// Apply case-insensitive lookup with isReplay=true (no remote calls)
String localDbName = getLocalDatabaseName(dbName, true);
if (localDbName == null) {
localDbName = dbName; // Fallback to original name
+ } else if (getLowerCaseDatabaseNames() == 2 &&
!localDbName.equals(dbName)) {
+ // The current case-insensitive mapping may have rebound after a
DROP. A replay
+ // record names the historical object, not a new same-folded
replacement.
+ long historicalId = Util.genIdByName(name, dbName);
+ if (metaCache.getNameByIdIfPresent(historicalId).isPresent()) {
Review Comment:
已在 24c9873937a 修复:普通 getDbForReplay/getDbIdentityForReplay 恢复当前大小写映射;历史身份只由
DROP 专用查询使用,且 DROP TABLE 钩子也改为该查询。新增暖缓存别名 CREATE/Hive 钩子测试与重绑定 DROP 测试通过。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]