This is an automated email from the ASF dual-hosted git repository.
tanxinyu 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 fa9711e1146 IoTConsensusV2: Use custom commitIndex to indicate
synchronization progress instead of pipe's commitIndex (#14624)
fa9711e1146 is described below
commit fa9711e1146ad53a435fa6cf89bdf7aab2648ba7
Author: Peng Junzhi <[email protected]>
AuthorDate: Wed Feb 26 17:06:30 2025 +0800
IoTConsensusV2: Use custom commitIndex to indicate synchronization progress
instead of pipe's commitIndex (#14624)
* wip: use syncLag for region migration progress management
* wip: complete syncLag framwork. TODO: maintain progressIndex locally as
syncLag calculator
* spotless
* complete replicateIndex
* fix
* fix for region migration
* spotless
* test conf
* fix replicate failed
* Revert "test conf"
This reverts commit a7858f92707abe64d7c66a1220b966fe0c98c10b.
* remove duplicate & run ci
* test conf
* fix the order of tsfile
* Revert "test conf"
This reverts commit d128b84ed786385688f71867e2e369c46b24dd21.
* retrigger ci
* fix ci
* assign replicate id when flush
* fix
* test conf
* fix historical
* close log
* Revert "test conf"
This reverts commit 34158b0b9f92e15b2bdc42a3e3c565ac1dbf4e0e.
---
.../consensus/config/PipeConsensusConfig.java | 21 ++++---
.../consensus/pipe/PipeConsensusServerImpl.java | 21 +++++--
...xManager.java => ReplicateProgressManager.java} | 8 ++-
.../pipe/metric/PipeConsensusSyncLagManager.java | 71 +++++++++++++++++-----
.../db/consensus/DataRegionConsensusImpl.java | 4 +-
.../pipeconsensus/PipeConsensusAsyncConnector.java | 16 ++---
.../pipeconsensus/PipeConsensusSyncConnector.java | 9 +--
.../PipeConsensusTabletInsertionEventHandler.java | 8 +--
.../PipeConsensusTsFileInsertionEventHandler.java | 8 +--
.../PipeConsensusTransferBatchReqBuilder.java | 5 +-
....java => ReplicateProgressDataNodeManager.java} | 36 ++++++++++-
.../deletion/DeletionResourceManager.java | 4 +-
.../deletion/persist/PageCacheDeletionBuffer.java | 5 +-
.../common/tsfile/PipeTsFileInsertionEvent.java | 17 +++++-
.../event/realtime/PipeRealtimeEventFactory.java | 71 +++++++++++++++++++---
...oricalDataRegionTsFileAndDeletionExtractor.java | 17 ++++++
.../realtime/assigner/PipeDataRegionAssigner.java | 2 +
.../listener/PipeInsertionDataNodeListener.java | 16 ++++-
.../pipeconsensus/PipeConsensusProcessor.java | 43 +++++++++----
.../pipeconsensus/PipeConsensusReceiver.java | 55 +++--------------
.../iotdb/commons/pipe/event/EnrichedEvent.java | 17 +++++-
.../src/main/thrift/pipeconsensus.thrift | 5 +-
22 files changed, 316 insertions(+), 143 deletions(-)
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/config/PipeConsensusConfig.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/config/PipeConsensusConfig.java
index 349a5cd7e1d..eb6ea361d24 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/config/PipeConsensusConfig.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/config/PipeConsensusConfig.java
@@ -24,7 +24,7 @@ import
org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeDispatcher;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeGuardian;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeReceiver;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeSelector;
-import org.apache.iotdb.consensus.pipe.consensuspipe.ProgressIndexManager;
+import org.apache.iotdb.consensus.pipe.consensuspipe.ReplicateProgressManager;
import java.util.concurrent.TimeUnit;
@@ -203,7 +203,7 @@ public class PipeConsensusConfig {
private final ConsensusPipeDispatcher consensusPipeDispatcher;
private final ConsensusPipeGuardian consensusPipeGuardian;
private final ConsensusPipeSelector consensusPipeSelector;
- private final ProgressIndexManager progressIndexManager;
+ private final ReplicateProgressManager replicateProgressManager;
private final ConsensusPipeReceiver consensusPipeReceiver;
private final long consensusPipeGuardJobIntervalInSeconds;
@@ -214,7 +214,7 @@ public class PipeConsensusConfig {
ConsensusPipeDispatcher consensusPipeDispatcher,
ConsensusPipeGuardian consensusPipeGuardian,
ConsensusPipeSelector consensusPipeSelector,
- ProgressIndexManager progressIndexManager,
+ ReplicateProgressManager replicateProgressManager,
ConsensusPipeReceiver consensusPipeReceiver,
long consensusPipeGuardJobIntervalInSeconds) {
this.extractorPluginName = extractorPluginName;
@@ -223,7 +223,7 @@ public class PipeConsensusConfig {
this.consensusPipeDispatcher = consensusPipeDispatcher;
this.consensusPipeGuardian = consensusPipeGuardian;
this.consensusPipeSelector = consensusPipeSelector;
- this.progressIndexManager = progressIndexManager;
+ this.replicateProgressManager = replicateProgressManager;
this.consensusPipeReceiver = consensusPipeReceiver;
this.consensusPipeGuardJobIntervalInSeconds =
consensusPipeGuardJobIntervalInSeconds;
}
@@ -256,8 +256,8 @@ public class PipeConsensusConfig {
return consensusPipeReceiver;
}
- public ProgressIndexManager getProgressIndexManager() {
- return progressIndexManager;
+ public ReplicateProgressManager getProgressIndexManager() {
+ return replicateProgressManager;
}
public long getConsensusPipeGuardJobIntervalInSeconds() {
@@ -277,7 +277,7 @@ public class PipeConsensusConfig {
private ConsensusPipeDispatcher consensusPipeDispatcher = null;
private ConsensusPipeGuardian consensusPipeGuardian = null;
private ConsensusPipeSelector consensusPipeSelector = null;
- private ProgressIndexManager progressIndexManager = null;
+ private ReplicateProgressManager replicateProgressManager = null;
private ConsensusPipeReceiver consensusPipeReceiver = null;
private long consensusPipeGuardJobIntervalInSeconds = 180L;
@@ -317,8 +317,9 @@ public class PipeConsensusConfig {
return this;
}
- public Pipe.Builder setProgressIndexManager(ProgressIndexManager
progressIndexManager) {
- this.progressIndexManager = progressIndexManager;
+ public Pipe.Builder setProgressIndexManager(
+ ReplicateProgressManager replicateProgressManager) {
+ this.replicateProgressManager = replicateProgressManager;
return this;
}
@@ -336,7 +337,7 @@ public class PipeConsensusConfig {
consensusPipeDispatcher,
consensusPipeGuardian,
consensusPipeSelector,
- progressIndexManager,
+ replicateProgressManager,
consensusPipeReceiver,
consensusPipeGuardJobIntervalInSeconds);
}
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/PipeConsensusServerImpl.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/PipeConsensusServerImpl.java
index 25a86ca5178..df1d6ff1f51 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/PipeConsensusServerImpl.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/PipeConsensusServerImpl.java
@@ -42,7 +42,7 @@ import
org.apache.iotdb.consensus.config.PipeConsensusConfig.ReplicateMode;
import org.apache.iotdb.consensus.exception.ConsensusGroupModifyPeerException;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeManager;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeName;
-import org.apache.iotdb.consensus.pipe.consensuspipe.ProgressIndexManager;
+import org.apache.iotdb.consensus.pipe.consensuspipe.ReplicateProgressManager;
import org.apache.iotdb.consensus.pipe.metric.PipeConsensusServerMetrics;
import org.apache.iotdb.consensus.pipe.thrift.TCheckConsensusPipeCompletedReq;
import org.apache.iotdb.consensus.pipe.thrift.TCheckConsensusPipeCompletedResp;
@@ -89,7 +89,7 @@ public class PipeConsensusServerImpl {
private final AtomicBoolean isStarted;
private final String consensusGroupId;
private final ConsensusPipeManager consensusPipeManager;
- private final ProgressIndexManager progressIndexManager;
+ private final ReplicateProgressManager replicateProgressManager;
private final IClientManager<TEndPoint, SyncPipeConsensusServiceClient>
syncClientManager;
private final PipeConsensusServerMetrics pipeConsensusServerMetrics;
private final ReplicateMode replicateMode;
@@ -111,7 +111,7 @@ public class PipeConsensusServerImpl {
this.isStarted = new AtomicBoolean(false);
this.consensusGroupId = thisNode.getGroupId().toString();
this.consensusPipeManager = consensusPipeManager;
- this.progressIndexManager = config.getPipe().getProgressIndexManager();
+ this.replicateProgressManager = config.getPipe().getProgressIndexManager();
this.syncClientManager = syncClientManager;
this.pipeConsensusServerMetrics = new PipeConsensusServerMetrics(this);
this.replicateMode = config.getReplicateMode();
@@ -319,7 +319,7 @@ public class PipeConsensusServerImpl {
long writeToStateMachineStartTime = System.nanoTime();
if (request instanceof ComparableConsensusRequest) {
((ComparableConsensusRequest) request)
-
.setProgressIndex(progressIndexManager.assignProgressIndex(thisNode.getGroupId()));
+
.setProgressIndex(replicateProgressManager.assignProgressIndex(thisNode.getGroupId()));
}
TSStatus result = stateMachine.write(request);
long writeToStateMachineEndTime = System.nanoTime();
@@ -608,12 +608,21 @@ public class PipeConsensusServerImpl {
}
}
+ public boolean isConsensusPipesTransmissionCompleted(List<String>
consensusPipeNames) {
+ return consensusPipeNames.stream()
+ .noneMatch(
+ pipeName ->
+ replicateProgressManager.getSyncLagForSpecificConsensusPipe(
+ thisNode.getGroupId(), new ConsensusPipeName(pipeName))
+ > 0);
+ }
+
public synchronized boolean isConsensusPipesTransmissionCompleted(
List<String> consensusPipeNames, boolean refreshCachedProgressIndex) {
if (refreshCachedProgressIndex) {
cachedProgressIndex =
cachedProgressIndex.updateToMinimumEqualOrIsAfterProgressIndex(
-
progressIndexManager.getMaxAssignedProgressIndex(thisNode.getGroupId()));
+
replicateProgressManager.getMaxAssignedProgressIndex(thisNode.getGroupId()));
}
try {
@@ -621,7 +630,7 @@ public class PipeConsensusServerImpl {
.noneMatch(
name ->
cachedProgressIndex.isAfter(
- progressIndexManager.getProgressIndex(new
ConsensusPipeName(name))));
+ replicateProgressManager.getProgressIndex(new
ConsensusPipeName(name))));
} catch (PipeException e) {
LOGGER.info(e.getMessage());
return false;
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ProgressIndexManager.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ReplicateProgressManager.java
similarity index 81%
rename from
iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ProgressIndexManager.java
rename to
iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ReplicateProgressManager.java
index e5dc2e922ab..13a18132272 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ProgressIndexManager.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/consensuspipe/ReplicateProgressManager.java
@@ -22,10 +22,16 @@ package org.apache.iotdb.consensus.pipe.consensuspipe;
import org.apache.iotdb.commons.consensus.ConsensusGroupId;
import org.apache.iotdb.commons.consensus.index.ProgressIndex;
-public interface ProgressIndexManager {
+public interface ReplicateProgressManager {
ProgressIndex getProgressIndex(ConsensusPipeName consensusPipeName);
ProgressIndex assignProgressIndex(ConsensusGroupId consensusGroupId);
ProgressIndex getMaxAssignedProgressIndex(ConsensusGroupId consensusGroupId);
+
+ long getSyncLagForSpecificConsensusPipe(
+ ConsensusGroupId consensusGroupId, ConsensusPipeName consensusPipeName);
+
+ void pinCommitIndexForMigration(
+ ConsensusGroupId consensusGroupId, ConsensusPipeName consensusPipeName);
}
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/metric/PipeConsensusSyncLagManager.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/metric/PipeConsensusSyncLagManager.java
index a65662d5f5e..7b047726a58 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/metric/PipeConsensusSyncLagManager.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/pipe/metric/PipeConsensusSyncLagManager.java
@@ -20,10 +20,10 @@
package org.apache.iotdb.consensus.pipe.metric;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeConnector;
+import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeName;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@@ -36,27 +36,59 @@ import java.util.concurrent.locks.ReentrantLock;
public class PipeConsensusSyncLagManager {
long syncLag = Long.MIN_VALUE;
ReentrantLock lock = new ReentrantLock();
- List<ConsensusPipeConnector> consensusPipeConnectorList = new ArrayList<>();
+ Map<ConsensusPipeName, ConsensusPipeConnector> consensusPipe2ConnectorMap =
+ new ConcurrentHashMap<>();
- private long getSyncLagForSpecificConsensusPipe(ConsensusPipeConnector
consensusPipeConnector) {
- long userWriteProgress =
consensusPipeConnector.getConsensusPipeCommitProgress();
- long replicateProgress =
consensusPipeConnector.getConsensusPipeReplicateProgress();
- return Math.max(userWriteProgress - replicateProgress, 0);
+ /**
+ * pinnedCommitIndex - currentReplicateProgress. If res <= 0, indicating
that replication is
+ * finished.
+ */
+ public long getSyncLagForRegionMigration(
+ ConsensusPipeName consensusPipeName, long pinnedCommitIndex) {
+ return
Optional.ofNullable(consensusPipe2ConnectorMap.get(consensusPipeName))
+ .map(
+ consensusPipeConnector ->
+ Math.max(
+ pinnedCommitIndex -
consensusPipeConnector.getConsensusPipeReplicateProgress(),
+ 0L))
+ .orElse(0L);
+ }
+
+ /**
+ * userWriteProgress - currentReplicateProgress. If res <= 0, indicating
that replication is
+ * finished.
+ */
+ public long getSyncLagForSpecificConsensusPipe(ConsensusPipeName
consensusPipeName) {
+ return
Optional.ofNullable(consensusPipe2ConnectorMap.get(consensusPipeName))
+ .map(
+ consensusPipeConnector -> {
+ long userWriteProgress =
consensusPipeConnector.getConsensusPipeCommitProgress();
+ long replicateProgress =
consensusPipeConnector.getConsensusPipeReplicateProgress();
+ return Math.max(userWriteProgress - replicateProgress, 0L);
+ })
+ .orElse(0L);
+ }
+
+ public long getCurrentCommitIndex(ConsensusPipeName consensusPipeName) {
+ return
Optional.ofNullable(consensusPipe2ConnectorMap.get(consensusPipeName))
+ .map(ConsensusPipeConnector::getConsensusPipeCommitProgress)
+ .orElse(0L);
}
- public void addConsensusPipeConnector(ConsensusPipeConnector
consensusPipeConnector) {
+ public void addConsensusPipeConnector(
+ ConsensusPipeName consensusPipeName, ConsensusPipeConnector
consensusPipeConnector) {
try {
lock.lock();
- consensusPipeConnectorList.add(consensusPipeConnector);
+ consensusPipe2ConnectorMap.put(consensusPipeName,
consensusPipeConnector);
} finally {
lock.unlock();
}
}
- public void removeConsensusPipeConnector(ConsensusPipeConnector connector) {
+ public void removeConsensusPipeConnector(ConsensusPipeName
consensusPipeName) {
try {
lock.lock();
- consensusPipeConnectorList.remove(connector);
+ consensusPipe2ConnectorMap.remove(consensusPipeName);
} finally {
lock.unlock();
}
@@ -71,21 +103,27 @@ public class PipeConsensusSyncLagManager {
try {
lock.lock();
// if there isn't a consensus pipe task, the syncLag is 0
- if (consensusPipeConnectorList.isEmpty()) {
+ if (consensusPipe2ConnectorMap.isEmpty()) {
return 0;
}
// else we find the biggest gap between leader and replicas in all
consensus pipe task.
syncLag = Long.MIN_VALUE;
- consensusPipeConnectorList.forEach(
- consensusPipeConnector ->
- syncLag =
- Math.max(syncLag,
getSyncLagForSpecificConsensusPipe(consensusPipeConnector)));
+ consensusPipe2ConnectorMap
+ .keySet()
+ .forEach(
+ consensusPipeName ->
+ syncLag =
+ Math.max(syncLag,
getSyncLagForSpecificConsensusPipe(consensusPipeName)));
return syncLag;
} finally {
lock.unlock();
}
}
+ public void clear() {
+ this.consensusPipe2ConnectorMap.clear();
+ }
+
private PipeConsensusSyncLagManager() {
// do nothing
}
@@ -110,6 +148,7 @@ public class PipeConsensusSyncLagManager {
}
public static void release(String groupId) {
+ PipeConsensusSyncLagManager.getInstance(groupId).clear();
PipeConsensusSyncLagManagerHolder.CONSENSU_GROUP_ID_2_INSTANCE_MAP.remove(groupId);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
index 0994935a6d7..42d0830e711 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
@@ -40,7 +40,7 @@ import
org.apache.iotdb.db.consensus.statemachine.dataregion.IoTConsensusDataReg
import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
import org.apache.iotdb.db.pipe.consensus.ConsensusPipeDataNodeDispatcher;
import
org.apache.iotdb.db.pipe.consensus.ConsensusPipeDataNodeRuntimeAgentGuardian;
-import org.apache.iotdb.db.pipe.consensus.ProgressIndexDataNodeManager;
+import org.apache.iotdb.db.pipe.consensus.ReplicateProgressDataNodeManager;
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResourceManager;
import org.apache.iotdb.db.storageengine.StorageEngine;
import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
@@ -170,7 +170,7 @@ public class DataRegionConsensusImpl {
.setConsensusPipeSelector(
() ->
PipeDataNodeAgent.task().getAllConsensusPipe())
.setConsensusPipeReceiver(PipeDataNodeAgent.receiver().pipeConsensus())
- .setProgressIndexManager(new
ProgressIndexDataNodeManager())
+ .setProgressIndexManager(new
ReplicateProgressDataNodeManager())
.setConsensusPipeGuardJobIntervalInSeconds(300)
.build())
.setReplicateMode(ReplicateMode.fromValue(CONF.getIotConsensusV2Mode()))
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusAsyncConnector.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusAsyncConnector.java
index 3573440472a..a44c30fca63 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusAsyncConnector.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusAsyncConnector.java
@@ -33,6 +33,7 @@ import
org.apache.iotdb.commons.pipe.connector.protocol.IoTDBConnector;
import org.apache.iotdb.commons.pipe.event.EnrichedEvent;
import org.apache.iotdb.commons.service.metric.MetricService;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeConnector;
+import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeName;
import org.apache.iotdb.consensus.pipe.metric.PipeConsensusSyncLagManager;
import org.apache.iotdb.consensus.pipe.thrift.TCommitId;
import org.apache.iotdb.consensus.pipe.thrift.TPipeConsensusTransferReq;
@@ -135,7 +136,7 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
// initialize metric components
pipeConsensusConnectorMetrics = new PipeConsensusConnectorMetrics(this);
PipeConsensusSyncLagManager.getInstance(getConsensusGroupIdStr())
- .addConsensusPipeConnector(this);
+ .addConsensusPipeConnector(new ConsensusPipeName(consensusPipeName),
this);
MetricService.getInstance().addMetricSet(this.pipeConsensusConnectorMetrics);
// In PipeConsensus, one pipeConsensusTask corresponds to a
pipeConsensusConnector. Thus,
@@ -169,7 +170,7 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
LOGGER.debug(
"PipeConsensus-ConsensusGroup-{}: no.{} event-{} added to
connector buffer",
consensusGroupId,
- event.getCommitId(),
+ event.getReplicateIndexForIoTV2(),
event);
}
// Special judge to avoid transfer stuck when re-transfer events that
will not be put in
@@ -227,7 +228,8 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
}
iterator.remove();
// update replicate progress
- currentReplicateProgress = Math.max(currentReplicateProgress,
event.getCommitId());
+ currentReplicateProgress =
+ Math.max(currentReplicateProgress, event.getReplicateIndexForIoTV2());
// decrease reference count
event.decreaseReferenceCount(PipeConsensusAsyncConnector.class.getName(),
true);
}
@@ -273,8 +275,7 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
(PipeInsertNodeTabletInsertionEvent) tabletInsertionEvent;
tCommitId =
new TCommitId(
- pipeInsertNodeTabletInsertionEvent.getCommitId(),
-
pipeInsertNodeTabletInsertionEvent.getCommitterKey().getRestartTimes(),
+ pipeInsertNodeTabletInsertionEvent.getReplicateIndexForIoTV2(),
pipeInsertNodeTabletInsertionEvent.getRebootTimes());
// We increase the reference count for this event to determine if the
event may be released.
@@ -352,8 +353,7 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
(PipeTsFileInsertionEvent) tsFileInsertionEvent;
TCommitId tCommitId =
new TCommitId(
- pipeTsFileInsertionEvent.getCommitId(),
- pipeTsFileInsertionEvent.getCommitterKey().getRestartTimes(),
+ pipeTsFileInsertionEvent.getReplicateIndexForIoTV2(),
pipeTsFileInsertionEvent.getRebootTimes());
TConsensusGroupId tConsensusGroupId =
new TConsensusGroupId(TConsensusGroupType.DataRegion,
consensusGroupId);
@@ -588,7 +588,7 @@ public class PipeConsensusAsyncConnector extends
IoTDBConnector implements Conse
}
PipeConsensusSyncLagManager.getInstance(getConsensusGroupIdStr())
- .removeConsensusPipeConnector(this);
+ .removeConsensusPipeConnector(new
ConsensusPipeName(consensusPipeName));
MetricService.getInstance().removeMetricSet(this.pipeConsensusConnectorMetrics);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusSyncConnector.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusSyncConnector.java
index 01d3fbabcd1..c92f99fb3ac 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusSyncConnector.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/PipeConsensusSyncConnector.java
@@ -247,8 +247,7 @@ public class PipeConsensusSyncConnector extends
IoTDBConnector {
final TPipeConsensusTransferResp resp;
final TCommitId tCommitId =
new TCommitId(
- pipeDeleteDataNodeEvent.getCommitId(),
- pipeDeleteDataNodeEvent.getCommitterKey().getRestartTimes(),
+ pipeDeleteDataNodeEvent.getReplicateIndexForIoTV2(),
pipeDeleteDataNodeEvent.getRebootTimes());
final TConsensusGroupId tConsensusGroupId =
new TConsensusGroupId(TConsensusGroupType.DataRegion,
consensusGroupId);
@@ -317,8 +316,7 @@ public class PipeConsensusSyncConnector extends
IoTDBConnector {
final TPipeConsensusTransferResp resp;
final TCommitId tCommitId =
new TCommitId(
- pipeInsertNodeTabletInsertionEvent.getCommitId(),
-
pipeInsertNodeTabletInsertionEvent.getCommitterKey().getRestartTimes(),
+ pipeInsertNodeTabletInsertionEvent.getReplicateIndexForIoTV2(),
pipeInsertNodeTabletInsertionEvent.getRebootTimes());
final TConsensusGroupId tConsensusGroupId =
new TConsensusGroupId(TConsensusGroupType.DataRegion,
consensusGroupId);
@@ -377,8 +375,7 @@ public class PipeConsensusSyncConnector extends
IoTDBConnector {
syncRetryClientManager.borrowClient(getFollowerUrl())) {
final TCommitId tCommitId =
new TCommitId(
- pipeTsFileInsertionEvent.getCommitId(),
- pipeTsFileInsertionEvent.getCommitterKey().getRestartTimes(),
+ pipeTsFileInsertionEvent.getReplicateIndexForIoTV2(),
pipeTsFileInsertionEvent.getRebootTimes());
final TConsensusGroupId tConsensusGroupId =
new TConsensusGroupId(TConsensusGroupType.DataRegion,
consensusGroupId);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTabletInsertionEventHandler.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTabletInsertionEventHandler.java
index 347cd67d8c6..609e7e5e509 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTabletInsertionEventHandler.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTabletInsertionEventHandler.java
@@ -92,8 +92,8 @@ public abstract class
PipeConsensusTabletInsertionEventHandler<E extends TPipeCo
if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
LOGGER.info(
- "Debug only: no.{} event successfully processed!",
- ((EnrichedEvent) event).getCommitId());
+ "InsertNodeTransfer: no.{} event successfully processed!",
+ ((EnrichedEvent) event).getReplicateIndexForIoTV2());
connector.removeEventFromBuffer((EnrichedEvent) event);
}
@@ -107,12 +107,12 @@ public abstract class
PipeConsensusTabletInsertionEventHandler<E extends TPipeCo
@Override
public void onError(Exception exception) {
LOGGER.warn(
- "Failed to transfer TabletInsertionEvent {} (committer key={}, commit
id={}).",
+ "Failed to transfer TabletInsertionEvent {} (committer key={},
replicate index={}).",
event instanceof EnrichedEvent
? ((EnrichedEvent) event).coreReportMessage()
: event.toString(),
event instanceof EnrichedEvent ? ((EnrichedEvent)
event).getCommitterKey() : null,
- event instanceof EnrichedEvent ? ((EnrichedEvent) event).getCommitId()
: null,
+ event instanceof EnrichedEvent ? ((EnrichedEvent)
event).getReplicateIndexForIoTV2() : null,
exception);
connector.addFailureEventToRetryQueue(event);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTsFileInsertionEventHandler.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTsFileInsertionEventHandler.java
index 95e48c6b74a..5839e00b7eb 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTsFileInsertionEventHandler.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/handler/PipeConsensusTsFileInsertionEventHandler.java
@@ -222,10 +222,10 @@ public class PipeConsensusTsFileInsertionEventHandler
PipeConsensusTsFileInsertionEventHandler.class.getName(), true);
LOGGER.info(
- "Successfully transferred file {} (committer key={}, commit
id={}).",
+ "Successfully transferred file {} (committer key={}, replicate
index={}).",
tsFile,
event.getCommitterKey(),
- event.getCommitId());
+ event.getReplicateIndexForIoTV2());
if (client != null) {
client.setShouldReturnSelf(true);
@@ -274,10 +274,10 @@ public class PipeConsensusTsFileInsertionEventHandler
@Override
public void onError(final Exception exception) {
LOGGER.warn(
- "Failed to transfer TsFileInsertionEvent {} (committer key {}, commit
id {}).",
+ "Failed to transfer TsFileInsertionEvent {} (committer key {},
replicate index {}).",
tsFile,
event.getCommitterKey(),
- event.getCommitId(),
+ event.getReplicateIndexForIoTV2(),
exception);
try {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/payload/builder/PipeConsensusTransferBatchReqBuilder.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/payload/builder/PipeConsensusTransferBatchReqBuilder.java
index 7cc3d22388b..e86193dad17 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/payload/builder/PipeConsensusTransferBatchReqBuilder.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/pipeconsensus/payload/builder/PipeConsensusTransferBatchReqBuilder.java
@@ -123,7 +123,7 @@ public abstract class PipeConsensusTransferBatchReqBuilder
implements AutoClosea
return false;
}
- final long requestCommitId = ((EnrichedEvent) event).getCommitId();
+ final long requestCommitId = ((EnrichedEvent)
event).getReplicateIndexForIoTV2();
// The deduplication logic here is to avoid the accumulation of the same
event in a batch when
// retrying.
@@ -182,8 +182,7 @@ public abstract class PipeConsensusTransferBatchReqBuilder
implements AutoClosea
(PipeInsertNodeTabletInsertionEvent) event;
commitId =
new TCommitId(
- pipeInsertNodeTabletInsertionEvent.getCommitId(),
-
pipeInsertNodeTabletInsertionEvent.getCommitterKey().getRestartTimes(),
+ pipeInsertNodeTabletInsertionEvent.getReplicateIndexForIoTV2(),
pipeInsertNodeTabletInsertionEvent.getRebootTimes());
// Read the bytebuffer from the wal file and transfer it directly without
serializing or
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ProgressIndexDataNodeManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ReplicateProgressDataNodeManager.java
similarity index 78%
rename from
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ProgressIndexDataNodeManager.java
rename to
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ReplicateProgressDataNodeManager.java
index e9ae4ff4454..ce12e841cd9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ProgressIndexDataNodeManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/ReplicateProgressDataNodeManager.java
@@ -27,7 +27,8 @@ import
org.apache.iotdb.commons.consensus.index.impl.MinimumProgressIndex;
import org.apache.iotdb.commons.consensus.index.impl.RecoverProgressIndex;
import org.apache.iotdb.commons.consensus.index.impl.SimpleProgressIndex;
import org.apache.iotdb.consensus.pipe.consensuspipe.ConsensusPipeName;
-import org.apache.iotdb.consensus.pipe.consensuspipe.ProgressIndexManager;
+import org.apache.iotdb.consensus.pipe.consensuspipe.ReplicateProgressManager;
+import org.apache.iotdb.consensus.pipe.metric.PipeConsensusSyncLagManager;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
import org.apache.iotdb.db.storageengine.StorageEngine;
@@ -35,21 +36,32 @@ import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
-public class ProgressIndexDataNodeManager implements ProgressIndexManager {
+public class ReplicateProgressDataNodeManager implements
ReplicateProgressManager {
private static final int DATA_NODE_ID =
IoTDBDescriptor.getInstance().getConfig().getDataNodeId();
+ private static final Map<String, AtomicLong> groupId2ReplicateIndex = new
HashMap<>();
private final Map<ConsensusGroupId, ProgressIndex> groupId2MaxProgressIndex;
+ private final Map<ConsensusPipeName, Long>
consensusPipe2pinnedCommitIndexForMigration;
- public ProgressIndexDataNodeManager() {
+ public ReplicateProgressDataNodeManager() {
this.groupId2MaxProgressIndex = new ConcurrentHashMap<>();
+ this.consensusPipe2pinnedCommitIndexForMigration = new
ConcurrentHashMap<>();
recoverMaxProgressIndexFromDataRegion();
}
+ public static long assignReplicateIndexForIoTV2(String groupId) {
+ return groupId2ReplicateIndex
+ .compute(groupId, (k, v) -> v == null ? new AtomicLong(0) : v)
+ .incrementAndGet();
+ }
+
public static ProgressIndex extractLocalSimpleProgressIndex(ProgressIndex
progressIndex) {
if (progressIndex instanceof RecoverProgressIndex) {
final Map<Integer, SimpleProgressIndex> dataNodeId2LocalIndex =
@@ -129,4 +141,22 @@ public class ProgressIndexDataNodeManager implements
ProgressIndexManager {
public ProgressIndex getMaxAssignedProgressIndex(ConsensusGroupId
consensusGroupId) {
return groupId2MaxProgressIndex.getOrDefault(consensusGroupId,
MinimumProgressIndex.INSTANCE);
}
+
+ @Override
+ public long getSyncLagForSpecificConsensusPipe(
+ ConsensusGroupId consensusGroupId, ConsensusPipeName consensusPipeName) {
+ return PipeConsensusSyncLagManager.getInstance(consensusGroupId.toString())
+ .getSyncLagForRegionMigration(
+ consensusPipeName,
+
this.consensusPipe2pinnedCommitIndexForMigration.getOrDefault(consensusPipeName,
0L));
+ }
+
+ @Override
+ public void pinCommitIndexForMigration(
+ ConsensusGroupId consensusGroupId, ConsensusPipeName consensusPipeName) {
+ this.consensusPipe2pinnedCommitIndexForMigration.put(
+ consensusPipeName,
+ PipeConsensusSyncLagManager.getInstance(consensusGroupId.toString())
+ .getCurrentCommitIndex(consensusPipeName));
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/DeletionResourceManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/DeletionResourceManager.java
index 0f6ff3c6315..7e7dec38c66 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/DeletionResourceManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/DeletionResourceManager.java
@@ -26,7 +26,7 @@ import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.consensus.pipe.PipeConsensus;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.consensus.DataRegionConsensusImpl;
-import org.apache.iotdb.db.pipe.consensus.ProgressIndexDataNodeManager;
+import org.apache.iotdb.db.pipe.consensus.ReplicateProgressDataNodeManager;
import org.apache.iotdb.db.pipe.consensus.deletion.persist.DeletionBuffer;
import
org.apache.iotdb.db.pipe.consensus.deletion.persist.PageCacheDeletionBuffer;
import org.apache.iotdb.db.pipe.consensus.deletion.recover.DeletionReader;
@@ -176,7 +176,7 @@ public class DeletionResourceManager implements
AutoCloseable {
deleteNode2ResourcesMap.remove(deletionResource.getDeleteDataNode());
// Clean disk
ProgressIndex currentProgressIndex =
- ProgressIndexDataNodeManager.extractLocalSimpleProgressIndex(
+ ReplicateProgressDataNodeManager.extractLocalSimpleProgressIndex(
deletionResource.getProgressIndex());
try (Stream<Path> pathStream = Files.walk(Paths.get(storageDir.getPath()),
1)) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
index 289bcfc53fa..f9f6965f40d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
@@ -25,7 +25,7 @@ import
org.apache.iotdb.commons.consensus.index.impl.MinimumProgressIndex;
import org.apache.iotdb.commons.consensus.index.impl.SimpleProgressIndex;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.pipe.consensus.ProgressIndexDataNodeManager;
+import org.apache.iotdb.db.pipe.consensus.ReplicateProgressDataNodeManager;
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResource;
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResourceManager;
import org.apache.iotdb.db.utils.MmapUtil;
@@ -222,7 +222,8 @@ public class PageCacheDeletionBuffer implements
DeletionBuffer {
try {
// PipeConsensus ensures that deleteDataNodes use recoverProgressIndex.
ProgressIndex curProgressIndex =
-
ProgressIndexDataNodeManager.extractLocalSimpleProgressIndex(maxProgressIndexInLastFile);
+ ReplicateProgressDataNodeManager.extractLocalSimpleProgressIndex(
+ maxProgressIndexInLastFile);
if (!(curProgressIndex instanceof SimpleProgressIndex)) {
throw new IOException("Invalid deletion progress index: " +
curProgressIndex);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java
index 70f66394dd5..6a94f81017f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java
@@ -165,7 +165,6 @@ public class PipeTsFileInsertionEvent extends
PipeInsertionEvent
synchronized (isClosed) {
isClosed.set(true);
isClosed.notifyAll();
-
// Update flushPointCount after TsFile is closed
flushPointCount = processor.getMemTableFlushPointCount();
}
@@ -351,6 +350,22 @@ public class PipeTsFileInsertionEvent extends
PipeInsertionEvent
}
}
+ /**
+ * Get ProgressIndex without waiting for tsfile close. Can be used in
getting progressIndex when
+ * memTable becomes immutable.
+ */
+ public ProgressIndex forceGetProgressIndex() {
+ if (resource.isEmpty()) {
+ LOGGER.warn(
+ "Skipping temporary TsFile {}'s progressIndex, will report
MinimumProgressIndex", tsFile);
+ return MinimumProgressIndex.INSTANCE;
+ }
+ if (Objects.nonNull(overridingProgressIndex)) {
+ return overridingProgressIndex;
+ }
+ return resource.getMaxProgressIndex();
+ }
+
@Override
protected void reportProgress() {
super.reportProgress();
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/realtime/PipeRealtimeEventFactory.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/realtime/PipeRealtimeEventFactory.java
index ab9c2a51036..200ed98f0ed 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/realtime/PipeRealtimeEventFactory.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/realtime/PipeRealtimeEventFactory.java
@@ -20,39 +20,62 @@
package org.apache.iotdb.db.pipe.event.realtime;
import org.apache.iotdb.commons.pipe.event.ProgressReportEvent;
+import org.apache.iotdb.consensus.pipe.PipeConsensus;
+import org.apache.iotdb.db.consensus.DataRegionConsensusImpl;
+import org.apache.iotdb.db.pipe.consensus.ReplicateProgressDataNodeManager;
import org.apache.iotdb.db.pipe.event.common.deletion.PipeDeleteDataNodeEvent;
import org.apache.iotdb.db.pipe.event.common.heartbeat.PipeHeartbeatEvent;
import
org.apache.iotdb.db.pipe.event.common.tablet.PipeInsertNodeTabletInsertionEvent;
import org.apache.iotdb.db.pipe.event.common.tsfile.PipeTsFileInsertionEvent;
import
org.apache.iotdb.db.pipe.extractor.dataregion.realtime.epoch.TsFileEpochManager;
+import org.apache.iotdb.db.pipe.processor.pipeconsensus.PipeConsensusProcessor;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.AbstractDeleteDataNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertNode;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALEntryHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class PipeRealtimeEventFactory {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(PipeRealtimeEventFactory.class);
private static final TsFileEpochManager TS_FILE_EPOCH_MANAGER = new
TsFileEpochManager();
public static PipeRealtimeEvent createRealtimeEvent(
+ final String dataRegionId,
final Boolean isTableModel,
final String databaseNameFromDataRegion,
final TsFileResource resource,
final boolean isLoaded,
final boolean isGeneratedByPipe) {
- return TS_FILE_EPOCH_MANAGER.bindPipeTsFileInsertionEvent(
+ PipeTsFileInsertionEvent tsFileInsertionEvent =
new PipeTsFileInsertionEvent(
- isTableModel, databaseNameFromDataRegion, resource, isLoaded,
isGeneratedByPipe, false),
- resource);
+ isTableModel, databaseNameFromDataRegion, resource, isLoaded,
isGeneratedByPipe, false);
+
+ // if using IoTV2, assign a replicateIndex for this event
+ if (DataRegionConsensusImpl.getInstance() instanceof PipeConsensus
+ && PipeConsensusProcessor.isShouldReplicate(tsFileInsertionEvent)) {
+ tsFileInsertionEvent.setReplicateIndexForIoTV2(
+
ReplicateProgressDataNodeManager.assignReplicateIndexForIoTV2(dataRegionId));
+ LOGGER.debug(
+ "[Region{}]Set {} for event {}",
+ dataRegionId,
+ tsFileInsertionEvent.getReplicateIndexForIoTV2(),
+ tsFileInsertionEvent);
+ }
+
+ return
TS_FILE_EPOCH_MANAGER.bindPipeTsFileInsertionEvent(tsFileInsertionEvent,
resource);
}
public static PipeRealtimeEvent createRealtimeEvent(
+ final String dataRegionId,
final Boolean isTableModel,
final String databaseNameFromDataRegion,
final WALEntryHandler walEntryHandler,
final InsertNode insertNode,
final TsFileResource resource) {
- return TS_FILE_EPOCH_MANAGER.bindPipeInsertNodeTabletInsertionEvent(
+ PipeInsertNodeTabletInsertionEvent insertionEvent =
new PipeInsertNodeTabletInsertionEvent(
isTableModel,
databaseNameFromDataRegion,
@@ -60,9 +83,22 @@ public class PipeRealtimeEventFactory {
insertNode.getTargetPath(),
insertNode.getProgressIndex(),
insertNode.isAligned(),
- insertNode.isGeneratedByPipe()),
- insertNode,
- resource);
+ insertNode.isGeneratedByPipe());
+
+ // if using IoTV2, assign a replicateIndex for this event
+ if (DataRegionConsensusImpl.getInstance() instanceof PipeConsensus
+ && PipeConsensusProcessor.isShouldReplicate(insertionEvent)) {
+ insertionEvent.setReplicateIndexForIoTV2(
+
ReplicateProgressDataNodeManager.assignReplicateIndexForIoTV2(dataRegionId));
+ LOGGER.debug(
+ "[Region{}]Set {} for event {}",
+ dataRegionId,
+ insertionEvent.getReplicateIndexForIoTV2(),
+ insertionEvent);
+ }
+
+ return TS_FILE_EPOCH_MANAGER.bindPipeInsertNodeTabletInsertionEvent(
+ insertionEvent, insertNode, resource);
}
public static PipeRealtimeEvent createRealtimeEvent(
@@ -71,9 +107,24 @@ public class PipeRealtimeEventFactory {
new PipeHeartbeatEvent(dataRegionId, shouldPrintMessage), null, null,
null, null);
}
- public static PipeRealtimeEvent createRealtimeEvent(final
AbstractDeleteDataNode node) {
- return new PipeRealtimeEvent(
- new PipeDeleteDataNodeEvent(node, node.isGeneratedByPipe()), null,
null, null, null);
+ public static PipeRealtimeEvent createRealtimeEvent(
+ final String dataRegionId, final AbstractDeleteDataNode node) {
+ PipeDeleteDataNodeEvent deleteDataNodeEvent =
+ new PipeDeleteDataNodeEvent(node, node.isGeneratedByPipe());
+
+ // if using IoTV2, assign a replicateIndex for this event
+ if (DataRegionConsensusImpl.getInstance() instanceof PipeConsensus
+ && PipeConsensusProcessor.isShouldReplicate(deleteDataNodeEvent)) {
+ deleteDataNodeEvent.setReplicateIndexForIoTV2(
+
ReplicateProgressDataNodeManager.assignReplicateIndexForIoTV2(dataRegionId));
+ LOGGER.debug(
+ "[Region{}]Set {} for event {}",
+ dataRegionId,
+ deleteDataNodeEvent.getReplicateIndexForIoTV2(),
+ deleteDataNodeEvent);
+ }
+
+ return new PipeRealtimeEvent(deleteDataNodeEvent, null, null, null, null);
}
public static PipeRealtimeEvent createRealtimeEvent(final
ProgressReportEvent event) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionExtractor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionExtractor.java
index 74c8aa0a1eb..d8eb3ac6b89 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionExtractor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionExtractor.java
@@ -32,12 +32,16 @@ import
org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
import org.apache.iotdb.commons.pipe.datastructure.resource.PersistentResource;
import org.apache.iotdb.commons.utils.PathUtils;
+import org.apache.iotdb.consensus.pipe.PipeConsensus;
+import org.apache.iotdb.db.consensus.DataRegionConsensusImpl;
+import org.apache.iotdb.db.pipe.consensus.ReplicateProgressDataNodeManager;
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResource;
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResourceManager;
import org.apache.iotdb.db.pipe.event.common.deletion.PipeDeleteDataNodeEvent;
import org.apache.iotdb.db.pipe.event.common.terminate.PipeTerminateEvent;
import org.apache.iotdb.db.pipe.event.common.tsfile.PipeTsFileInsertionEvent;
import org.apache.iotdb.db.pipe.extractor.dataregion.DataRegionListeningFilter;
+import org.apache.iotdb.db.pipe.processor.pipeconsensus.PipeConsensusProcessor;
import org.apache.iotdb.db.pipe.resource.PipeDataNodeResourceManager;
import org.apache.iotdb.db.pipe.resource.tsfile.PipeTsFileResourceManager;
import org.apache.iotdb.db.storageengine.StorageEngine;
@@ -795,6 +799,19 @@ public class
PipeHistoricalDataRegionTsFileAndDeletionExtractor
historicalDataExtractionStartTime,
historicalDataExtractionEndTime);
+ // if using IoTV2, assign a replicateIndex for this event
+ if (DataRegionConsensusImpl.getInstance() instanceof PipeConsensus
+ && PipeConsensusProcessor.isShouldReplicate(event)) {
+ event.setReplicateIndexForIoTV2(
+ ReplicateProgressDataNodeManager.assignReplicateIndexForIoTV2(
+ resource.getDataRegionId()));
+ LOGGER.debug(
+ "[Region{}]Set {} for event {}",
+ resource.getDataRegionId(),
+ event.getReplicateIndexForIoTV2(),
+ event);
+ }
+
if (sloppyPattern || isDbNameCoveredByPattern) {
event.skipParsingPattern();
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/assigner/PipeDataRegionAssigner.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/assigner/PipeDataRegionAssigner.java
index 7ef2b1c4841..0950718b097 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/assigner/PipeDataRegionAssigner.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/assigner/PipeDataRegionAssigner.java
@@ -187,6 +187,8 @@ public class PipeDataRegionAssigner implements Closeable {
extractor.getRealtimeDataExtractionStartTime(),
extractor.getRealtimeDataExtractionEndTime());
final EnrichedEvent innerEvent = copiedEvent.getEvent();
+ // Bind replicateIndex for IoTV2
+
innerEvent.setReplicateIndexForIoTV2(event.getEvent().getReplicateIndexForIoTV2());
if (innerEvent instanceof PipeTsFileInsertionEvent) {
final PipeTsFileInsertionEvent tsFileInsertionEvent =
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/listener/PipeInsertionDataNodeListener.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/listener/PipeInsertionDataNodeListener.java
index 138f7c8f0f6..13498d8ca5f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/listener/PipeInsertionDataNodeListener.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/extractor/dataregion/realtime/listener/PipeInsertionDataNodeListener.java
@@ -115,7 +115,12 @@ public class PipeInsertionDataNodeListener {
assigner.publishToAssign(
PipeRealtimeEventFactory.createRealtimeEvent(
- assigner.isTableModel(), databaseName, tsFileResource, isLoaded,
isGeneratedByPipe));
+ dataRegionId,
+ assigner.isTableModel(),
+ databaseName,
+ tsFileResource,
+ isLoaded,
+ isGeneratedByPipe));
}
public void listenToInsertNode(
@@ -137,7 +142,12 @@ public class PipeInsertionDataNodeListener {
assigner.publishToAssign(
PipeRealtimeEventFactory.createRealtimeEvent(
- assigner.isTableModel(), databaseName, walEntryHandler,
insertNode, tsFileResource));
+ dataRegionId,
+ assigner.isTableModel(),
+ databaseName,
+ walEntryHandler,
+ insertNode,
+ tsFileResource));
}
public DeletionResource listenToDeleteData(
@@ -163,7 +173,7 @@ public class PipeInsertionDataNodeListener {
deletionResource = null;
}
-
assigner.publishToAssign(PipeRealtimeEventFactory.createRealtimeEvent(node));
+
assigner.publishToAssign(PipeRealtimeEventFactory.createRealtimeEvent(regionId,
node));
return deletionResource;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/pipeconsensus/PipeConsensusProcessor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/pipeconsensus/PipeConsensusProcessor.java
index c34033aa03c..065b2924846 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/pipeconsensus/PipeConsensusProcessor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/pipeconsensus/PipeConsensusProcessor.java
@@ -51,8 +51,13 @@ public class PipeConsensusProcessor implements PipeProcessor
{
public void customize(PipeParameters parameters,
PipeProcessorRuntimeConfiguration configuration)
throws Exception {}
- private boolean isContainLocalData(EnrichedEvent enrichedEvent) {
- final ProgressIndex progressIndex = enrichedEvent.getProgressIndex();
+ private static boolean isContainLocalData(EnrichedEvent enrichedEvent) {
+ ProgressIndex progressIndex;
+ if (enrichedEvent instanceof PipeTsFileInsertionEvent) {
+ progressIndex = ((PipeTsFileInsertionEvent)
enrichedEvent).forceGetProgressIndex();
+ } else {
+ progressIndex = enrichedEvent.getProgressIndex();
+ }
if (progressIndex instanceof RecoverProgressIndex) {
return ((RecoverProgressIndex) progressIndex)
.getDataNodeId2LocalIndex()
@@ -71,27 +76,41 @@ public class PipeConsensusProcessor implements
PipeProcessor {
return false;
}
+ /**
+ * Judge whether a given event should be replicated or sent by consensus
pipe. Only events that
+ * pass this check can be assigned a specific value for
`EnrichedEvent.replicateIndexForIoTV2`
+ *
+ * @param enrichedEvent
+ * @return true if event is totally generated by client operation instead of
consensus
+ * replication.
+ */
+ public static boolean isShouldReplicate(EnrichedEvent enrichedEvent) {
+ if (enrichedEvent instanceof TsFileInsertionEvent
+ && ((PipeTsFileInsertionEvent)
enrichedEvent).isGeneratedByPipeConsensus()) {
+ // Only user-generated TsFileInsertionEvent can be replicated. Any
tsFile synchronized from a
+ // replica should not be replicated again
+ return false;
+ }
+ // Only user-generated TabletInsertionEvent can be replicated.
+ return isContainLocalData(enrichedEvent);
+ }
+
@Override
public void process(TsFileInsertionEvent tsFileInsertionEvent,
EventCollector eventCollector)
throws Exception {
- // Only user-generated TsFileInsertionEvent can be replicated. Any tsFile
synchronized from a
- // replica should not be replicated again
if (tsFileInsertionEvent instanceof EnrichedEvent
- && !((PipeTsFileInsertionEvent)
tsFileInsertionEvent).isGeneratedByPipeConsensus()) {
- final EnrichedEvent enrichedEvent = (EnrichedEvent) tsFileInsertionEvent;
- if (isContainLocalData(enrichedEvent)) {
- eventCollector.collect(tsFileInsertionEvent);
- }
+ && ((EnrichedEvent) tsFileInsertionEvent).getReplicateIndexForIoTV2()
+ != EnrichedEvent.NO_COMMIT_ID) {
+ eventCollector.collect(tsFileInsertionEvent);
}
}
@Override
public void process(TabletInsertionEvent tabletInsertionEvent,
EventCollector eventCollector)
throws Exception {
- // Only user-generated TabletInsertionEvent can be replicated.
if (tabletInsertionEvent instanceof EnrichedEvent) {
final EnrichedEvent enrichedEvent = (EnrichedEvent) tabletInsertionEvent;
- if (isContainLocalData(enrichedEvent)) {
+ if (enrichedEvent.getReplicateIndexForIoTV2() !=
EnrichedEvent.NO_COMMIT_ID) {
eventCollector.collect(tabletInsertionEvent);
}
}
@@ -101,7 +120,7 @@ public class PipeConsensusProcessor implements
PipeProcessor {
public void process(Event event, EventCollector eventCollector) throws
Exception {
if (event instanceof EnrichedEvent) {
final EnrichedEvent enrichedEvent = (EnrichedEvent) event;
- if (isContainLocalData(enrichedEvent)) {
+ if (enrichedEvent.getReplicateIndexForIoTV2() !=
EnrichedEvent.NO_COMMIT_ID) {
eventCollector.collect(event);
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/pipeconsensus/PipeConsensusReceiver.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/pipeconsensus/PipeConsensusReceiver.java
index 0a5ba1e9782..f974926c5ad 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/pipeconsensus/PipeConsensusReceiver.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/pipeconsensus/PipeConsensusReceiver.java
@@ -975,7 +975,7 @@ public class PipeConsensusReceiver {
consensusPipeName.toString());
}
- // initiate receiverFileDirWithIdSuffix
+ // initiate receiverFileBaseDir
String receiverFileBaseDir;
try {
receiverFileBaseDir = getReceiverFileBaseDir();
@@ -1321,17 +1321,15 @@ public class PipeConsensusReceiver {
private final PipeConsensusTsFileWriterPool tsFileWriterPool;
private final AtomicInteger WALEventCount = new AtomicInteger(0);
private final AtomicInteger tsFileEventCount = new AtomicInteger(0);
- private long onSyncedCommitIndex = 0;
+ private long onSyncedReplicateIndex = 0;
private int connectorRebootTimes = 0;
- private int pipeTaskRestartTimes = 0;
public RequestExecutor(
PipeConsensusReceiverMetrics metric, PipeConsensusTsFileWriterPool
tsFileWriterPool) {
this.reqExecutionOrderBuffer =
new TreeSet<>(
Comparator.comparingInt(RequestMeta::getDataNodeRebootTimes)
- .thenComparingInt(RequestMeta::getPipeTaskRestartTimes)
- .thenComparingLong(RequestMeta::getCommitIndex));
+ .thenComparingLong(RequestMeta::getReplicateIndex));
this.lock = new ReentrantLock();
this.condition = lock.newCondition();
this.metric = metric;
@@ -1344,7 +1342,7 @@ public class PipeConsensusReceiver {
consensusPipeName,
commitId);
RequestMeta curMeta = reqExecutionOrderBuffer.pollFirst();
- onSyncedCommitIndex = commitId.getCommitIndex();
+ onSyncedReplicateIndex = commitId.getReplicateIndex();
// update metric, notice that curMeta is never null.
if (isTransferTsFileSeal) {
tsFileEventCount.decrementAndGet();
@@ -1391,28 +1389,11 @@ public class PipeConsensusReceiver {
consensusPipeName);
return new TPipeConsensusTransferResp(status);
}
- // Similarly, check pipeTask restartTimes
- if (tCommitId.getDataNodeRebootTimes() == connectorRebootTimes
- && tCommitId.getPipeTaskRestartTimes() < pipeTaskRestartTimes) {
- final TSStatus status =
- new TSStatus(
- RpcUtils.getStatus(
- TSStatusCode.PIPE_CONSENSUS_DEPRECATED_REQUEST,
- "PipeConsensus receiver received a deprecated request,
which may be sent before the pipe task restart. Consider to discard it"));
- LOGGER.info(
- "PipeConsensus-PipeName-{}: received a deprecated request, which
may be sent before the pipe task restart. Consider to discard it",
- consensusPipeName);
- return new TPipeConsensusTransferResp(status);
- }
// Judge whether connector has rebooted or not, if the rebootTimes
increases compared to
// connectorRebootTimes, need to reset receiver because connector has
been restarted.
if (tCommitId.getDataNodeRebootTimes() > connectorRebootTimes) {
resetWithNewestRebootTime(tCommitId.getDataNodeRebootTimes(),
condition);
}
- // Similarly, check pipeTask restartTimes
- if (tCommitId.getPipeTaskRestartTimes() > pipeTaskRestartTimes) {
- resetWithNewestRestartTime(tCommitId.getPipeTaskRestartTimes(),
condition);
- }
// update metric
if (isTransferTsFilePiece &&
!reqExecutionOrderBuffer.contains(requestMeta)) {
// only update tsFileEventCount when tsFileEvent is first enqueue.
@@ -1444,7 +1425,7 @@ public class PipeConsensusReceiver {
// Polling to process
while (true) {
if (reqExecutionOrderBuffer.first().equals(requestMeta)
- && tCommitId.getCommitIndex() == onSyncedCommitIndex + 1) {
+ && tCommitId.getReplicateIndex() == onSyncedReplicateIndex + 1) {
long startApplyNanos = System.nanoTime();
metric.recordDispatchWaitingTimer(startApplyNanos -
startDispatchNanos);
requestMeta.setStartApplyNanos(startApplyNanos);
@@ -1529,7 +1510,7 @@ public class PipeConsensusReceiver {
LOGGER.warn(
"PipeConsensus-PipeName-{}: current waiting is interrupted.
onSyncedCommitIndex: {}. Exception: ",
consensusPipeName,
- tCommitId.getCommitIndex(),
+ tCommitId.getReplicateIndex(),
e);
// Avoid infinite loop when RPC thread is killed by OS
return new TPipeConsensusTransferResp(
@@ -1559,26 +1540,12 @@ public class PipeConsensusReceiver {
condition.signalAll();
// sync the follower's connectorRebootTimes with connector's actual
rebootTimes.
this.connectorRebootTimes = connectorRebootTimes;
- // Note: dataNode rebooting will reset pipeTaskRestartTimes.
- this.pipeTaskRestartTimes = 0;
- }
-
- private void resetWithNewestRestartTime(int pipeTaskRestartTimes,
Condition condition) {
- LOGGER.info(
- "PipeConsensus-PipeName-{}: receiver detected an newer
pipeTaskRestartTimes, which indicates the pipe task has restarted. receiver
will reset all its data.",
- consensusPipeName);
- // since pipe task will resend all data that hasn't synchronized after
restarts, it's safe to
- // clear all events in buffer.
- clear();
- // signal all deprecated requests that may wait on condition to expire
them
- condition.signalAll();
- this.pipeTaskRestartTimes = pipeTaskRestartTimes;
}
private void clear() {
this.reqExecutionOrderBuffer.clear();
this.tsFileWriterPool.handleExit(consensusPipeName);
- this.onSyncedCommitIndex = 0;
+ this.onSyncedReplicateIndex = 0;
}
}
@@ -1594,12 +1561,8 @@ public class PipeConsensusReceiver {
return commitId.getDataNodeRebootTimes();
}
- public int getPipeTaskRestartTimes() {
- return commitId.getPipeTaskRestartTimes();
- }
-
- public long getCommitIndex() {
- return commitId.getCommitIndex();
+ public long getReplicateIndex() {
+ return commitId.getReplicateIndex();
}
public void setStartApplyNanos(long startApplyNanos) {
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/event/EnrichedEvent.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/event/EnrichedEvent.java
index 30c1d1dca6b..98f90901942 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/event/EnrichedEvent.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/event/EnrichedEvent.java
@@ -61,6 +61,8 @@ public abstract class EnrichedEvent implements Event {
protected CommitterKey committerKey;
public static final long NO_COMMIT_ID = -1;
protected long commitId = NO_COMMIT_ID;
+ // Used in IoTConsensusV2
+ protected long replicateIndexForIoTV2 = NO_COMMIT_ID;
protected int rebootTimes = 0;
protected final TreePattern treePattern;
@@ -415,6 +417,14 @@ public abstract class EnrichedEvent implements Event {
return commitId;
}
+ public long getReplicateIndexForIoTV2() {
+ return replicateIndexForIoTV2;
+ }
+
+ public void setReplicateIndexForIoTV2(long replicateIndexForIoTV2) {
+ this.replicateIndexForIoTV2 = replicateIndexForIoTV2;
+ }
+
public void onCommitted() {
onCommittedHooks.forEach(Supplier::get);
}
@@ -441,7 +451,8 @@ public abstract class EnrichedEvent implements Event {
final EnrichedEvent otherEvent = (EnrichedEvent) o;
return Objects.equals(committerKey, otherEvent.committerKey)
&& commitId == otherEvent.commitId
- && rebootTimes == otherEvent.rebootTimes;
+ && rebootTimes == otherEvent.rebootTimes
+ && replicateIndexForIoTV2 == otherEvent.replicateIndexForIoTV2;
}
@Override
@@ -459,6 +470,8 @@ public abstract class EnrichedEvent implements Event {
+ committerKey
+ "', commitId="
+ commitId
+ + "', replicateIndexForIoTV2="
+ + replicateIndexForIoTV2
+ ", treePattern='"
+ treePattern
+ "', tablePattern='"
@@ -488,6 +501,8 @@ public abstract class EnrichedEvent implements Event {
+ committerKey
+ "', commitId="
+ commitId
+ + "', replicateIndexForIoTV2="
+ + replicateIndexForIoTV2
+ ", treePattern='"
+ treePattern
+ "', tablePattern='"
diff --git
a/iotdb-protocol/thrift-consensus/src/main/thrift/pipeconsensus.thrift
b/iotdb-protocol/thrift-consensus/src/main/thrift/pipeconsensus.thrift
index ca7a043c007..9bae689e692 100644
--- a/iotdb-protocol/thrift-consensus/src/main/thrift/pipeconsensus.thrift
+++ b/iotdb-protocol/thrift-consensus/src/main/thrift/pipeconsensus.thrift
@@ -21,9 +21,8 @@ include "common.thrift"
namespace java org.apache.iotdb.consensus.pipe.thrift
struct TCommitId {
- 1:required i64 commitIndex
- 2:required i32 pipeTaskRestartTimes
- 3:required i32 dataNodeRebootTimes
+ 1:required i64 replicateIndex
+ 2:required i32 dataNodeRebootTimes
}
struct TPipeConsensusTransferReq {