pentaho/pentaho-kettle · error · KettleException
JobEntryMailValidator.Meta.UnableToLoadFromRep
Error message
JobEntryMailValidator.Meta.UnableToLoadFromRep
What it means
JobEntryMailValidator.loadRep() throws this KettleException when reading the job entry's persisted attributes (smtpCheck, timeout, defaultSMTP, emailSender, emailAddress) from the Kettle repository fails with a KettleDatabaseException. The message key is concatenated with the job entry id to identify the failing record. It wraps the underlying database exception, so getCause() holds the real reason.
Solutions
- Check the wrapped KettleDatabaseException (getCause()) for the real database error and fix connectivity/permissions to the repository database.
- Verify the repository schema is up to date (run repository upgrade tools).
- Re-save the job entry from Spoon so attributes are rewritten cleanly.
- If the row is irrecoverably corrupt, delete and recreate the job entry in the repository.
Example fix
// before
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( ... + id_jobentry, dbe );
}
// after
} catch ( KettleDatabaseException dbe ) {
logError( BaseMessages.getString( PKG, "JobEntryMailValidator.Meta.UnableToLoadFromRep" ) + id_jobentry, dbe );
throw new KettleException( ... + id_jobentry + " cause=" + dbe.getMessage(), dbe );
} Defensive patterns
Strategy: try-catch
Validate before calling
// Before loadRep: verify repository connectivity
if ( repository == null || !repository.isConnected() ) {
throw new KettleException( "Repository not connected; cannot load JobEntryMailValidator " + id_jobentry );
} Try / catch
try {
jobEntry.loadRep( rep, id_jobentry, databases, metaStore );
} catch ( KettleException e ) {
// inspect e.getCause() (KettleDatabaseException) for the DB-level reason
logError( "Failed to load mail validator job entry " + id_jobentry, e );
throw e;
} Prevention
- Keep the repository schema upgraded to match the Pentaho version.
- Monitor repository database health before batch-loading jobs.
- Avoid hand-editing repository tables.
- Wrap loadRep in retry logic for transient connection failures.
When it happens
Trigger: Calling loadRep() on a job entry whose repository row is corrupted, whose attributes column contains values incompatible with the expected types, or when the underlying repository database connection fails mid-read.
Common situations: Repository database is down or network-partitioned; the kettle repository schema is from an older/newer version missing attribute columns; the job entry row was manually edited or corrupted; permission problems on the repository tables.
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
- JobEntryCheckFilesLocked.UnableToLoadFromRepo
- JobEntryCheckFilesLocked.UnableToSaveToRepo
- JobEntryColumnsExist.Meta.UnableLoadRep
- JobEntryColumnsExist.Meta.UnableSaveRep
- JobEntryEval.UnableToLoadFromRepo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/cf933e446f0e6f66.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/mail-validator/impl/src/main/java/org/pentaho/di/job/entries/mailvalidator/JobEntryMailValidator.java:183
emailSender = XMLHandler.getTagValue( entrynode, "emailSender" );
emailAddress = XMLHandler.getTagValue( entrynode, "emailAddress" );
} catch ( Exception e ) {
throw new KettleXMLException(
BaseMessages.getString( PKG, "JobEntryMailValidator.Meta.UnableToLoadFromXML" ), e );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
smtpCheck = rep.getJobEntryAttributeBoolean( id_jobentry, "smtpCheck" );
timeout = rep.getJobEntryAttributeString( id_jobentry, "timeout" );
defaultSMTP = rep.getJobEntryAttributeString( id_jobentry, "defaultSMTP" );
emailSender = rep.getJobEntryAttributeString( id_jobentry, "emailSender" );
emailAddress = rep.getJobEntryAttributeString( id_jobentry, "emailAddress" );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "JobEntryMailValidator.Meta.UnableToLoadFromRep" )
+ id_jobentry, dbe );
}
}
// Save the attributes of this job entry
//
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "smtpCheck", smtpCheck );
rep.saveJobEntryAttribute( id_job, getObjectId(), "timeout", timeout );
rep.saveJobEntryAttribute( id_job, getObjectId(), "defaultSMTP", defaultSMTP );
rep.saveJobEntryAttribute( id_job, getObjectId(), "emailSender", emailSender );
rep.saveJobEntryAttribute( id_job, getObjectId(), "emailAddress", emailAddress );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "JobEntryMailValidator.Meta.UnableToSaveToRep" )
+ id_job, dbe );
}
}View on GitHub (pinned to f3058517a1)