pentaho/pentaho-kettle · error · KettleException

JobMeta.Log.UnableToReadSlaveServersFromRepository

Error message

JobMeta.Log.UnableToReadSlaveServersFromRepository

What it means

readSlaves reads slave server definitions (R_SLAVE table) from the repository and adds them to the JobMeta. A KettleDatabaseException while querying those rows is wrapped in this KettleException meaning 'unable to read slave servers from the repository'.

Solutions

  1. Inspect the chained KettleDatabaseException cause for the underlying SQL/connection failure.
  2. Run the repository upgrade/repair scripts so R_SLAVE and related tables exist and match your Kettle version.
  3. Verify the repository metadata database is reachable; reconnect and reload.
  4. If slaves are unused, load without shared objects or prune stale slave rows.

Example fix

// before
JobMeta job = (JobMeta) repository.loadJob(name, directory, monitor, null); // fails reading R_SLAVE
// after
try {
  JobMeta job = (JobMeta) repository.loadJob(name, directory, monitor, null);
} catch (KettleException e) {
  logError("Slave server read failed: " + e.getCause(), e);
  // upgrade repository schema / restore DB connection, then retry
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (!repository.isConnected()) { repository.connect(user, password); }
// verify R_SLAVE table exists (repository schema version check) before loading jobs

Try / catch

try {
  JobMeta job = (JobMeta) repository.loadJob(name, dir, monitor, null);
} catch (KettleException e) {
  logError("Could not read slave servers: " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage()), e);
  // upgrade repository schema or restore DB, then retry
}

Prevention

When it happens

Trigger: Called during readSharedObjects (job/transformation load) when the query over R_SLAVE fails: missing table, schema mismatch, dead metadata connection, or SQL error.

Common situations: Loading a job from a partially upgraded repository lacking R_SLAVE; cluster/slave configuration stored in an unreachable repository; connectivity failure while loading shared objects.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryJobDelegate.java:759

    try {
      ObjectId[] dbids = repository.getSlaveIDs( false );
      for ( int i = 0; i < dbids.length; i++ ) {
        SlaveServer slaveServer = repository.loadSlaveServer( dbids[i], null ); // Load last version
        slaveServer.shareVariablesWith( jobMeta );

        SlaveServer check = jobMeta.findSlaveServer( slaveServer.getName() ); // Check if there already is one in the
                                                                              // transformation
        if ( check == null || overWriteShared ) {
          if ( !Utils.isEmpty( slaveServer.getName() ) ) {
            jobMeta.addOrReplaceSlaveServer( slaveServer );
            if ( !overWriteShared ) {
              slaveServer.setChanged( false );
            }
          }
        }
      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages
        .getString( PKG, "JobMeta.Log.UnableToReadSlaveServersFromRepository" ), dbe );
    }
  }

  public void readSharedObjects( JobMeta jobMeta ) throws KettleException {
    readDatabases( jobMeta, true );
    readSlaves( jobMeta, true );
  }

  public synchronized ObjectId getJobID( String name, ObjectId id_directory ) throws KettleException {
    return repository.connectionDelegate.getIDWithValue(
      quoteTable( KettleDatabaseRepository.TABLE_R_JOB ), quote( KettleDatabaseRepository.FIELD_JOB_ID_JOB ),
      quote( KettleDatabaseRepository.FIELD_JOB_NAME ), name,
      quote( KettleDatabaseRepository.FIELD_JOB_ID_DIRECTORY ), id_directory );
  }

  public synchronized int getNrJobs() throws KettleException {
    int retval = 0;

View on GitHub (pinned to f3058517a1)