Skip to content

Commit 436524f

Browse files
authored
Fix the problem that writes duplicate TConsensusGroupId when repairing data partition table (#17416)
1 parent 68fc992 commit 436524f

2 files changed

Lines changed: 24 additions & 9 deletions

File tree

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/partition/DataPartitionTableIntegrityCheckProcedure.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ private Flow analyzeMissingPartitions(final ConfigNodeProcedureEnv env) {
332332

333333
Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, List<TConsensusGroupId>>>
334334
seriesPartitionMap = localDataPartitionTable.get(database);
335+
long localEarliestSlotStartTime = Long.MAX_VALUE;
335336
for (Map.Entry<TSeriesPartitionSlot, Map<TTimePartitionSlot, List<TConsensusGroupId>>>
336337
seriesPartitionEntry : seriesPartitionMap.entrySet()) {
337338
Map<TTimePartitionSlot, List<TConsensusGroupId>> tTimePartitionSlotListMap =
@@ -346,14 +347,17 @@ private Flow analyzeMissingPartitions(final ConfigNodeProcedureEnv env) {
346347
.min(Comparator.comparingLong(TTimePartitionSlot::getStartTime))
347348
.orElse(null);
348349

349-
if (localEarliestSlot.getStartTime()
350-
> TimePartitionUtils.getStartTimeByPartitionId(earliestTimeslot)) {
351-
databasesWithLostDataPartition.add(database);
352-
LOG.warn(
353-
"[DataPartitionIntegrity] Database {} has lost timeslot {} in its data table partition, and this issue needs to be repaired",
354-
database,
355-
earliestTimeslot);
356-
}
350+
localEarliestSlotStartTime =
351+
Math.min(localEarliestSlotStartTime, localEarliestSlot.getStartTime());
352+
}
353+
354+
if (localEarliestSlotStartTime
355+
> TimePartitionUtils.getStartTimeByPartitionId(earliestTimeslot)) {
356+
databasesWithLostDataPartition.add(database);
357+
LOG.warn(
358+
"[DataPartitionIntegrity] Database {} has lost timeslot {} in its data table partition, and this issue needs to be repaired",
359+
database,
360+
earliestTimeslot);
357361
}
358362
}
359363

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SeriesPartitionTable.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737
import java.io.OutputStream;
3838
import java.nio.ByteBuffer;
3939
import java.util.ArrayList;
40+
import java.util.HashSet;
4041
import java.util.Iterator;
4142
import java.util.List;
4243
import java.util.Map;
4344
import java.util.Objects;
45+
import java.util.Set;
4446
import java.util.Vector;
4547
import java.util.concurrent.ConcurrentHashMap;
4648
import java.util.concurrent.ConcurrentSkipListMap;
@@ -280,7 +282,16 @@ public void merge(SeriesPartitionTable sourceMap) {
280282
if (sourceMap == null) return;
281283
sourceMap.seriesPartitionMap.forEach(
282284
(timeSlot, groups) -> {
283-
this.seriesPartitionMap.computeIfAbsent(timeSlot, k -> new ArrayList<>()).addAll(groups);
285+
List<TConsensusGroupId> groupList =
286+
this.seriesPartitionMap.computeIfAbsent(timeSlot, k -> new ArrayList<>());
287+
synchronized (groupList) {
288+
Set<TConsensusGroupId> groupSet = new HashSet<>(groupList);
289+
for (TConsensusGroupId groupId : groups) {
290+
if (!groupSet.contains(groupId)) {
291+
groupList.add(groupId);
292+
}
293+
}
294+
}
284295
});
285296
}
286297

0 commit comments

Comments
 (0)