You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/06/21 06:44:09 UTC

[doris] branch master updated: [bugfix](cooldown) Fix potential deadlock while calling handleCooldownConf (#20975)

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

kxiao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f20cac1da [bugfix](cooldown) Fix potential deadlock while calling handleCooldownConf (#20975)
6f20cac1da is described below

commit 6f20cac1da20561479c9353bc4f6dd69b16d2f9b
Author: plat1ko <pl...@gmail.com>
AuthorDate: Wed Jun 21 14:44:01 2023 +0800

    [bugfix](cooldown) Fix potential deadlock while calling handleCooldownConf (#20975)
---
 .../apache/doris/catalog/TabletInvertedIndex.java   | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java
index 4bf06c4e4d..ece6ebd8b5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java
@@ -129,6 +129,7 @@ public class TabletInvertedIndex {
                              List<TTabletMetaInfo> tabletToUpdate,
                              List<CooldownConf> cooldownConfToPush,
                              List<CooldownConf> cooldownConfToUpdate) {
+        List<Pair<TabletMeta, TTabletInfo>> cooldownTablets = new ArrayList<>();
         long stamp = readLock();
         long start = System.currentTimeMillis();
         try {
@@ -198,8 +199,11 @@ public class TabletInvertedIndex {
                             }
 
                             if (Config.enable_storage_policy && backendTabletInfo.isSetCooldownTerm()) {
-                                handleCooldownConf(tabletMeta, backendTabletInfo, cooldownConfToPush,
-                                        cooldownConfToUpdate);
+                                // Place tablet info in a container and process it outside of read lock to avoid
+                                // deadlock with OlapTable lock
+                                synchronized (cooldownTablets) {
+                                    cooldownTablets.add(Pair.of(tabletMeta, backendTabletInfo));
+                                }
                                 replica.setCooldownMetaId(backendTabletInfo.getCooldownMetaId());
                                 replica.setCooldownTerm(backendTabletInfo.getCooldownTerm());
                             }
@@ -326,6 +330,7 @@ public class TabletInvertedIndex {
         } finally {
             readUnlock(stamp);
         }
+        cooldownTablets.forEach(p -> handleCooldownConf(p.first, p.second, cooldownConfToPush, cooldownConfToUpdate));
 
         long end = System.currentTimeMillis();
         LOG.info("finished to do tablet diff with backend[{}]. sync: {}."
@@ -422,9 +427,7 @@ public class TabletInvertedIndex {
         if (cooldownConf.first <= 0) { // invalid cooldownReplicaId
             CooldownConf conf = new CooldownConf(tabletMeta.getDbId(), tabletMeta.getTableId(),
                     tabletMeta.getPartitionId(), tabletMeta.getIndexId(), beTabletInfo.tablet_id, cooldownConf.second);
-            synchronized (cooldownConfToUpdate) {
-                cooldownConfToUpdate.add(conf);
-            }
+            cooldownConfToUpdate.add(conf);
             return;
         }
 
@@ -445,17 +448,13 @@ public class TabletInvertedIndex {
         if (!replicaAlive) {
             CooldownConf conf = new CooldownConf(tabletMeta.getDbId(), tabletMeta.getTableId(),
                     tabletMeta.getPartitionId(), tabletMeta.getIndexId(), beTabletInfo.tablet_id, cooldownConf.second);
-            synchronized (cooldownConfToUpdate) {
-                cooldownConfToUpdate.add(conf);
-            }
+            cooldownConfToUpdate.add(conf);
             return;
         }
 
         if (beTabletInfo.getCooldownTerm() < cooldownConf.second) {
             CooldownConf conf = new CooldownConf(beTabletInfo.tablet_id, cooldownConf.first, cooldownConf.second);
-            synchronized (cooldownConfToPush) {
-                cooldownConfToPush.add(conf);
-            }
+            cooldownConfToPush.add(conf);
             return;
         }
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org