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

  1. Check the cause exception for the repository/database error (connection, permissions, constraints) and fix it.
  2. Reconnect to the repository and retry saving the transformation.
  3. Verify the repository user has INSERT/UPDATE rights on R_STEP_ATTRIBUTE.
  4. 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

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


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)