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();