This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 9619aac1988 [IOTDB-6256] Fix FLUSH deadlock
9619aac1988 is described below
commit 9619aac1988ca426ae5a380f925b980477a40022
Author: Jiang Tian <[email protected]>
AuthorDate: Fri Nov 24 08:47:15 2023 +0800
[IOTDB-6256] Fix FLUSH deadlock
---
.../db/storageengine/dataregion/DataRegion.java | 60 ++++++++++++----------
1 file changed, 32 insertions(+), 28 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 0e825130f97..8121c5c8cde 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -1624,33 +1624,36 @@ public class DataRegion implements IDataRegionForQuery {
/** This method will be blocked until all tsfile processors are closed. */
public void syncCloseAllWorkingTsFileProcessors() {
- synchronized (closeStorageGroupCondition) {
- try {
- List<Future<?>> tsFileProcessorsClosingFutures =
asyncCloseAllWorkingTsFileProcessors();
- long startTime = System.currentTimeMillis();
- while (!closingSequenceTsFileProcessor.isEmpty()
- || !closingUnSequenceTsFileProcessor.isEmpty()) {
- closeStorageGroupCondition.wait(60_000);
- if (System.currentTimeMillis() - startTime > 60_000) {
- logger.warn(
- "{} has spent {}s to wait for closing all TsFiles.",
- databaseName + "-" + this.dataRegionId,
- (System.currentTimeMillis() - startTime) / 1000);
+ try {
+ List<Future<?>> tsFileProcessorsClosingFutures =
asyncCloseAllWorkingTsFileProcessors();
+ long startTime = System.currentTimeMillis();
+ while (!closingSequenceTsFileProcessor.isEmpty()
+ || !closingUnSequenceTsFileProcessor.isEmpty()) {
+ synchronized (closeStorageGroupCondition) {
+ // double check to avoid unnecessary waiting
+ if (!closingSequenceTsFileProcessor.isEmpty()
+ || !closingUnSequenceTsFileProcessor.isEmpty()) {
+ closeStorageGroupCondition.wait(60_000);
}
}
- for (Future<?> f : tsFileProcessorsClosingFutures) {
- if (f != null) {
- f.get();
- }
+ if (System.currentTimeMillis() - startTime > 60_000) {
+ logger.warn(
+ "{} has spent {}s to wait for closing all TsFiles.",
+ databaseName + "-" + this.dataRegionId,
+ (System.currentTimeMillis() - startTime) / 1000);
+ }
+ }
+ for (Future<?> f : tsFileProcessorsClosingFutures) {
+ if (f != null) {
+ f.get();
}
- } catch (InterruptedException | ExecutionException e) {
- logger.error(
- "CloseFileNodeCondition error occurs while waiting for closing the
storage "
- + "group {}",
- databaseName + "-" + dataRegionId,
- e);
- Thread.currentThread().interrupt();
}
+ } catch (InterruptedException | ExecutionException e) {
+ logger.error(
+ "CloseFileNodeCondition error occurs while waiting for closing the
storage " + "group {}",
+ databaseName + "-" + dataRegionId,
+ e);
+ Thread.currentThread().interrupt();
}
}
@@ -2117,12 +2120,13 @@ public class DataRegion implements IDataRegionForQuery {
closeQueryLock.writeLock().unlock();
}
// closingSequenceTsFileProcessor is a thread safety class.
- if (closingSequenceTsFileProcessor.contains(tsFileProcessor)) {
- closingSequenceTsFileProcessor.remove(tsFileProcessor);
- } else {
- closingUnSequenceTsFileProcessor.remove(tsFileProcessor);
- }
+
synchronized (closeStorageGroupCondition) {
+ if (closingSequenceTsFileProcessor.contains(tsFileProcessor)) {
+ closingSequenceTsFileProcessor.remove(tsFileProcessor);
+ } else {
+ closingUnSequenceTsFileProcessor.remove(tsFileProcessor);
+ }
closeStorageGroupCondition.notifyAll();
}
if (!isValidateTsFileFailed) {