Skip to content

Commit fe98175

Browse files
Youngwbmergify[bot]
authored andcommitted
[Enhancement] invalidate table cache after hive table do not need to refresh by ConnectorTableMetadataProcessor (#37549)
Signed-off-by: Youngwb <[email protected]> (cherry picked from commit d24c364) # Conflicts: # fe/fe-core/src/test/java/com/starrocks/connector/hive/CachingHiveMetastoreTest.java
1 parent b4e902d commit fe98175

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-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
@@ -553,15 +553,20 @@ public List<HivePartitionName> refreshTableBackground(String hiveDbName, String
553553
if (lastAccessTimeMap.containsKey(hiveTableName)) {
554554
long lastAccessTime = lastAccessTimeMap.get(hiveTableName);
555555
long intervalSec = (System.currentTimeMillis() - lastAccessTime) / 1000;
556-
if (intervalSec > Config.background_refresh_metadata_time_secs_since_last_access_secs) {
556+
long refreshIntervalSinceLastAccess = Config.background_refresh_metadata_time_secs_since_last_access_secs;
557+
if (refreshIntervalSinceLastAccess >= 0 && intervalSec > refreshIntervalSinceLastAccess) {
558+
// invalidate table cache
559+
invalidateTable(hiveDbName, hiveTblName);
560+
lastAccessTimeMap.remove(hiveTableName);
557561
LOG.info("{}.{} skip refresh because of the last access time is {}", hiveDbName, hiveTblName,
558562
LocalDateTime.ofInstant(Instant.ofEpochMilli(lastAccessTime), ZoneId.systemDefault()));
559563
return null;
560564
}
561565
}
562566

563567
List<HivePartitionName> refreshPartitionNames = refreshTable(hiveDbName, hiveTblName, onlyCachedPartitions);
564-
lastAccessTimeMap.keySet().removeIf(tableName -> !getCachedTableNames().contains(tableName));
568+
Set<HiveTableName> cachedTableNames = getCachedTableNames();
569+
lastAccessTimeMap.keySet().removeIf(tableName -> !(cachedTableNames.contains(tableName)));
565570
return refreshPartitionNames;
566571
}
567572

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

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
import com.starrocks.catalog.HiveTable;
2222
import com.starrocks.catalog.PrimitiveType;
2323
import com.starrocks.catalog.ScalarType;
24+
<<<<<<< HEAD
25+
=======
26+
import com.starrocks.catalog.Type;
27+
import com.starrocks.common.Config;
28+
>>>>>>> d24c364da6 ([Enhancement] invalidate table cache after hive table do not need to refresh by ConnectorTableMetadataProcessor (#37549))
2429
import com.starrocks.connector.MetastoreType;
2530
import com.starrocks.connector.PartitionUtil;
2631
import com.starrocks.connector.exception.StarRocksConnectorException;
@@ -44,7 +49,7 @@ public class CachingHiveMetastoreTest {
4449
private HiveMetaClient client;
4550
private HiveMetastore metastore;
4651
private ExecutorService executor;
47-
private long expireAfterWriteSec = 10;
52+
private long expireAfterWriteSec = 30;
4853
private long refreshAfterWriteSec = -1;
4954

5055
@Before
@@ -166,6 +171,49 @@ public void testRefreshTableSync() {
166171
Assert.assertEquals(1, cachingHiveMetastore.tableNameLockMap.size());
167172
}
168173

174+
@Test
175+
public void testRefreshTableBackground() throws InterruptedException {
176+
CachingHiveMetastore cachingHiveMetastore = new CachingHiveMetastore(
177+
metastore, executor, expireAfterWriteSec, refreshAfterWriteSec, 1000, false);
178+
Assert.assertFalse(cachingHiveMetastore.tableNameLockMap.containsKey(
179+
HiveTableName.of("db1", "tbl1")));
180+
try {
181+
// mock query table tbl1
182+
List<String> partitionNames = cachingHiveMetastore.getPartitionKeysByValue("db1", "tbl1",
183+
HivePartitionValue.ALL_PARTITION_VALUES);
184+
cachingHiveMetastore.getPartitionsByNames("db1",
185+
"tbl1", partitionNames);
186+
// put table tbl1 in table cache
187+
cachingHiveMetastore.refreshTable("db1", "tbl1", true);
188+
} catch (Exception e) {
189+
Assert.fail();
190+
}
191+
Assert.assertTrue(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
192+
193+
try {
194+
cachingHiveMetastore.refreshTableBackground("db1", "tbl1", true);
195+
} catch (Exception e) {
196+
Assert.fail();
197+
}
198+
// not skip refresh table, table cache still exist
199+
Assert.assertTrue(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
200+
// sleep 1s, background refresh table will be skipped
201+
Thread.sleep(1000);
202+
long oldValue = Config.background_refresh_metadata_time_secs_since_last_access_secs;
203+
// not refresh table, just skip refresh table
204+
Config.background_refresh_metadata_time_secs_since_last_access_secs = 0;
205+
206+
try {
207+
cachingHiveMetastore.refreshTableBackground("db1", "tbl1", true);
208+
} catch (Exception e) {
209+
Assert.fail();
210+
} finally {
211+
Config.background_refresh_metadata_time_secs_since_last_access_secs = oldValue;
212+
}
213+
// table cache will be removed because of skip refresh table
214+
Assert.assertFalse(cachingHiveMetastore.isTablePresent(HiveTableName.of("db1", "tbl1")));
215+
}
216+
169217
@Test
170218
public void testRefreshHiveView() {
171219
CachingHiveMetastore cachingHiveMetastore = new CachingHiveMetastore(

0 commit comments

Comments
 (0)