pentaho/pentaho-kettle · error · KettleException
AbortMeta.Exception.UnableToSaveStepInfoToRepository
Error message
AbortMeta.Exception.UnableToSaveStepInfoToRepository
What it means
AbortMeta.saveRep throws KettleException with this message when saving the Abort step's attributes (row_threshold, message, always_log_rows, abort_option) to the repository fails. The id_step is appended to the message for locating the failing record.
Solutions
- Check the wrapped cause for the SQL error and repair repository connectivity/privileges.
- Ensure abortOption is non-null before saveRep (initialize to a default in the step's default constructor).
- Verify DB disk space and that the repository user can write to R_STEP_ATTRIBUTE.
- Retry the save once the repository is healthy.
Example fix
// before rep.saveStepAttribute( id_transformation, id_step, "abort_option", abortOption.toString() ); // after rep.saveStepAttribute( id_transformation, id_step, "abort_option", abortOption != null ? abortOption.toString() : AbortOption.ABORT.toString() );
Defensive patterns
Strategy: validation
Validate before calling
// ensure abortOption is initialized before saving
if ( meta.getAbortOption() == null ) { meta.setAbortOption( AbortOption.ABORT ); } Try / catch
try { meta.saveRep( rep, metaStore, id_transformation, id_step ); } catch ( KettleException e ) { logError( "saveRep failed for step " + id_step + ": " + e.getMessage(), e ); } Prevention
- Always construct AbortMeta with a non-null abortOption.
- Ensure repository DB has free space and the user has write grants.
- Serialize saves of the same transformation to avoid lock contention.
When it happens
Trigger: rep.saveStepAttribute throwing on DB failure: connection loss, constraint violation, null abortOption (toString on null), or insufficient write privileges.
Common situations: Repository offline during save, abortOption field never initialized (null NPE wrapped as this error), DB out of space, concurrent edits locking rows.
Related errors
- ERROR_0003_Cannot_Save_Job_Entry
- JobEntryAddResultFilenames.UnableToSaveToRepo
- Edi2Xml.Exception.UnableToSaveStepInfoToRepository
- ERROR_0002_Cannot_Load_Job_From_Repository
- ERROR_0002
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bb465bc3f170c870.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/abort/AbortMeta.java:176
// Backward compatibility
// existing transformations will have to maintain backward compatibility with yes
boolean abortWithError = rep.getStepAttributeBoolean( id_step, 0, "abort_with_error", true );
abortOption = abortWithError ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepository" ), e );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "row_threshold", rowThreshold );
rep.saveStepAttribute( id_transformation, id_step, "message", message );
rep.saveStepAttribute( id_transformation, id_step, "always_log_rows", alwaysLogRows );
rep.saveStepAttribute( id_transformation, id_step, "abort_option", abortOption.toString() );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "AbortMeta.Exception.UnableToSaveStepInfoToRepository" )
+ id_step, e );
}
}
public String getMessage() {
return message;
}
public void setMessage( String message ) {
this.message = message;
}
public String getRowThreshold() {
return rowThreshold;
}
public void setRowThreshold( String rowThreshold ) {View on GitHub (pinned to f3058517a1)