Search in sources :

Example 1 with AuthenticationException

use of com.github.shyiko.mysql.binlog.network.AuthenticationException in project debezium by debezium.

the class BinlogReader method doStart.

@Override
protected void doStart() {
    // Register our event handlers ...
    eventHandlers.put(EventType.STOP, this::handleServerStop);
    eventHandlers.put(EventType.HEARTBEAT, this::handleServerHeartbeat);
    eventHandlers.put(EventType.INCIDENT, this::handleServerIncident);
    eventHandlers.put(EventType.ROTATE, this::handleRotateLogsEvent);
    eventHandlers.put(EventType.TABLE_MAP, this::handleUpdateTableMetadata);
    eventHandlers.put(EventType.QUERY, this::handleQueryEvent);
    eventHandlers.put(EventType.WRITE_ROWS, this::handleInsert);
    eventHandlers.put(EventType.UPDATE_ROWS, this::handleUpdate);
    eventHandlers.put(EventType.DELETE_ROWS, this::handleDelete);
    eventHandlers.put(EventType.EXT_WRITE_ROWS, this::handleInsert);
    eventHandlers.put(EventType.EXT_UPDATE_ROWS, this::handleUpdate);
    eventHandlers.put(EventType.EXT_DELETE_ROWS, this::handleDelete);
    eventHandlers.put(EventType.VIEW_CHANGE, this::viewChange);
    eventHandlers.put(EventType.XA_PREPARE, this::prepareTransaction);
    eventHandlers.put(EventType.XID, this::handleTransactionCompletion);
    // Get the current GtidSet from MySQL so we can get a filtered/merged GtidSet based off of the last Debezium checkpoint.
    String availableServerGtidStr = connectionContext.knownGtidSet();
    if (availableServerGtidStr != null && !availableServerGtidStr.trim().isEmpty()) {
        // The server is using GTIDs, so enable the handler ...
        eventHandlers.put(EventType.GTID, this::handleGtidEvent);
        // Now look at the GTID set from the server and what we've previously seen ...
        GtidSet availableServerGtidSet = new GtidSet(availableServerGtidStr);
        GtidSet filteredGtidSet = context.filterGtidSet(availableServerGtidSet);
        if (filteredGtidSet != null) {
            // We've seen at least some GTIDs, so start reading from the filtered GTID set ...
            logger.info("Registering binlog reader with GTID set: {}", filteredGtidSet);
            String filteredGtidSetStr = filteredGtidSet.toString();
            client.setGtidSet(filteredGtidSetStr);
            source.setCompletedGtidSet(filteredGtidSetStr);
            gtidSet = new com.github.shyiko.mysql.binlog.GtidSet(filteredGtidSetStr);
        } else {
            // We've not yet seen any GTIDs, so that means we have to start reading the binlog from the beginning ...
            client.setBinlogFilename(source.binlogFilename());
            client.setBinlogPosition(source.binlogPosition());
            gtidSet = new com.github.shyiko.mysql.binlog.GtidSet("");
        }
    } else {
        // The server is not using GTIDs, so start reading the binlog based upon where we last left off ...
        client.setBinlogFilename(source.binlogFilename());
        client.setBinlogPosition(source.binlogPosition());
    }
    // We may be restarting in the middle of a transaction, so see how far into the transaction we have already processed...
    initialEventsToSkip = source.eventsToSkipUponRestart();
    // Set the starting row number, which is the next row number to be read ...
    startingRowNumber = source.rowsToSkipUponRestart();
    // Only when we reach the first BEGIN event will we start to skip events ...
    skipEvent = false;
    // Initial our poll output delay logic ...
    pollOutputDelay.hasElapsed();
    previousOutputMillis = clock.currentTimeInMillis();
    // Start the log reader, which starts background threads ...
    if (isRunning()) {
        long timeoutInMilliseconds = context.timeoutInMilliseconds();
        long started = context.getClock().currentTimeInMillis();
        try {
            logger.debug("Attempting to establish binlog reader connection with timeout of {} ms", timeoutInMilliseconds);
            client.connect(context.timeoutInMilliseconds());
        } catch (TimeoutException e) {
            // If the client thread is interrupted *before* the client could connect, the client throws a timeout exception
            // The only way we can distinguish this is if we get the timeout exception before the specified timeout has
            // elapsed, so we simply check this (within 10%) ...
            long duration = context.getClock().currentTimeInMillis() - started;
            if (duration > (0.9 * context.timeoutInMilliseconds())) {
                double actualSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
                throw new ConnectException("Timed out after " + actualSeconds + " seconds while waiting to connect to MySQL at " + connectionContext.hostname() + ":" + connectionContext.port() + " with user '" + connectionContext.username() + "'", e);
            }
        // Otherwise, we were told to shutdown, so we don't care about the timeout exception
        } catch (AuthenticationException e) {
            throw new ConnectException("Failed to authenticate to the MySQL database at " + connectionContext.hostname() + ":" + connectionContext.port() + " with user '" + connectionContext.username() + "'", e);
        } catch (Throwable e) {
            throw new ConnectException("Unable to connect to the MySQL database at " + connectionContext.hostname() + ":" + connectionContext.port() + " with user '" + connectionContext.username() + "': " + e.getMessage(), e);
        }
    }
}
Also used : AuthenticationException(com.github.shyiko.mysql.binlog.network.AuthenticationException) TimeoutException(java.util.concurrent.TimeoutException) ConnectException(org.apache.kafka.connect.errors.ConnectException)

Aggregations

AuthenticationException (com.github.shyiko.mysql.binlog.network.AuthenticationException)1 TimeoutException (java.util.concurrent.TimeoutException)1 ConnectException (org.apache.kafka.connect.errors.ConnectException)1