This is an automated email from the ASF dual-hosted git repository. ejttianyu pushed a commit to branch fix_merge_bug in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit 3f572ffdaf2f59aa7ed532b6d0a75f62c23b15cf Author: EJTTianyu <[email protected]> AuthorDate: Thu Apr 30 13:41:30 2020 +0800 fix merge stuck bug --- .../db/engine/storagegroup/StorageGroupProcessor.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java index f5b078f..d559482 100755 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java @@ -1433,7 +1433,6 @@ public class StorageGroupProcessor { @SuppressWarnings("squid:S1141") private void updateMergeModification(TsFileResource seqFile) { - seqFile.getWriteQueryLock().writeLock().lock(); try { // remove old modifications and write modifications generated during merge seqFile.removeModFile(); @@ -1451,8 +1450,6 @@ public class StorageGroupProcessor { } catch (IOException e) { logger.error("{} cannot clean the ModificationFile of {} after merge", storageGroupName, seqFile.getFile(), e); - } finally { - seqFile.getWriteQueryLock().writeLock().unlock(); } } @@ -1482,7 +1479,15 @@ public class StorageGroupProcessor { for (int i = 0; i < seqFiles.size(); i++) { TsFileResource seqFile = seqFiles.get(i); - mergeLock.writeLock().lock(); + while (!seqFile.getWriteQueryLock().writeLock().tryLock() || !mergeLock.writeLock() + .tryLock()) { + if (seqFile.getWriteQueryLock().writeLock().isHeldByCurrentThread()) { + seqFile.getWriteQueryLock().writeLock().unlock(); + } + if(mergeLock.writeLock().isHeldByCurrentThread()) { + mergeLock.writeLock().unlock(); + } + } try { updateMergeModification(seqFile); if (i == seqFiles.size() - 1) { @@ -1493,6 +1498,7 @@ public class StorageGroupProcessor { } } finally { mergeLock.writeLock().unlock(); + seqFile.getWriteQueryLock().writeLock().unlock(); } } logger.info("{} a merge task ends", storageGroupName);
