pentaho/pentaho-kettle · error · KettleException

Unable to automatically configure slave sequences

Error message

Unable to automatically configure slave sequences

What it means

SlaveServerConfig.readAutoSequences auto-creates/validates slave sequences in the configured autoSequence database and wraps any failure in KettleException("Unable to automatically configure slave sequences") with the cause chained, disconnecting the database in finally. It means Carte could not set up the sequences needed for clustered execution bookkeeping.

Solutions

  1. Inspect the chained cause for the exact SQL/DDL failure.
  2. Grant the configured DB user CREATE/SELECT/UPDATE privileges needed to create and read slave sequences.
  3. Verify the autoSequence database connection settings in carte-config.xml (host, port, database, type).
  4. Manually create the missing slave sequence rows/tables, then restart Carte.
  5. If clustering/sequences aren't needed, remove the autoSequence config so readAutoSequences returns early.

Example fix

// before
<auto_sequence>
  <database>seqdb</database>
</auto_sequence> <!-- seqdb user lacks CREATE -->

// after: grant privileges or point at an account that can create sequences
GRANT CREATE, SELECT, UPDATE ON schema.* TO 'carte'@'%';
Defensive patterns

Strategy: try-catch

Validate before calling

// verify autoSequence DB privileges before starting Carte
DatabaseMeta db = ...;
try (Connection c = DriverManager.getConnection(db.getURL(), db.getUsername(), db.getPassword());
     Statement s = c.createStatement()) {
  s.execute("SELECT 1"); // basic reachability; run DDL grants separately
}

Try / catch

try {
  config.readAutoSequences();
} catch (KettleException e) {
  log.fatal("Slave sequence auto-config failed; clustering unusable", e.getCause() != null ? e.getCause() : e);
  throw e; // fail startup early rather than run a broken cluster
}

Prevention

When it happens

Trigger: parseAndRunCommand -> readAutoSequences while the autoSequence database in carte-config.xml is unreachable, the DB user lacks CREATE/SELECT privileges to create or read the sequence rows, or an existing slave sequence record is corrupt/missing columns.

Common situations: Fresh Carte install pointed at a sequence DB where the service account can't CREATE TABLE/SEQUENCE; sequence DB migrated without copying the cluster sequence rows; wrong database type in config causing invalid DDL.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/fedef4c8603ee259. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/www/SlaveServerConfig.java:336

        // Automatically create a new sequence for each sequence found...
        //
        String sequenceName = rowMeta.getString( row, seqField, null );
        if ( !Utils.isEmpty( sequenceName ) ) {
          Long value = rowMeta.getInteger( row, valueField, null );
          if ( value != null ) {
            SlaveSequence slaveSequence =
              new SlaveSequence( sequenceName, value, databaseMeta, autoSequence.getSchemaName(), autoSequence
                .getTableName(), autoSequence.getSequenceNameField(), autoSequence.getValueField() );

            slaveSequences.add( slaveSequence );

            LogChannel.GENERAL.logBasic( "Automatically created slave sequence '"
              + slaveSequence.getName() + "' with start value " + slaveSequence.getStartValue() );
          }
        }
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to automatically configure slave sequences", e );
    } finally {
      if ( database != null ) {
        database.disconnect();
      }
    }
  }

  private void checkNetworkInterfaceSetting( LogChannelInterface log, Node slaveNode, SlaveServer slaveServer ) {
    // See if we need to grab the network interface to use and then override the host name
    //
    String networkInterfaceName = XMLHandler.getTagValue( slaveNode, "network_interface" );
    if ( !Utils.isEmpty( networkInterfaceName ) ) {
      // OK, so let's try to get the IP address for this network interface...
      //
      try {
        String newHostname = Const.getIPAddress( networkInterfaceName );
        if ( newHostname != null ) {
          slaveServer.setHostname( newHostname );

View on GitHub (pinned to f3058517a1)