Search in sources :

Example 1 with GTIDSet

use of com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet in project canal by alibaba.

the class MysqlConnection method seek.

/**
 * 加速主备切换时的查找速度,做一些特殊优化,比如只解析事务头或者尾
 */
public void seek(String binlogfilename, Long binlogPosition, String gtid, SinkFunction func) throws IOException {
    updateSettings();
    loadBinlogChecksum();
    sendBinlogDump(binlogfilename, binlogPosition);
    DirectLogFetcher fetcher = new DirectLogFetcher(connector.getReceiveBufferSize());
    fetcher.start(connector.getChannel());
    LogDecoder decoder = new LogDecoder();
    decoder.handle(LogEvent.ROTATE_EVENT);
    decoder.handle(LogEvent.FORMAT_DESCRIPTION_EVENT);
    decoder.handle(LogEvent.QUERY_EVENT);
    decoder.handle(LogEvent.XID_EVENT);
    LogContext context = new LogContext();
    // using CHANGE MASTER TO MASTER_AUTO_POSITION = 1 ...
    if (StringUtils.isNotEmpty(gtid)) {
        GTIDSet gtidSet = parseGtidSet(gtid, isMariaDB());
        if (isMariaDB()) {
            decoder.handle(LogEvent.GTID_EVENT);
            decoder.handle(LogEvent.GTID_LIST_EVENT);
        } else {
            decoder.handle(LogEvent.GTID_LOG_EVENT);
        }
        context.setGtidSet(gtidSet);
    }
    context.setFormatDescription(new FormatDescriptionLogEvent(4, binlogChecksum));
    while (fetcher.fetch()) {
        accumulateReceivedBytes(fetcher.limit());
        LogEvent event = null;
        event = decoder.decode(fetcher, context);
        if (event == null) {
            throw new CanalParseException("parse failed");
        }
        if (!func.sink(event)) {
            break;
        }
    }
}
Also used : FormatDescriptionLogEvent(com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent) DirectLogFetcher(com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher) LogEvent(com.taobao.tddl.dbsync.binlog.LogEvent) FormatDescriptionLogEvent(com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent) LogContext(com.taobao.tddl.dbsync.binlog.LogContext) LogDecoder(com.taobao.tddl.dbsync.binlog.LogDecoder) GTIDSet(com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet) CanalParseException(com.alibaba.otter.canal.parse.exception.CanalParseException)

Example 2 with GTIDSet

use of com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet in project canal by alibaba.

the class AbstractEventParser method start.

