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
- Inspect the chained KettleDatabaseException cause for the underlying SQL/connection failure.
- Run the repository upgrade/repair scripts so R_SLAVE and related tables exist and match your Kettle version.
- Verify the repository metadata database is reachable; reconnect and reload.
- 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
- Run repository creation/upgrade scripts fully so R_SLAVE exists.
- Keep client Kettle version aligned with repository schema version.
- Check repository DB health before loading clustered jobs.
- Ignore/skip slave shared objects when clustering features are unused.
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
- JobMeta.Log.UnableToReadDatabaseIDSFromRepository
- AbortMeta.Exception.UnableToSaveStepInfoToRepository
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
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)