pentaho/pentaho-kettle · error · KettleException
RestMeta.Exception.UnableToSaveStepInfo
RestMeta.Exception.UnableToSaveStepInfo
Error message
RestMeta.Exception.UnableToSaveStepInfo
What it means
RestMeta.saveRep wraps exceptions during saving the step's attributes into a KettleException with this message (note: it concatenates idStep directly). It means the REST step configuration could not be persisted to the Pentaho repository.
Solutions
- Check repository connectivity, permissions, and disk space, then retry saving
- Review the wrapped cause exception for the underlying DB error
- Commit/restart the repository session if a lock is stuck
- If saving locally, export the transformation as XML instead
Defensive patterns
Strategy: try-catch
Try / catch
try {
saveRep(rep, metaStore, idTransformation, idStep);
} catch (KettleException e) {
logError("Repository save failed for step " + idStep + ": " + e.getCause());
// fall back to XML export
} Prevention
- Ensure write permissions and sufficient DB space on the repository
- Avoid concurrent edits of the same transformation
- Export a local XML copy before risky repository saves
When it happens
Trigger: Repository write failure while calling saveStepAttribute — connection loss, read-only repository, constraint violation, or oversized attribute values.
Common situations: Repository database read-only or out of space; user lacks write permission; network drop mid-save; repository lock held by another session.
Related errors
- ERROR_0003_Cannot_Save_Job_Entry
- Error saving job
- GetSequenceMeta.Exception.UnableToSaveStepInfo
- GroupByMeta.Exception.UnableToSaveStepInfoToRepository
- JobEntryWaitForSQL.UnableSaveRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/4d48c85ddcc48581.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/rest/core/src/main/java/org/pentaho/di/trans/steps/rest/RestMeta.java:719
rep.saveStepAttribute( idTransformation, idStep, TAG_PREEMPTIVE, preemptive );
for ( int i = 0; i < headerName.length; i++ ) {
rep.saveStepAttribute( idTransformation, idStep, i, TAG_HEADER_FIELD, headerField[i] );
rep.saveStepAttribute( idTransformation, idStep, i, TAG_HEADER_NAME, headerName[i] );
}
for ( int i = 0; i < parameterField.length; i++ ) {
rep.saveStepAttribute( idTransformation, idStep, i, TAG_PARAMETER_FIELD, parameterField[i] );
rep.saveStepAttribute( idTransformation, idStep, i, TAG_PARAMETER_NAME, parameterName[i] );
}
for ( int i = 0; i < matrixParameterField.length; i++ ) {
rep.saveStepAttribute( idTransformation, idStep, i, TAG_MATRIX_PARAMETER_FIELD, matrixParameterField[i] );
rep.saveStepAttribute( idTransformation, idStep, i, TAG_MATRIX_PARAMETER_NAME, matrixParameterName[i] );
}
rep.saveStepAttribute( idTransformation, idStep, TAG_RESULT_NAME, fieldName );
rep.saveStepAttribute( idTransformation, idStep, TAG_RESULT_CODE, resultCodeFieldName );
rep.saveStepAttribute( idTransformation, idStep, TAG_RESPONSE_TIME, responseTimeFieldName );
rep.saveStepAttribute( idTransformation, idStep, TAG_RESPONSE_HEADER, responseHeaderFieldName );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "RestMeta.Exception.UnableToSaveStepInfo" )
+ idStep, 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 ) {
CheckResult cr;
// See if we have input streams leading to this step!
if ( input.length > 0 ) {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
PKG, "RestMeta.CheckResult.ReceivingInfoFromOtherSteps" ), stepMeta );
} else {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(View on GitHub (pinned to f3058517a1)