pentaho/pentaho-kettle · error · KettleException
MappingInputMeta.Exception.UnableToSaveStepInfo
MappingInputMeta.Exception.UnableToSaveStepInfo
Error message
MappingInputMeta.Exception.UnableToSaveStepInfo
What it means
MappingInputMeta.saveRep() wraps any exception raised while persisting the step's attributes (field definitions and the select_unspecified flag) to the repository, rethrowing as a KettleException with this message key. It means the step's configuration could not be saved and the transformation in the repository is incomplete or not updated. The cause holds the real repository error.
Solutions
- Check the cause exception for the repository/database error (connection, permissions, constraints) and fix it.
- Reconnect to the repository and retry saving the transformation.
- Verify the repository user has INSERT/UPDATE rights on R_STEP_ATTRIBUTE.
- If the repository is read-only (e.g. a shared prod repo), save the transformation to a local file instead.
Example fix
// before: blind save
meta.saveRep(repository, metastore, transMeta.getObjectId(), stepMeta.getObjectId());
// after: check write access first
if (!repository.getConnection().isReadOnly()) {
meta.saveRep(repository, metastore, transMeta.getObjectId(), stepMeta.getObjectId());
} else {
throw new KettleException("Repository is read-only; save aborted");
} Defensive patterns
Strategy: try-catch
Validate before calling
if (repository.isReadOnly()) {
throw new IllegalStateException("Repository is read-only; cannot save MappingInput step");
}
if (!repository.isConnected()) {
repository.connect(user, password);
} Type guard
boolean isSavable(Repository rep) {
return rep != null && rep.isConnected() && !rep.isReadOnly();
} Try / catch
try {
meta.saveRep(repository, metastore, transMeta.getObjectId(), stepMeta.getObjectId());
} catch (KettleException e) {
logError("MappingInput metadata save failed: " + e.getCause(), e);
throw e;
} Prevention
- Confirm DB credentials have INSERT/UPDATE rights on repository tables.
- Reconnect after long idle periods before saving.
- Avoid saving to shared read-only production repositories.
- Always inspect the chained cause to distinguish connection vs permission vs constraint errors.
When it happens
Trigger: Calling saveRep() when Repository.saveStepAttribute(...) throws — repository connection lost, database in read-only mode, constraint violation, or a null/unexpected attribute value.
Common situations: Saving a transformation while the repository DB went down or the session expired; read-only database credentials; repository disk quota/table permission problems; concurrent edits locking the step metadata.
Understand the failure class
Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.
Related errors
- CubeInputMeta.Exception.UnableToSaveStepInfo
- CubeOutputMeta.Exception.UnableToSaveStepInfo
- CubeOutputMeta.Exception.UnexpectedErrorInReadingStepInfo
- DelayMeta.Exception.UnexpectedErrorReadingStepInfo
- DelayMeta.Exception.UnexpectedErrorSavingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b3109d3998cfb2c2.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/mappinginput/MappingInputMeta.java:374
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
throws KettleException {
try {
for ( int i = 0; i < fieldName.length; i++ ) {
if ( fieldName[ i ] != null && fieldName[ i ].length() != 0 ) {
rep.saveStepAttribute( id_transformation, id_step, i, "field_name", fieldName[ i ] );
rep.saveStepAttribute( id_transformation, id_step, i, "field_type",
ValueMetaFactory.getValueMetaName( fieldType[ i ] ) );
rep.saveStepAttribute( id_transformation, id_step, i, "field_length", fieldLength[ i ] );
rep.saveStepAttribute( id_transformation, id_step, i, "field_precision", fieldPrecision[ i ] );
}
}
rep.saveStepAttribute(
id_transformation, id_step, "select_unspecified", selectingAndSortingUnspecifiedFields );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "MappingInputMeta.Exception.UnableToSaveStepInfo" )
+ id_step, e );
}
}
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;
if ( prev == null || prev.size() == 0 ) {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
PKG, "MappingInputMeta.CheckResult.NotReceivingFieldsError" ), stepMeta );
remarks.add( cr );
} else {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
PKG, "MappingInputMeta.CheckResult.StepReceivingDatasFromPreviousOne", prev.size() + "" ), stepMeta );
remarks.add( cr );View on GitHub (pinned to f3058517a1)