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

jiangtian pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 7bc541d296e Add avg file size in DefaultCompactionTaskComparatorImpl 
(#14270) (#14295)
7bc541d296e is described below

commit 7bc541d296e740aae601807c599155202b31f803
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 4 09:40:21 2024 +0800

    Add avg file size in DefaultCompactionTaskComparatorImpl (#14270) (#14295)
    
    * add avg file size in DefaultCompactionTaskComparatorImpl
    
    * fix ut
---
 .../execute/task/InnerSpaceCompactionTask.java     |  4 ++++
 .../DefaultCompactionTaskComparatorImpl.java       | 12 +++++++++--
 .../compaction/CompactionTaskComparatorTest.java   | 25 ++++++++++++++++++++--
 3 files changed, 37 insertions(+), 4 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
index d10297e35c6..cb0e72c3220 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
@@ -603,6 +603,10 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
         / filesView.sourceFilesInCompactionPerformer.size();
   }
 
+  public double getAvgFileSize() {
+    return (double) filesView.selectedFileSize / 
filesView.sourceFilesInCompactionPerformer.size();
+  }
+
   @TestOnly
   public void setTargetTsFileResource(TsFileResource targetTsFileResource) {
     this.filesView.setTargetFileForRecover(targetTsFileResource);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java
index f80b43528f2..724d2748bf0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java
@@ -88,8 +88,16 @@ public class DefaultCompactionTaskComparatorImpl implements 
ICompactionTaskCompa
       return o1.getCompactionTaskType() == CompactionTaskType.REPAIR ? -1 : 1;
     }
 
-    // if the sum of compaction count of the selected files are different
-    // we prefer to execute task with smaller compaction count
+    // If the average file size of the two compaction tasks differs by more 
than 10%,
+    // we prefer to execute task with smaller avg file size
+    double avgFileSize1 = o1.getAvgFileSize();
+    double avgFileSize2 = o2.getAvgFileSize();
+    if (10 * Math.abs(avgFileSize1 - avgFileSize2) > Math.min(avgFileSize1, 
avgFileSize2)) {
+      return Double.compare(avgFileSize1, avgFileSize2);
+    }
+
+    // if the avg of compaction count of the selected files are different
+    // we prefer to execute task with smaller avg compaction count
     // this can reduce write amplification
     double avgCompactionCount1 = o1.getAvgCompactionCount();
     double avgCompactionCount2 = o2.getAvgCompactionCount();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionTaskComparatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionTaskComparatorTest.java
index a59f0eb758f..dd868ed805b 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionTaskComparatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionTaskComparatorTest.java
@@ -74,6 +74,27 @@ public class CompactionTaskComparatorTest {
     new CompactionConfigRestorer().restoreCompactionConfig();
   }
 
+  /** Test comparation of tasks with different avg file size */
+  @Test
+  public void testAvgFileSizeCompare() throws InterruptedException {
+    AbstractCompactionTask[] compactionTasks = new AbstractCompactionTask[100];
+    for (int i = 0; i < 10; ++i) {
+      List<TsFileResource> resources = new ArrayList<>();
+      for (int j = i; j < 10; ++j) {
+        resources.add(
+            new FakedTsFileResource(new File(String.format("%d-%d-0-0.tsfile", 
i + j, i + j)), i));
+      }
+      compactionTasks[i] =
+          new FakedInnerSpaceCompactionTask("fakeSg", 0, tsFileManager, true, 
resources, 0);
+      compactionTaskQueue.put(compactionTasks[i]);
+    }
+
+    for (int i = 0; i < 10; ++i) {
+      AbstractCompactionTask currentTask = compactionTaskQueue.take();
+      assertTrue(currentTask == compactionTasks[i]);
+    }
+  }
+
   /** Test comparation of tasks with different file num */
   @Test
   public void testFileNumCompare() throws InterruptedException {
@@ -82,7 +103,7 @@ public class CompactionTaskComparatorTest {
       List<TsFileResource> resources = new ArrayList<>();
       for (int j = i; j < 100; ++j) {
         resources.add(
-            new FakedTsFileResource(new File(String.format("%d-%d-0-0.tsfile", 
i + j, i + j)), j));
+            new FakedTsFileResource(new File(String.format("%d-%d-0-0.tsfile", 
i + j, i + j)), 1));
       }
       compactionTasks[i] =
           new FakedInnerSpaceCompactionTask("fakeSg", 0, tsFileManager, true, 
resources, 0);
@@ -205,7 +226,7 @@ public class CompactionTaskComparatorTest {
       List<TsFileResource> resources = new ArrayList<>();
       for (int j = i; j < 100; ++j) {
         resources.add(
-            new FakedTsFileResource(new File(String.format("%d-%d-0-0.tsfile", 
i + j, i + j)), j));
+            new FakedTsFileResource(new File(String.format("%d-%d-0-0.tsfile", 
i + j, i + j)), 1));
       }
       innerCompactionTasks[i] =
           new FakedInnerSpaceCompactionTask("fakeSg", 0, tsFileManager, true, 
resources, 0);

Reply via email to