public void start() {
    super.start();
    MDC.put("destination", destination);
    // 配置transaction buffer
    // 初始化缓冲队列
    // 设置buffer大小
    transactionBuffer.setBufferSize(transactionSize);
    transactionBuffer.start();
    // 构造bin log parser
    // 初始化一下BinLogParser
    binlogParser = buildParser();
    binlogParser.start();
    // 启动工作线程
    parseThread = new Thread(new Runnable() {

        public void run() {
            MDC.put("destination", String.valueOf(destination));
            ErosaConnection erosaConnection = null;
            boolean isMariaDB = false;
            while (running) {
                try {
                    // 开始执行replication
                    // 1. 构造Erosa连接
                    erosaConnection = buildErosaConnection();
                    // 2. 启动一个心跳线程
                    startHeartBeat(erosaConnection);
                    // 3. 执行dump前的准备工作
                    preDump(erosaConnection);
                    // 链接
                    erosaConnection.connect();
                    long queryServerId = erosaConnection.queryServerId();
                    if (queryServerId != 0) {
                        serverId = queryServerId;
                    }
                    if (erosaConnection instanceof MysqlConnection) {
                        isMariaDB = ((MysqlConnection) erosaConnection).isMariaDB();
                    }
                    // 4. 获取最后的位置信息
                    long start = System.currentTimeMillis();
                    logger.warn("---> begin to find start position, it will be long time for reset or first position");
                    EntryPosition position = findStartPosition(erosaConnection);
                    final EntryPosition startPosition = position;
                    if (startPosition == null) {
                        throw new PositionNotFoundException("can't find start position for " + destination);
                    }
                    if (!processTableMeta(startPosition)) {
                        throw new CanalParseException("can't find init table meta for " + destination + " with position : " + startPosition);
                    }
                    long end = System.currentTimeMillis();
                    logger.warn("---> find start position successfully, {}", startPosition.toString() + " cost : " + (end - start) + "ms , the next step is binlog dump");
                    // 重新链接,因为在找position过程中可能有状态,需要断开后重建
                    erosaConnection.reconnect();
                    final SinkFunction sinkHandler = new SinkFunction<EVENT>() {

                        private LogPosition lastPosition;

                        public boolean sink(EVENT event) {
                            try {
                                CanalEntry.Entry entry = parseAndProfilingIfNecessary(event, false);
                                if (!running) {
                                    return false;
                                }
                                if (entry != null) {
                                    // 有正常数据流过,清空exception
                                    exception = null;
                                    transactionBuffer.add(entry);
                                    // 记录一下对应的positions
                                    this.lastPosition = buildLastPosition(entry);
                                    // 记录一下最后一次有数据的时间
                                    lastEntryTime = System.currentTimeMillis();
                                }
                                return running;
                            } catch (TableIdNotFoundException e) {
                                throw e;
                            } catch (Throwable e) {
                                if (e.getCause() instanceof TableIdNotFoundException) {
                                    throw (TableIdNotFoundException) e.getCause();
                                }
                                // 记录一下,出错的位点信息
                                processSinkError(e, this.lastPosition, startPosition.getJournalName(), startPosition.getPosition());
                                // 继续抛出异常,让上层统一感知
                                throw new CanalParseException(e);
                            }
                        }
                    };
                    // 4. 开始dump数据
                    if (parallel) {
                        // build stage processor
                        multiStageCoprocessor = buildMultiStageCoprocessor();
                        if (isGTIDMode() && StringUtils.isNotEmpty(startPosition.getGtid())) {
                            // 判断所属instance是否启用GTID模式,是的话调用ErosaConnection中GTID对应方法dump数据
                            GTIDSet gtidSet = parseGtidSet(startPosition.getGtid(), isMariaDB);
                            ((MysqlMultiStageCoprocessor) multiStageCoprocessor).setGtidSet(gtidSet);
                            multiStageCoprocessor.start();
                            erosaConnection.dump(gtidSet, multiStageCoprocessor);
                        } else {
                            multiStageCoprocessor.start();
                            if (StringUtils.isEmpty(startPosition.getJournalName()) && startPosition.getTimestamp() != null) {
                                erosaConnection.dump(startPosition.getTimestamp(), multiStageCoprocessor);
                            } else {
                                erosaConnection.dump(startPosition.getJournalName(), startPosition.getPosition(), multiStageCoprocessor);
                            }
                        }
                    } else {
                        if (isGTIDMode() && StringUtils.isNotEmpty(startPosition.getGtid())) {
                            // 判断所属instance是否启用GTID模式,是的话调用ErosaConnection中GTID对应方法dump数据
                            erosaConnection.dump(parseGtidSet(startPosition.getGtid(), isMariaDB), sinkHandler);
                        } else {
                            if (StringUtils.isEmpty(startPosition.getJournalName()) && startPosition.getTimestamp() != null) {
                                erosaConnection.dump(startPosition.getTimestamp(), sinkHandler);
                            } else {
                                erosaConnection.dump(startPosition.getJournalName(), startPosition.getPosition(), sinkHandler);
                            }
                        }
                    }
                } catch (TableIdNotFoundException e) {
                    exception = e;
                    // 特殊处理TableIdNotFound异常,出现这样的异常,一种可能就是起始的position是一个事务当中,导致tablemap
                    // Event时间没解析过
                    needTransactionPosition.compareAndSet(false, true);
                    logger.error(String.format("dump address %s has an error, retrying. caused by ", runningInfo.getAddress().toString()), e);
                } catch (Throwable e) {
                    processDumpError(e);
                    exception = e;
                    if (!running) {
                        if (!(e instanceof java.nio.channels.ClosedByInterruptException || e.getCause() instanceof java.nio.channels.ClosedByInterruptException)) {
                            throw new CanalParseException(String.format("dump address %s has an error, retrying. ", runningInfo.getAddress().toString()), e);
                        }
                    } else {
                        logger.error(String.format("dump address %s has an error, retrying. caused by ", runningInfo.getAddress().toString()), e);
                        sendAlarm(destination, ExceptionUtils.getFullStackTrace(e));
                    }
                    if (parserExceptionHandler != null) {
                        parserExceptionHandler.handle(e);
                    }
                } finally {
                    // 重新置为中断状态
                    Thread.interrupted();
                    // 关闭一下链接
                    afterDump(erosaConnection);
                    try {
                        if (erosaConnection != null) {
                            erosaConnection.disconnect();
                        }
                    } catch (IOException e1) {
                        if (!running) {
                            throw new CanalParseException(String.format("disconnect address %s has an error, retrying. ", runningInfo.getAddress().toString()), e1);
                        } else {
                            logger.error("disconnect address {} has an error, retrying., caused by ", runningInfo.getAddress().toString(), e1);
                        }
                    }
                }
                // 出异常了,退出sink消费,释放一下状态
                eventSink.interrupt();
                // 重置一下缓冲队列,重新记录数据
                transactionBuffer.reset();
                // 重新置位
                binlogParser.reset();
                if (multiStageCoprocessor != null && multiStageCoprocessor.isStart()) {
                    // 处理 RejectedExecutionException
                    try {
                        multiStageCoprocessor.stop();
                    } catch (Throwable t) {
                        logger.debug("multi processor rejected:", t);
                    }
                }
                if (running) {
                    // sleep一段时间再进行重试
                    try {
                        Thread.sleep(10000 + RandomUtils.nextInt(10000));
                    } catch (InterruptedException e) {
                    }
                }
            }
            MDC.remove("destination");
        }
    });
    parseThread.setUncaughtExceptionHandler(handler);
    parseThread.setName(String.format("destination = %s , address = %s , EventParser", destination, runningInfo == null ? null : runningInfo.getAddress()));
    parseThread.start();
}
Also used : MysqlConnection(com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection) MysqlMultiStageCoprocessor(com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor) TableIdNotFoundException(com.taobao.tddl.dbsync.binlog.exception.TableIdNotFoundException) IOException(java.io.IOException) GTIDSet(com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet) CanalParseException(com.alibaba.otter.canal.parse.exception.CanalParseException) PositionNotFoundException(com.alibaba.otter.canal.parse.exception.PositionNotFoundException) CanalEntry(com.alibaba.otter.canal.protocol.CanalEntry) EntryPosition(com.alibaba.otter.canal.protocol.position.EntryPosition) Entry(com.alibaba.otter.canal.protocol.CanalEntry.Entry) LogPosition(com.alibaba.otter.canal.protocol.position.LogPosition)

