You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2023/07/21 06:02:42 UTC

[iotdb] branch rel/1.1 updated: [IOTDB-6072] Load: workaround to CPU 100% after loading tsfile when using JDK8 runtime (#10636)

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

rong pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 21b1ecc9223 [IOTDB-6072] Load: workaround to CPU 100% after loading tsfile when using JDK8 runtime (#10636)
21b1ecc9223 is described below

commit 21b1ecc92232ab9b643ee5d2d221c621f0de41db
Author: Itami Sho <42...@users.noreply.github.com>
AuthorDate: Fri Jul 21 14:02:37 2023 +0800

    [IOTDB-6072] Load: workaround to CPU 100% after loading tsfile when using JDK8 runtime (#10636)
    
    ## Description
    After loading tsfile, it causes 100% load on one CPU core.
    
    ## Reason
    Root cause: high processor load for ScheduledThreadPoolExecutor with 0 core threads. It was a bug in JDK1.8.
    
    See the following issues for more details:
    [JDK-8129861](https://bugs.openjdk.java.net/browse/JDK-8129861)
    [JDK-8022642](https://bugs.openjdk.java.net/browse/JDK-8022642)
    
    ## Solution
    1. Set corePoolSize to 1 to avoid high processor load (a workaround)
    2. Lazy initialization: init loadTsFileManager on first call (to avoid unnecessary threads' creation)
---
 .../org/apache/iotdb/db/engine/StorageEngine.java     | 19 +++++++++++++++----
 .../iotdb/db/engine/load/LoadTsFileManager.java       |  2 +-
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index f32ee20df87..a687559a9c6 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -140,7 +140,7 @@ public class StorageEngine implements IService {
   private List<FlushListener> customFlushListeners = new ArrayList<>();
   private int recoverDataRegionNum = 0;
 
-  private LoadTsFileManager loadTsFileManager = new LoadTsFileManager();
+  private LoadTsFileManager loadTsFileManager;
 
   private StorageEngine() {}
 
@@ -740,7 +740,7 @@ public class StorageEngine implements IService {
     TSStatus status = new TSStatus();
 
     try {
-      loadTsFileManager.writeToDataRegion(getDataRegion(dataRegionId), pieceNode, uuid);
+      getLoadTsFileManager().writeToDataRegion(getDataRegion(dataRegionId), pieceNode, uuid);
     } catch (PageException e) {
       logger.error(
           String.format(
@@ -770,7 +770,7 @@ public class StorageEngine implements IService {
     try {
       switch (loadCommand) {
         case EXECUTE:
-          if (loadTsFileManager.loadAll(uuid)) {
+          if (getLoadTsFileManager().loadAll(uuid)) {
             status = RpcUtils.SUCCESS_STATUS;
           } else {
             status.setCode(TSStatusCode.LOAD_FILE_ERROR.getStatusCode());
@@ -781,7 +781,7 @@ public class StorageEngine implements IService {
           }
           break;
         case ROLLBACK:
-          if (loadTsFileManager.deleteAll(uuid)) {
+          if (getLoadTsFileManager().deleteAll(uuid)) {
             status = RpcUtils.SUCCESS_STATUS;
           } else {
             status.setCode(TSStatusCode.LOAD_FILE_ERROR.getStatusCode());
@@ -833,6 +833,17 @@ public class StorageEngine implements IService {
     }
   }
 
+  private LoadTsFileManager getLoadTsFileManager() {
+    if (loadTsFileManager == null) {
+      synchronized (LoadTsFileManager.class) {
+        if (loadTsFileManager == null) {
+          loadTsFileManager = new LoadTsFileManager();
+        }
+      }
+    }
+    return loadTsFileManager;
+  }
+
   static class InstanceHolder {
 
     private static final StorageEngine INSTANCE = new StorageEngine();
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/load/LoadTsFileManager.java b/server/src/main/java/org/apache/iotdb/db/engine/load/LoadTsFileManager.java
index 20b9cd75220..f9292471ce4 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/load/LoadTsFileManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/load/LoadTsFileManager.java
@@ -71,7 +71,7 @@ public class LoadTsFileManager {
     this.loadDir = SystemFileFactory.INSTANCE.getFile(config.getLoadTsFileDir());
     this.uuid2WriterManager = new ConcurrentHashMap<>();
     this.cleanupExecutors =
-        IoTDBThreadPoolFactory.newScheduledThreadPool(0, LoadTsFileManager.class.getName());
+        IoTDBThreadPoolFactory.newScheduledThreadPool(1, LoadTsFileManager.class.getName());
     this.uuid2Future = new ConcurrentHashMap<>();
 
     recover();