pentaho/pentaho-kettle · error · KettleException
Unable to save step information to the repository for…
Error message
Unable to save step information to the repository for id_step= + id_step
What it means
SecretKeyGeneratorMeta.saveRep throws KettleException with this message when saving the step's attributes to the repository fails via rep.saveStepAttribute calls. The id_step is included in the message for locating the failing row.
Solutions
- Check the wrapped cause for the JDBC error and fix connectivity/permissions
- Reconnect to the repository and retry the save
- Verify the R_STEP_ATTRIBUTE table is writable and not full (quota/disk)
- Verify repository schema is up to date for your Pentaho version
Example fix
// before: saving on a possibly stale connection
rep.saveStepAttribute(id_transformation, id_step, "secretKeyFieldName", secretKeyFieldName);
// after: ensure connection is alive first
rep.connect("user", "pass");
rep.saveStepAttribute(id_transformation, id_step, "secretKeyFieldName", secretKeyFieldName); Defensive patterns
Strategy: try-catch
Validate before calling
// before saveRep
if (id_step == null) throw new KettleException("id_step required before saving step attributes"); Try / catch
try { meta.saveRep(rep, metaStore, id_transformation, id_step); } catch (KettleException e) { log.error("Save failed for step " + id_step + ": " + e.getCause(), e); } Prevention
- Reconnect/retry on stale repository connections
- Monitor DB quota and write permissions on R_STEP_ATTRIBUTE
- Save frequently to avoid losing work on connection drops
When it happens
Trigger: Calling saveRep(Repository, IMetaStore, ObjectId id_transformation, ObjectId id_step) when the repository connection drops, id_step is invalid, a constraint is violated, or the repository DB is read-only/full.
Common situations: Saving a transformation to a database repository with a stale connection; DB disk quota exceeded; permission revoked mid-session; saving to a repository created by an incompatible Kettle schema version.
Related errors
- AggregateRowsMeta.Exception.UnableToSaveStepInfo
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
- AnalyticQueryMeta.Exception.UnableToSaveStepInfoToRepository
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b897cdea6f0455d5.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/symmetriccrypto/secretkeygenerator/SecretKeyGeneratorMeta.java:361
throw new KettleException( "Unexpected error reading step information from the repository", e );
}
}
@Override
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
for ( int i = 0; i < algorithm.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "algorithm", algorithm[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "scheme", scheme[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "secretKeyLen", secretKeyLength[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "secretKeyCount", secretKeyCount[i] );
}
rep.saveStepAttribute( id_transformation, id_step, "secretKeyFieldName", secretKeyFieldName );
rep.saveStepAttribute( id_transformation, id_step, "secretKeyLengthFieldName", secretKeyLengthFieldName );
rep.saveStepAttribute( id_transformation, id_step, "algorithmFieldName", algorithmFieldName );
rep.saveStepAttribute( id_transformation, id_step, "outputKeyInBinary", outputKeyInBinary );
} catch ( Exception e ) {
throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
}
}
@Override
public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
Repository repository, IMetaStore metaStore ) {
// See if we have input streams leading to this step!
int nrRemarks = remarks.size();
for ( int i = 0; i < algorithm.length; i++ ) {
int len = Const.toInt( transMeta.environmentSubstitute( getSecretKeyLength()[i] ), -1 );
if ( len < 0 ) {
CheckResult cr =
new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(
PKG, "SecretKeyGeneratorMeta.CheckResult.WrongLen", String.valueOf( i ) ), stepMeta );
remarks.add( cr );
}View on GitHub (pinned to f3058517a1)