Example 3 with GTIDSet

use of com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet in project canal by alibaba.

the class MysqlGTIDSetTest method testEncode.

@Test
public void testEncode() throws IOException {
    GTIDSet gtidSet = MysqlGTIDSet.parse("726757ad-4455-11e8-ae04-0242ac110002:1");
    byte[] bytes = gtidSet.encode();
    byte[] expected = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x67, 0x57, (byte) 0xad, 0x44, 0x55, 0x11, (byte) 0xe8, (byte) 0xae, 0x04, 0x02, 0x42, (byte) 0xac, 0x11, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    for (int i = 0; i < bytes.length; i++) {
        assertEquals(expected[i], bytes[i]);
    }
}
Also used : MysqlGTIDSet(com.alibaba.otter.canal.parse.driver.mysql.packets.MysqlGTIDSet) GTIDSet(com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet) Test(org.junit.Test)

Example 4 with GTIDSet

use of com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet in project canal by alibaba.

the class LogDecoder method decode.

/**
 * Deserialize an event from buffer.
 *
 * @return <code>UknownLogEvent</code> if event type is unknown or skipped.
 */
public static LogEvent decode(LogBuffer buffer, LogHeader header, LogContext context) throws IOException {
    FormatDescriptionLogEvent descriptionEvent = context.getFormatDescription();
    LogPosition logPosition = context.getLogPosition();
    int checksumAlg = LogEvent.BINLOG_CHECKSUM_ALG_UNDEF;
    if (header.getType() != LogEvent.FORMAT_DESCRIPTION_EVENT) {
        checksumAlg = descriptionEvent.header.getChecksumAlg();
    } else {
        // 如果是format事件自己,也需要处理checksum
        checksumAlg = header.getChecksumAlg();
    }
    if (checksumAlg != LogEvent.BINLOG_CHECKSUM_ALG_OFF && checksumAlg != LogEvent.BINLOG_CHECKSUM_ALG_UNDEF) {
        // remove checksum bytes
        buffer.limit(header.getEventLen() - LogEvent.BINLOG_CHECKSUM_LEN);
    }
    GTIDSet gtidSet = context.getGtidSet();
    LogEvent gtidLogEvent = context.getGtidLogEvent();
    switch(header.getType()) {
        case LogEvent.QUERY_EVENT:
            {
                QueryLogEvent event = new QueryLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.XID_EVENT:
            {
                XidLogEvent event = new XidLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.TABLE_MAP_EVENT:
            {
                TableMapLogEvent mapEvent = new TableMapLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                context.putTable(mapEvent);
                return mapEvent;
            }
        case LogEvent.WRITE_ROWS_EVENT_V1:
        case LogEvent.WRITE_ROWS_EVENT:
            {
                RowsLogEvent event = new WriteRowsLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                event.fillTable(context);
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.UPDATE_ROWS_EVENT_V1:
        case LogEvent.UPDATE_ROWS_EVENT:
            {
                RowsLogEvent event = new UpdateRowsLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                event.fillTable(context);
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.DELETE_ROWS_EVENT_V1:
        case LogEvent.DELETE_ROWS_EVENT:
            {
                RowsLogEvent event = new DeleteRowsLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                event.fillTable(context);
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.ROTATE_EVENT:
            {
                RotateLogEvent event = new RotateLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition = new LogPosition(event.getFilename(), event.getPosition());
                context.setLogPosition(logPosition);
                return event;
            }
        case LogEvent.LOAD_EVENT:
        case LogEvent.NEW_LOAD_EVENT:
            {
                LoadLogEvent event = new LoadLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.SLAVE_EVENT:
            /* can never happen (unused event) */
            {
                if (logger.isWarnEnabled())
                    logger.warn("Skipping unsupported SLAVE_EVENT from: " + context.getLogPosition());
                break;
            }
        case LogEvent.CREATE_FILE_EVENT:
            {
                CreateFileLogEvent event = new CreateFileLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.APPEND_BLOCK_EVENT:
            {
                AppendBlockLogEvent event = new AppendBlockLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.DELETE_FILE_EVENT:
            {
                DeleteFileLogEvent event = new DeleteFileLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.EXEC_LOAD_EVENT:
            {
                ExecuteLoadLogEvent event = new ExecuteLoadLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.START_EVENT_V3:
            {
                /* This is sent only by MySQL <=4.x */
                StartLogEventV3 event = new StartLogEventV3(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.STOP_EVENT:
            {
                StopLogEvent event = new StopLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.INTVAR_EVENT:
            {
                IntvarLogEvent event = new IntvarLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.RAND_EVENT:
            {
                RandLogEvent event = new RandLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.USER_VAR_EVENT:
            {
                UserVarLogEvent event = new UserVarLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.FORMAT_DESCRIPTION_EVENT:
            {
                descriptionEvent = new FormatDescriptionLogEvent(header, buffer, descriptionEvent);
                context.setFormatDescription(descriptionEvent);
                return descriptionEvent;
            }
        case LogEvent.PRE_GA_WRITE_ROWS_EVENT:
            {
                if (logger.isWarnEnabled())
                    logger.warn("Skipping unsupported PRE_GA_WRITE_ROWS_EVENT from: " + context.getLogPosition());
                // description_event);
                break;
            }
        case LogEvent.PRE_GA_UPDATE_ROWS_EVENT:
            {
                if (logger.isWarnEnabled())
                    logger.warn("Skipping unsupported PRE_GA_UPDATE_ROWS_EVENT from: " + context.getLogPosition());
                // description_event);
                break;
            }
        case LogEvent.PRE_GA_DELETE_ROWS_EVENT:
            {
                if (logger.isWarnEnabled())
                    logger.warn("Skipping unsupported PRE_GA_DELETE_ROWS_EVENT from: " + context.getLogPosition());
                // description_event);
                break;
            }
        case LogEvent.BEGIN_LOAD_QUERY_EVENT:
            {
                BeginLoadQueryLogEvent event = new BeginLoadQueryLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.EXECUTE_LOAD_QUERY_EVENT:
            {
                ExecuteLoadQueryLogEvent event = new ExecuteLoadQueryLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.INCIDENT_EVENT:
            {
                IncidentLogEvent event = new IncidentLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.HEARTBEAT_LOG_EVENT:
            {
                HeartbeatLogEvent event = new HeartbeatLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.IGNORABLE_LOG_EVENT:
            {
                IgnorableLogEvent event = new IgnorableLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.ROWS_QUERY_LOG_EVENT:
            {
                RowsQueryLogEvent event = new RowsQueryLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.PARTIAL_UPDATE_ROWS_EVENT:
            {
                RowsLogEvent event = new UpdateRowsLogEvent(header, buffer, descriptionEvent, true);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                event.fillTable(context);
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.GTID_LOG_EVENT:
        case LogEvent.ANONYMOUS_GTID_LOG_EVENT:
            {
                GtidLogEvent event = new GtidLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                if (gtidSet != null) {
                    gtidSet.update(event.getGtidStr());
                    // update latest gtid
                    header.putGtid(gtidSet, event);
                }
                // update current gtid event to context
                context.setGtidLogEvent(event);
                return event;
            }
        case LogEvent.PREVIOUS_GTIDS_LOG_EVENT:
            {
                PreviousGtidsLogEvent event = new PreviousGtidsLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.TRANSACTION_CONTEXT_EVENT:
            {
                TransactionContextLogEvent event = new TransactionContextLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.VIEW_CHANGE_EVENT:
            {
                ViewChangeEvent event = new ViewChangeEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.XA_PREPARE_LOG_EVENT:
            {
                XaPrepareLogEvent event = new XaPrepareLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.ANNOTATE_ROWS_EVENT:
            {
                AnnotateRowsEvent event = new AnnotateRowsEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                header.putGtid(context.getGtidSet(), gtidLogEvent);
                return event;
            }
        case LogEvent.BINLOG_CHECKPOINT_EVENT:
            {
                BinlogCheckPointLogEvent event = new BinlogCheckPointLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        case LogEvent.GTID_EVENT:
            {
                MariaGtidLogEvent event = new MariaGtidLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                if (gtidSet != null) {
                    gtidSet.update(event.getGtidStr());
                    // update latest gtid
                    header.putGtid(gtidSet, event);
                }
                // update current gtid event to context
                context.setGtidLogEvent(event);
                return event;
            }
        case LogEvent.GTID_LIST_EVENT:
            {
                MariaGtidListLogEvent event = new MariaGtidListLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                if (gtidSet != null) {
                    gtidSet.update(event.getGtidStr());
                    // update latest gtid
                    header.putGtid(gtidSet, event);
                }
                // update current gtid event to context
                context.setGtidLogEvent(event);
                return event;
            }
        case LogEvent.START_ENCRYPTION_EVENT:
            {
                StartEncryptionLogEvent event = new StartEncryptionLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            }
        default:
            /*
                 * Create an object of Ignorable_log_event for unrecognized
                 * sub-class. So that SLAVE SQL THREAD will only update the
                 * position and continue.
                 */
            if ((buffer.getUint16(LogEvent.FLAGS_OFFSET) & LogEvent.LOG_EVENT_IGNORABLE_F) > 0) {
                IgnorableLogEvent event = new IgnorableLogEvent(header, buffer, descriptionEvent);
                /* updating position in context */
                logPosition.position = header.getLogPos();
                return event;
            } else {
                if (logger.isWarnEnabled()) {
                    logger.warn("Skipping unrecognized binlog event " + LogEvent.getTypeName(header.getType()) + " from: " + context.getLogPosition());
                }
            }
    }
    /* updating position in context */
    logPosition.position = header.getLogPos();
    /* Unknown or unsupported log event */
    return new UnknownLogEvent(header);
}
Also used : FormatDescriptionLogEvent(com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent) PreviousGtidsLogEvent(com.taobao.tddl.dbsync.binlog.event.PreviousGtidsLogEvent) StartEncryptionLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.StartEncryptionLogEvent) WriteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent) MariaGtidLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidLogEvent) GtidLogEvent(com.taobao.tddl.dbsync.binlog.event.GtidLogEvent) UserVarLogEvent(com.taobao.tddl.dbsync.binlog.event.UserVarLogEvent) UpdateRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent) CreateFileLogEvent(com.taobao.tddl.dbsync.binlog.event.CreateFileLogEvent) StopLogEvent(com.taobao.tddl.dbsync.binlog.event.StopLogEvent) RowsQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.RowsQueryLogEvent) IncidentLogEvent(com.taobao.tddl.dbsync.binlog.event.IncidentLogEvent) BinlogCheckPointLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.BinlogCheckPointLogEvent) TransactionContextLogEvent(com.taobao.tddl.dbsync.binlog.event.TransactionContextLogEvent) ViewChangeEvent(com.taobao.tddl.dbsync.binlog.event.ViewChangeEvent) RandLogEvent(com.taobao.tddl.dbsync.binlog.event.RandLogEvent) BeginLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.BeginLoadQueryLogEvent) RowsQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.RowsQueryLogEvent) ExecuteLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadQueryLogEvent) BeginLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.BeginLoadQueryLogEvent) QueryLogEvent(com.taobao.tddl.dbsync.binlog.event.QueryLogEvent) ExecuteLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadQueryLogEvent) XidLogEvent(com.taobao.tddl.dbsync.binlog.event.XidLogEvent) TableMapLogEvent(com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent) DeleteFileLogEvent(com.taobao.tddl.dbsync.binlog.event.DeleteFileLogEvent) XaPrepareLogEvent(com.taobao.tddl.dbsync.binlog.event.XaPrepareLogEvent) UpdateRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent) RowsQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.RowsQueryLogEvent) ExecuteLoadLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadLogEvent) PreviousGtidsLogEvent(com.taobao.tddl.dbsync.binlog.event.PreviousGtidsLogEvent) TransactionContextLogEvent(com.taobao.tddl.dbsync.binlog.event.TransactionContextLogEvent) BinlogCheckPointLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.BinlogCheckPointLogEvent) ExecuteLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadQueryLogEvent) BeginLoadQueryLogEvent(com.taobao.tddl.dbsync.binlog.event.BeginLoadQueryLogEvent) IntvarLogEvent(com.taobao.tddl.dbsync.binlog.event.IntvarLogEvent) WriteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent) RandLogEvent(com.taobao.tddl.dbsync.binlog.event.RandLogEvent) XidLogEvent(com.taobao.tddl.dbsync.binlog.event.XidLogEvent) AppendBlockLogEvent(com.taobao.tddl.dbsync.binlog.event.AppendBlockLogEvent) HeartbeatLogEvent(com.taobao.tddl.dbsync.binlog.event.HeartbeatLogEvent) TableMapLogEvent(com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent) RotateLogEvent(com.taobao.tddl.dbsync.binlog.event.RotateLogEvent) QueryLogEvent(com.taobao.tddl.dbsync.binlog.event.QueryLogEvent) XaPrepareLogEvent(com.taobao.tddl.dbsync.binlog.event.XaPrepareLogEvent) MariaGtidLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidLogEvent) StartEncryptionLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.StartEncryptionLogEvent) DeleteFileLogEvent(com.taobao.tddl.dbsync.binlog.event.DeleteFileLogEvent) DeleteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.DeleteRowsLogEvent) StopLogEvent(com.taobao.tddl.dbsync.binlog.event.StopLogEvent) UserVarLogEvent(com.taobao.tddl.dbsync.binlog.event.UserVarLogEvent) FormatDescriptionLogEvent(com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent) IgnorableLogEvent(com.taobao.tddl.dbsync.binlog.event.IgnorableLogEvent) MariaGtidListLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidListLogEvent) GtidLogEvent(com.taobao.tddl.dbsync.binlog.event.GtidLogEvent) IncidentLogEvent(com.taobao.tddl.dbsync.binlog.event.IncidentLogEvent) RowsLogEvent(com.taobao.tddl.dbsync.binlog.event.RowsLogEvent) UnknownLogEvent(com.taobao.tddl.dbsync.binlog.event.UnknownLogEvent) CreateFileLogEvent(com.taobao.tddl.dbsync.binlog.event.CreateFileLogEvent) LoadLogEvent(com.taobao.tddl.dbsync.binlog.event.LoadLogEvent) UnknownLogEvent(com.taobao.tddl.dbsync.binlog.event.UnknownLogEvent) UpdateRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent) WriteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent) DeleteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.DeleteRowsLogEvent) RowsLogEvent(com.taobao.tddl.dbsync.binlog.event.RowsLogEvent) RotateLogEvent(com.taobao.tddl.dbsync.binlog.event.RotateLogEvent) AnnotateRowsEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.AnnotateRowsEvent) GTIDSet(com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet) ExecuteLoadLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadLogEvent) HeartbeatLogEvent(com.taobao.tddl.dbsync.binlog.event.HeartbeatLogEvent) DeleteRowsLogEvent(com.taobao.tddl.dbsync.binlog.event.DeleteRowsLogEvent) StartLogEventV3(com.taobao.tddl.dbsync.binlog.event.StartLogEventV3) ExecuteLoadLogEvent(com.taobao.tddl.dbsync.binlog.event.ExecuteLoadLogEvent) LoadLogEvent(com.taobao.tddl.dbsync.binlog.event.LoadLogEvent) IgnorableLogEvent(com.taobao.tddl.dbsync.binlog.event.IgnorableLogEvent) MariaGtidLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidLogEvent) MariaGtidListLogEvent(com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidListLogEvent) IntvarLogEvent(com.taobao.tddl.dbsync.binlog.event.IntvarLogEvent) AppendBlockLogEvent(com.taobao.tddl.dbsync.binlog.event.AppendBlockLogEvent)

Aggregations

GTIDSet (com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet)4 CanalParseException (com.alibaba.otter.canal.parse.exception.CanalParseException)2 FormatDescriptionLogEvent (com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent)2 MysqlGTIDSet (com.alibaba.otter.canal.parse.driver.mysql.packets.MysqlGTIDSet)1 PositionNotFoundException (com.alibaba.otter.canal.parse.exception.PositionNotFoundException)1 MysqlConnection (com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection)1 MysqlMultiStageCoprocessor (com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor)1 DirectLogFetcher (com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher)1 CanalEntry (com.alibaba.otter.canal.protocol.CanalEntry)1 Entry (com.alibaba.otter.canal.protocol.CanalEntry.Entry)1 EntryPosition (com.alibaba.otter.canal.protocol.position.EntryPosition)1 LogPosition (com.alibaba.otter.canal.protocol.position.LogPosition)1 LogContext (com.taobao.tddl.dbsync.binlog.LogContext)1 LogDecoder (com.taobao.tddl.dbsync.binlog.LogDecoder)1 LogEvent (com.taobao.tddl.dbsync.binlog.LogEvent)1 AppendBlockLogEvent (com.taobao.tddl.dbsync.binlog.event.AppendBlockLogEvent)1 BeginLoadQueryLogEvent (com.taobao.tddl.dbsync.binlog.event.BeginLoadQueryLogEvent)1 CreateFileLogEvent (com.taobao.tddl.dbsync.binlog.event.CreateFileLogEvent)1 DeleteFileLogEvent (com.taobao.tddl.dbsync.binlog.event.DeleteFileLogEvent)1 DeleteRowsLogEvent (com.taobao.tddl.dbsync.binlog.event.DeleteRowsLogEvent)1