From d6149e4777179bd2f97e75eac6ebe9028bec7bde Mon Sep 17 00:00:00 2001 From: caiconghui <55968745+caiconghui@users.noreply.github.com> Date: Tue, 2 Aug 2022 17:53:30 +0800 Subject: [PATCH] [Enhancement](TabletInvertIndex) use StampLock to instead of ReentranReadWriteLock to get better performance (#11422) Co-authored-by: caiconghui1 --- .../doris/catalog/TabletInvertedIndex.java | 86 +++++++++---------- .../doris/common/proc/StatisticProcNode.java | 2 +- 2 files changed, 44 insertions(+), 44 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 621e2a1627..73fff8fd70 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 @@ -50,7 +50,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.StampedLock; import java.util.stream.Collectors; /* @@ -67,7 +67,7 @@ public class TabletInvertedIndex { public static final TabletMeta NOT_EXIST_TABLET_META = new TabletMeta(NOT_EXIST_VALUE, NOT_EXIST_VALUE, NOT_EXIST_VALUE, NOT_EXIST_VALUE, NOT_EXIST_VALUE, TStorageMedium.HDD); - private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private StampedLock lock = new StampedLock(); // tablet id -> tablet meta private Map tabletMetaMap = Maps.newHashMap(); @@ -99,20 +99,20 @@ public class TabletInvertedIndex { public TabletInvertedIndex() { } - private void readLock() { - this.lock.readLock().lock(); + private long readLock() { + return this.lock.readLock(); } - private void readUnlock() { - this.lock.readLock().unlock(); + private void readUnlock(long stamp) { + this.lock.unlockRead(stamp); } - private void writeLock() { - this.lock.writeLock().lock(); + private long writeLock() { + return this.lock.writeLock(); } - private void writeUnlock() { - this.lock.writeLock().unlock(); + private void writeUnlock(long stamp) { + this.lock.unlockWrite(stamp); } public void tabletReport(long backendId, Map backendTablets, @@ -125,10 +125,10 @@ public class TabletInvertedIndex { ListMultimap transactionsToClear, ListMultimap tabletRecoveryMap, List> tabletToInMemory) { - readLock(); + long stamp = readLock(); long start = System.currentTimeMillis(); try { - LOG.info("begin to do tablet diff with backend[{}]. num: {}", backendId, backendTablets.size()); + LOG.debug("begin to do tablet diff with backend[{}]. num: {}", backendId, backendTablets.size()); Map replicaMetaWithBackend = backingReplicaMetaTable.row(backendId); if (replicaMetaWithBackend != null) { taskPool.submit(() -> { @@ -258,7 +258,7 @@ public class TabletInvertedIndex { }).join(); } } finally { - readUnlock(); + readUnlock(stamp); } long end = System.currentTimeMillis(); @@ -272,33 +272,33 @@ public class TabletInvertedIndex { } public Long getTabletIdByReplica(long replicaId) { - readLock(); + long stamp = readLock(); try { return replicaToTabletMap.get(replicaId); } finally { - readUnlock(); + readUnlock(stamp); } } public TabletMeta getTabletMeta(long tabletId) { - readLock(); + long stamp = readLock(); try { return tabletMetaMap.get(tabletId); } finally { - readUnlock(); + readUnlock(stamp); } } public List getTabletMetaList(List tabletIdList) { List tabletMetaList = new ArrayList<>(tabletIdList.size()); - readLock(); + long stamp = readLock(); try { for (Long tabletId : tabletIdList) { tabletMetaList.add(tabletMetaMap.getOrDefault(tabletId, NOT_EXIST_TABLET_META)); } return tabletMetaList; } finally { - readUnlock(); + readUnlock(stamp); } } @@ -368,7 +368,7 @@ public class TabletInvertedIndex { if (Env.isCheckpointThread()) { return; } - writeLock(); + long stamp = writeLock(); try { if (tabletMetaMap.containsKey(tabletId)) { return; @@ -381,7 +381,7 @@ public class TabletInvertedIndex { LOG.debug("add tablet: {}", tabletId); } finally { - writeUnlock(); + writeUnlock(stamp); } } @@ -389,7 +389,7 @@ public class TabletInvertedIndex { if (Env.isCheckpointThread()) { return; } - writeLock(); + long stamp = writeLock(); try { Map replicas = replicaMetaTable.rowMap().remove(tabletId); if (replicas != null) { @@ -409,7 +409,7 @@ public class TabletInvertedIndex { LOG.debug("delete tablet: {}", tabletId); } finally { - writeUnlock(); + writeUnlock(stamp); } } @@ -417,7 +417,7 @@ public class TabletInvertedIndex { if (Env.isCheckpointThread()) { return; } - writeLock(); + long stamp = writeLock(); try { Preconditions.checkState(tabletMetaMap.containsKey(tabletId)); replicaMetaTable.put(tabletId, replica.getBackendId(), replica); @@ -426,7 +426,7 @@ public class TabletInvertedIndex { LOG.debug("add replica {} of tablet {} in backend {}", replica.getId(), tabletId, replica.getBackendId()); } finally { - writeUnlock(); + writeUnlock(stamp); } } @@ -434,7 +434,7 @@ public class TabletInvertedIndex { if (Env.isCheckpointThread()) { return; } - writeLock(); + long stamp = writeLock(); try { Preconditions.checkState(tabletMetaMap.containsKey(tabletId)); if (replicaMetaTable.containsRow(tabletId)) { @@ -450,49 +450,49 @@ public class TabletInvertedIndex { LOG.error("tablet[{}] contains no replica in inverted index", tabletId); } } finally { - writeUnlock(); + writeUnlock(stamp); } } public Replica getReplica(long tabletId, long backendId) { - readLock(); + long stamp = readLock(); try { Preconditions.checkState(tabletMetaMap.containsKey(tabletId), tabletId); return replicaMetaTable.get(tabletId, backendId); } finally { - readUnlock(); + readUnlock(stamp); } } public List getReplicasByTabletId(long tabletId) { - readLock(); + long stamp = readLock(); try { if (replicaMetaTable.containsRow(tabletId)) { return Lists.newArrayList(replicaMetaTable.row(tabletId).values()); } return Lists.newArrayList(); } finally { - readUnlock(); + readUnlock(stamp); } } public List getTabletIdsByBackendId(long backendId) { List tabletIds = Lists.newArrayList(); - readLock(); + long stamp = readLock(); try { Map replicaMetaWithBackend = backingReplicaMetaTable.row(backendId); if (replicaMetaWithBackend != null) { tabletIds.addAll(replicaMetaWithBackend.keySet()); } } finally { - readUnlock(); + readUnlock(stamp); } return tabletIds; } public List getTabletIdsByBackendIdAndStorageMedium(long backendId, TStorageMedium storageMedium) { List tabletIds = Lists.newArrayList(); - readLock(); + long stamp = readLock(); try { Map replicaMetaWithBackend = backingReplicaMetaTable.row(backendId); if (replicaMetaWithBackend != null) { @@ -500,20 +500,20 @@ public class TabletInvertedIndex { id -> tabletMetaMap.get(id).getStorageMedium() == storageMedium).collect(Collectors.toList()); } } finally { - readUnlock(); + readUnlock(stamp); } return tabletIds; } public int getTabletNumByBackendId(long backendId) { - readLock(); + long stamp = readLock(); try { Map replicaMetaWithBackend = backingReplicaMetaTable.row(backendId); if (replicaMetaWithBackend != null) { return replicaMetaWithBackend.size(); } } finally { - readUnlock(); + readUnlock(stamp); } return 0; } @@ -522,7 +522,7 @@ public class TabletInvertedIndex { Map replicaNumMap = Maps.newHashMap(); long hddNum = 0; long ssdNum = 0; - readLock(); + long stamp = readLock(); try { Map replicaMetaWithBackend = backingReplicaMetaTable.row(backendId); if (replicaMetaWithBackend != null) { @@ -535,7 +535,7 @@ public class TabletInvertedIndex { } } } finally { - readUnlock(); + readUnlock(stamp); } replicaNumMap.put(TStorageMedium.HDD, hddNum); replicaNumMap.put(TStorageMedium.SSD, ssdNum); @@ -544,7 +544,7 @@ public class TabletInvertedIndex { // just for test public void clear() { - writeLock(); + long stamp = writeLock(); try { tabletMetaMap.clear(); replicaToTabletMap.clear(); @@ -552,7 +552,7 @@ public class TabletInvertedIndex { replicaMetaTable.clear(); backingReplicaMetaTable.clear(); } finally { - writeUnlock(); + writeUnlock(stamp); } } @@ -567,7 +567,7 @@ public class TabletInvertedIndex { // Only build from available bes, exclude colocate tables public Map> buildPartitionInfoBySkew( List availableBeIds) { - readLock(); + long stamp = readLock(); // 1. gen > // for each replica(all tablets): @@ -610,7 +610,7 @@ public class TabletInvertedIndex { } } } finally { - readUnlock(); + readUnlock(stamp); } // 2. Populate ClusterBalanceInfo::table_info_by_skew diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java index 662c1715de..618b933ff1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java @@ -89,7 +89,7 @@ public class StatisticProcNode implements ProcNodeInterface { this.db = db; this.dbNum = 1; - this.db.getTables().stream().filter(t -> t != null).forEach(t -> { + this.db.getTables().stream().filter(Objects::nonNull).forEach(t -> { ++tableNum; if (t.getType() == TableType.OLAP) { OlapTable olapTable = (OlapTable) t;