Skip to content

Commit bd27d24

Browse files
authored
[backport #37549][branch-2.5][Enhancement] invalidate table cache after hive table do not need to refresh by ConnectorTableMetadataProcessor (#37668)
Signed-off-by: Youngwb <[email protected]>
1 parent b63b82c commit bd27d24

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

fe/fe-core/src/main/java/com/starrocks/connector/hive/CachingHiveMetastore.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,15 +397,20 @@ public List<HivePartitionName> refreshTableBackground(String hiveDbName, String
397397
if (lastAccessTimeMap.containsKey(hiveTableName)) {
398398
long lastAccessTime = lastAccessTimeMap.get(hiveTableName);
399399
long intervalSec = (System.currentTimeMillis() - lastAccessTime) / 1000;
400-
if (intervalSec > Config.background_refresh_metadata_time_secs_since_last_access_secs) {
400+
long refreshIntervalSinceLastAccess = Config.background_refresh_metadata_time_secs_since_last_access_secs;
401+
if (refreshIntervalSinceLastAccess >= 0 && intervalSec > refreshIntervalSinceLastAccess) {
402+
// invalidate table cache
403+
invalidateTable(hiveDbName, hiveTblName);
404+
lastAccessTimeMap.remove(hiveTableName);
401405
LOG.info("{}.{} skip refresh because of the last access time is {}", hiveDbName, hiveTblName,
402406
LocalDateTime.ofInstant(Instant.ofEpochMilli(lastAccessTime), ZoneId.systemDefault()));
403407
return null;
404408
}
405409
}
406410

407411
List<HivePartitionName> refreshPartitionNames = refreshTable(hiveDbName, hiveTblName, onlyCachedPartitions);
408-
lastAccessTimeMap.keySet().removeIf(tableName -> !getCachedTableNames().contains(tableName));
412+
Set<HiveTableName> cachedTableNames = getCachedTableNames();
413+
lastAccessTimeMap.keySet().removeIf(tableName -> !(cachedTableNames.contains(tableName)));
409414
return refreshPartitionNames;
410415
}
411416

fe/fe-core/src/test/java/com/starrocks/connector/hive/CachingHiveMetastoreTest.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.starrocks.catalog.HiveTable;
2222
import com.starrocks.catalog.PrimitiveType;
2323
import com.starrocks.catalog.ScalarType;
24+
import com.starrocks.common.Config;
2425
import com.starrocks.connector.PartitionUtil;
2526
import com.starrocks.connector.exception.StarRocksConnectorException;
2627
import mockit.Expectations;
@@ -43,7 +44,7 @@ public class CachingHiveMetastoreTest {
4344
private HiveMetaClient client;
4445
private HiveMetastore metastore;
4546
private ExecutorService executor;
46-
private long expireAfterWriteSec = 10;
47+
private long expireAfterWriteSec = 30;
4748
private long refreshAfterWriteSec = -1;
4849

4950
@Before
@@ -158,6 +159,48 @@ public void testRefreshTableSync() {
158159
Assert.assertEquals(1, cachingHiveMetastore.tableNameLockMap.size());
159160
}
160161

162+
@Test
163+
public void testRefreshTableBackground() throws InterruptedException {
164+
CachingHiveMetastore cachingHiveMetastore = new CachingHiveMetastore(
165+
metastore, executor, expireAfterWriteSec, refreshAfterWriteSec, 1000, false);
166+
Assert.assertFalse(cachingHiveMetastore.tableNameLockMap.containsKey(
167+
HiveTableName.of("db1", "tbl1")));
168+
try {
169+
// mock query table tbl1
170+
List<String> partitionNames = cachingHiveMetastore.getPartitionKeys("db1", "tbl1");
171+
cachingHiveMetastore.getPartitionsByNames("db1",
172+
"tbl1", partitionNames);
173+
// put table tbl1 in table cache
174+
cachingHiveMetastore.refreshTable("db1", "tbl1", true);
175+
} catch (Exception e) {
176+
Assert.fail();
177+
}
178+
Assert.assertTrue(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
179+
180+
try {
181+
cachingHiveMetastore.refreshTableBackground("db1", "tbl1", true);
182+
} catch (Exception e) {
183+
Assert.fail();
184+
}
185+
// not skip refresh table, table cache still exist
186+
Assert.assertTrue(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
187+
// sleep 1s, background refresh table will be skipped
188+
Thread.sleep(1000);
189+
long oldValue = Config.background_refresh_metadata_time_secs_since_last_access_secs;
190+
// not refresh table, just skip refresh table
191+
Config.background_refresh_metadata_time_secs_since_last_access_secs = 0;
192+
193+
try {
194+
cachingHiveMetastore.refreshTableBackground("db1", "tbl1", true);
195+
} catch (Exception e) {
196+
Assert.fail();
197+
} finally {
198+
Config.background_refresh_metadata_time_secs_since_last_access_secs = oldValue;
199+
}
200+
// table cache will be removed because of skip refresh table
201+
Assert.assertFalse(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
202+
}
203+
161204
@Test
162205
public void testGetPartitionKeys() {
163206
CachingHiveMetastore cachingHiveMetastore = new CachingHiveMetastore(

0 commit comments

Comments
 (0)