nooneuse commented on code in PR #66307:
URL: https://github.com/apache/doris/pull/66307#discussion_r3775270189


##########
fe/fe-core/src/test/java/org/apache/doris/qe/SqlCacheTest.java:
##########
@@ -75,4 +94,183 @@ public void testSqlCache() throws Exception {
         executeNereidsSql("admin set frontend config 
('sql_cache_manage_num'='1')");
         Assertions.assertEquals(1, 
sqlCacheManager.getSqlCaches().asMap().size());
     }
+
+    @Test
+    public void testInvalidateSqlCacheByPersistedTableName() throws Exception {
+        TableIf table = Env.getCurrentInternalCatalog()
+                
.getDbOrDdlException("sql_cache_constraint_test").getTableOrDdlException("t");
+        SqlCacheContext cacheContext = new SqlCacheContext(new 
UserIdentity("admin", "127.0.0.1"));
+        cacheContext.addUsedTable(table);
+        NereidsSqlCacheManager sqlCacheManager = 
Env.getCurrentEnv().getSqlCacheManager();
+        sqlCacheManager.getSqlCaches().put("mapping_constraint_cache", 
cacheContext);
+        long initialSequence = sqlCacheManager.getTableInvalidationSequence(
+                TableNameInfoUtils.fromTableOrNull(table));
+
+        
sqlCacheManager.invalidateAboutTableAndFencePublication(TableNameInfoUtils.fromTableOrNull(table));
+
+        
Assertions.assertNull(sqlCacheManager.getSqlCaches().getIfPresent("mapping_constraint_cache"));
+        Assertions.assertTrue(sqlCacheManager.getTableInvalidationSequence(
+                TableNameInfoUtils.fromTableOrNull(table)) > initialSequence);
+    }
+
+    @Test
+    public void testReplayInvalidationRevokesLookupValue() throws Exception {
+        connectContext.getSessionVariable().setEnableSqlCache(true);
+        NereidsSqlCacheManager sqlCacheManager = 
Env.getCurrentEnv().getSqlCacheManager();
+        sqlCacheManager.invalidateAll();
+        String sql = "select 300";
+        prepareFeCacheContext(sql);
+        sqlCacheManager.tryAddFeSqlCache(connectContext, sql);
+        Assertions.assertEquals(1, 
sqlCacheManager.getSqlCaches().asMap().size());
+
+        try (MockedStatic<StmtExecutor> stmtExecutor = 
Mockito.mockStatic(StmtExecutor.class)) {
+            stmtExecutor.when(() -> 
StmtExecutor.syncJournalIfNeeded(connectContext))
+                    .thenAnswer(invocation -> {
+                        sqlCacheManager.invalidateAll();
+                        return null;
+                    });
+            Assertions.assertFalse(sqlCacheManager.tryParseSql(connectContext, 
sql).isPresent());
+        }
+    }
+
+    @Test
+    public void testTableInvalidationDoesNotRejectUnrelatedCachePublication() 
throws Exception {
+        connectContext.getSessionVariable().setEnableSqlCache(true);
+        NereidsSqlCacheManager sqlCacheManager = 
Env.getCurrentEnv().getSqlCacheManager();
+        sqlCacheManager.invalidateAll();
+        String sql = "select 350";
+        prepareFeCacheContext(sql);
+        long initialSequence = sqlCacheManager.getPublicationSequence();
+        TableIf table = Env.getCurrentInternalCatalog()
+                
.getDbOrDdlException("sql_cache_constraint_test").getTableOrDdlException("t");
+
+        sqlCacheManager.invalidateAboutTable(table);
+        sqlCacheManager.tryAddFeSqlCache(connectContext, sql);
+
+        Assertions.assertEquals(initialSequence, 
sqlCacheManager.getPublicationSequence());
+        Assertions.assertEquals(1, 
sqlCacheManager.getSqlCaches().asMap().size());
+    }
+
+    @Test
+    public void testTableInvalidationRejectsLatePublicationForUsedTable() 
throws Exception {
+        connectContext.getSessionVariable().setEnableSqlCache(true);
+        NereidsSqlCacheManager sqlCacheManager = 
Env.getCurrentEnv().getSqlCacheManager();
+        sqlCacheManager.invalidateAll();
+        String sql = "select 400";
+        TableIf table = Env.getCurrentInternalCatalog()
+                
.getDbOrDdlException("sql_cache_constraint_test").getTableOrDdlException("t");
+        prepareFeCacheContext(sql, table);
+
+        CountDownLatch publicationReady = new CountDownLatch(1);
+        CountDownLatch invalidationFinished = new CountDownLatch(1);
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        try {
+            Future<?> publication = executor.submit(() -> {
+                publicationReady.countDown();
+                Assertions.assertTrue(invalidationFinished.await(30, 
TimeUnit.SECONDS));
+                sqlCacheManager.tryAddFeSqlCache(connectContext, sql);
+                return null;
+            });
+            Future<?> invalidation = executor.submit(() -> {
+                Assertions.assertTrue(publicationReady.await(30, 
TimeUnit.SECONDS));
+                try {
+                    
sqlCacheManager.invalidateAboutTableAndFencePublication(table);
+                } finally {
+                    invalidationFinished.countDown();
+                }
+                return null;
+            });
+            publication.get(30, TimeUnit.SECONDS);
+            invalidation.get(30, TimeUnit.SECONDS);
+        } finally {
+            executor.shutdownNow();
+        }
+        
Assertions.assertTrue(sqlCacheManager.getSqlCaches().asMap().isEmpty());
+
+        prepareFeCacheContext(sql, table);
+        sqlCacheManager.tryAddFeSqlCache(connectContext, sql);
+        Assertions.assertEquals(1, 
sqlCacheManager.getSqlCaches().asMap().size());

Review Comment:
   okay.



-- 
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]

Reply via email to