|
@@ -2,6 +2,7 @@ package com.alibaba.otter.canal.parse.inbound.mysql;
|
|
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.Executors;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
import java.util.concurrent.locks.LockSupport;
|
|
import java.util.concurrent.locks.LockSupport;
|
|
|
|
|
|
@@ -36,6 +37,7 @@ import com.taobao.tddl.dbsync.binlog.event.RowsLogEvent;
|
|
import com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent;
|
|
import com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent;
|
|
import com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent;
|
|
import com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent;
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 针对解析器提供一个多阶段协同的处理
|
|
* 针对解析器提供一个多阶段协同的处理
|
|
*
|
|
*
|
|
@@ -65,6 +67,9 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement
|
|
private volatile CanalParseException exception;
|
|
private volatile CanalParseException exception;
|
|
private AtomicLong eventsPublishBlockingTime;
|
|
private AtomicLong eventsPublishBlockingTime;
|
|
private GTIDSet gtidSet;
|
|
private GTIDSet gtidSet;
|
|
|
|
+ private WorkerPool<MessageEvent> workerPool;
|
|
|
|
+ private BatchEventProcessor<MessageEvent> simpleParserStage;
|
|
|
|
+ private BatchEventProcessor<MessageEvent> sinkStoreStage;
|
|
|
|
|
|
public MysqlMultiStageCoprocessor(int ringBufferSize, int parserThreadCount, LogEventConvert logEventConvert,
|
|
public MysqlMultiStageCoprocessor(int ringBufferSize, int parserThreadCount, LogEventConvert logEventConvert,
|
|
EventTransactionBuffer transactionBuffer, String destination){
|
|
EventTransactionBuffer transactionBuffer, String destination){
|
|
@@ -91,7 +96,7 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement
|
|
SequenceBarrier sequenceBarrier = disruptorMsgBuffer.newBarrier();
|
|
SequenceBarrier sequenceBarrier = disruptorMsgBuffer.newBarrier();
|
|
ExceptionHandler exceptionHandler = new SimpleFatalExceptionHandler();
|
|
ExceptionHandler exceptionHandler = new SimpleFatalExceptionHandler();
|
|
// stage 2
|
|
// stage 2
|
|
- BatchEventProcessor<MessageEvent> simpleParserStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer,
|
|
|
|
|
|
+ simpleParserStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer,
|
|
sequenceBarrier,
|
|
sequenceBarrier,
|
|
new SimpleParserStage());
|
|
new SimpleParserStage());
|
|
simpleParserStage.setExceptionHandler(exceptionHandler);
|
|
simpleParserStage.setExceptionHandler(exceptionHandler);
|
|
@@ -103,7 +108,7 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement
|
|
for (int i = 0; i < parserThreadCount; i++) {
|
|
for (int i = 0; i < parserThreadCount; i++) {
|
|
workHandlers[i] = new DmlParserStage();
|
|
workHandlers[i] = new DmlParserStage();
|
|
}
|
|
}
|
|
- WorkerPool<MessageEvent> workerPool = new WorkerPool<MessageEvent>(disruptorMsgBuffer,
|
|
|
|
|
|
+ workerPool = new WorkerPool<MessageEvent>(disruptorMsgBuffer,
|
|
dmlParserSequenceBarrier,
|
|
dmlParserSequenceBarrier,
|
|
exceptionHandler,
|
|
exceptionHandler,
|
|
workHandlers);
|
|
workHandlers);
|
|
@@ -112,7 +117,7 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement
|
|
|
|
|
|
// stage 4
|
|
// stage 4
|
|
SequenceBarrier sinkSequenceBarrier = disruptorMsgBuffer.newBarrier(sequence);
|
|
SequenceBarrier sinkSequenceBarrier = disruptorMsgBuffer.newBarrier(sequence);
|
|
- BatchEventProcessor<MessageEvent> sinkStoreStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer,
|
|
|
|
|
|
+ sinkStoreStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer,
|
|
sinkSequenceBarrier,
|
|
sinkSequenceBarrier,
|
|
new SinkStoreStage());
|
|
new SinkStoreStage());
|
|
sinkStoreStage.setExceptionHandler(exceptionHandler);
|
|
sinkStoreStage.setExceptionHandler(exceptionHandler);
|
|
@@ -126,14 +131,24 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void stop() {
|
|
public void stop() {
|
|
|
|
+ // fix bug #968,对于pool与
|
|
|
|
+ workerPool.halt();
|
|
|
|
+ simpleParserStage.halt();
|
|
|
|
+ sinkStoreStage.halt();
|
|
try {
|
|
try {
|
|
parserExecutor.shutdownNow();
|
|
parserExecutor.shutdownNow();
|
|
|
|
+ while (!parserExecutor.awaitTermination(1, TimeUnit.SECONDS)) {
|
|
|
|
+ parserExecutor.shutdownNow();
|
|
|
|
+ }
|
|
} catch (Throwable e) {
|
|
} catch (Throwable e) {
|
|
// ignore
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
|
|
try {
|
|
try {
|
|
stageExecutor.shutdownNow();
|
|
stageExecutor.shutdownNow();
|
|
|
|
+ while (!stageExecutor.awaitTermination(1, TimeUnit.SECONDS)) {
|
|
|
|
+ stageExecutor.shutdownNow();
|
|
|
|
+ }
|
|
} catch (Throwable e) {
|
|
} catch (Throwable e) {
|
|
// ignore
|
|
// ignore
|
|
}
|
|
}
|