This is an automated email from the ASF dual-hosted git repository.

lide pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
     new 1deb9d13b63 [fix](sql cache) Fix enable sql cache lead to FE Full GC 
or OOM (#49424)
1deb9d13b63 is described below

commit 1deb9d13b63c6072d5fcefa6c4cdb6cc6d7fabb6
Author: camby <camby...@tencent.com>
AuthorDate: Tue Mar 25 21:39:34 2025 +0800

    [fix](sql cache) Fix enable sql cache lead to FE Full GC or OOM (#49424)
    
    pick https://github.com/apache/doris/pull/22645 and
    https://github.com/apache/doris/pull/22769 to branch-1.2
    Co-authored-by: Xinyi Zou <zouxiny...@gmail.com>
---
 .../src/main/java/org/apache/doris/common/Config.java       | 10 +++++++++-
 .../src/main/java/org/apache/doris/qe/cache/Cache.java      | 13 +++++++++++--
 .../main/java/org/apache/doris/qe/cache/PartitionCache.java |  3 +++
 .../java/org/apache/doris/qe/cache/RowBatchBuilder.java     | 12 ++++++++++++
 .../src/main/java/org/apache/doris/qe/cache/SqlCache.java   |  3 +++
 5 files changed, 38 insertions(+), 3 deletions(-)

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 a0eaf40f77c..edb01513626 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
@@ -1386,9 +1386,17 @@ public class Config extends ConfigBase {
     /**
      * Set the maximum number of rows that can be cached
      */
-    @ConfField(mutable = true, masterOnly = false)
+    @ConfField(mutable = true, masterOnly = false, description = 
{"SQL/Partition Cache可以缓存的最大行数。",
+        "Maximum number of rows that can be cached in SQL/Partition Cache, is 
3000 by default."})
     public static int cache_result_max_row_count = 3000;
 
+    /**
+     * Set the maximum data size that can be cached
+     */
+    @ConfField(mutable = true, masterOnly = false, description = 
{"SQL/Partition Cache可以缓存的最大数据大小。",
+        "Maximum data size of rows that can be cached in SQL/Partition Cache, 
is 3000 by default."})
+    public static int cache_result_max_data_size = 31457280; // 30M
+
     /**
      * Used to limit element num of InPredicate in delete statement.
      */
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/Cache.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/Cache.java
index 2efd805fa8a..e68597bec11 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/Cache.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/Cache.java
@@ -41,6 +41,7 @@ public abstract class Cache {
     protected TUniqueId queryId;
     protected SelectStmt selectStmt;
     protected RowBatchBuilder rowBatchBuilder;
+    protected boolean disableCache = false;
     protected CacheAnalyzer.CacheTable latestTable;
     protected CacheProxy proxy;
     protected HitRange hitRange;
@@ -75,12 +76,20 @@ public abstract class Cache {
     public abstract void updateCache();
 
     protected boolean checkRowLimit() {
-        if (rowBatchBuilder == null) {
+        if (disableCache || rowBatchBuilder == null) {
             return false;
         }
         if (rowBatchBuilder.getRowSize() > Config.cache_result_max_row_count) {
-            LOG.info("can not be cached. rowbatch size {} is more than {}", 
rowBatchBuilder.getRowSize(),
+            LOG.debug("can not be cached. rowbatch size {} is more than {}", 
rowBatchBuilder.getRowSize(),
                     Config.cache_result_max_row_count);
+            rowBatchBuilder.clear();
+            disableCache = true;
+            return false;
+        } else if (rowBatchBuilder.getDataSize() > 
Config.cache_result_max_data_size) {
+            LOG.debug("can not be cached. rowbatch data size {} is more than 
{}", rowBatchBuilder.getDataSize(),
+                    Config.cache_result_max_data_size);
+            rowBatchBuilder.clear();
+            disableCache = true;
             return false;
         } else {
             return true;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionCache.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionCache.java
index 9113bfec82d..d65d67fdbd2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionCache.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionCache.java
@@ -123,6 +123,9 @@ public class PartitionCache extends Cache {
             rowBatchBuilder.buildPartitionIndex(selectStmt.getResultExprs(), 
selectStmt.getColLabels(),
                     partColumn, range.buildUpdatePartitionRange());
         }
+        if (!super.checkRowLimit()) {
+            return;
+        }
         rowBatchBuilder.copyRowData(rowBatch);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/RowBatchBuilder.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/RowBatchBuilder.java
index 6d5a635a30b..2cae79597a3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/RowBatchBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/RowBatchBuilder.java
@@ -55,6 +55,10 @@ public class RowBatchBuilder {
         return rowSize;
     }
 
+    public int getDataSize() {
+        return dataSize;
+    }
+
     public RowBatchBuilder(CacheAnalyzer.CacheMode model) {
         cacheMode = model;
         keyIndex = 0;
@@ -99,6 +103,14 @@ public class RowBatchBuilder {
         }
     }
 
+    public void clear() {
+        rowList = Lists.newArrayList();
+        cachePartMap = new HashMap<>();
+        batchSize = 0;
+        rowSize = 0;
+        dataSize = 0;
+    }
+
     public InternalService.PUpdateCacheRequest buildSqlUpdateRequest(
             String sql, long partitionKey, long lastVersion, long lastestTime) 
{
         if (updateRequest == null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/SqlCache.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/SqlCache.java
index 9cd6c365dcd..9d53bb47c4d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/SqlCache.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/SqlCache.java
@@ -76,6 +76,9 @@ public class SqlCache extends Cache {
         if (rowBatchBuilder == null) {
             rowBatchBuilder = new RowBatchBuilder(CacheAnalyzer.CacheMode.Sql);
         }
+        if (!super.checkRowLimit()) {
+            return;
+        }
         rowBatchBuilder.copyRowData(rowBatch);
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to