pentaho/pentaho-kettle · error · KettleException

CubeInputMeta.Exception.UnableToSaveStepInfo

CubeInputMeta.Exception.UnableToSaveStepInfo

Error message

CubeInputMeta.Exception.UnableToSaveStepInfo

What it means

CubeInputMeta.saveRep persists the Cube Input step's settings (file_name, limit, addfilenameresult) as step attributes in the Pentaho repository. If any rep.saveStepAttribute call throws a KettleException (e.g. repository connection lost, DB constraint, permission failure), it is wrapped in a KettleException prefixed with 'CubeInputMeta.Exception.UnableToSaveStepInfo' plus the step id. It indicates the step's metadata could not be saved to the repository.

Solutions

  1. Verify repository connectivity (reconnect/test the repository connection) and retry saving the transformation.
  2. Check the repository user has write permission on the target transformation/folder.
  3. Inspect the wrapped cause (KettleException e) in the stack trace for the underlying repository/SQL error and fix that.
  4. If the repository schema is outdated, run the repository upgrade scripts to match the PDI version.
  5. As a workaround, save the transformation as a local XML file instead of the repository.

Example fix

// before: saving silently to a possibly stale repository connection
transMeta.saveRep(rep, metaStore, transId, null);
// after: validate the connection first and handle failure
if (!rep.isConnected() && !rep.connect()) {
  throw new KettleException("Repository unavailable; fix connection before saving");
}
try {
  transMeta.saveRep(rep, metaStore, transId, null);
} catch (KettleException e) {
  logError("Unable to save step info: " + e.getCause().getMessage(), e);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (rep == null || !rep.isConnected()) { throw new KettleException("Repository not connected; cannot save Cube Input step"); }

Try / catch

try { cubeInputMeta.saveRep(rep, metaStore, transId, stepId); } catch (KettleException e) { Throwable cause = e.getCause(); logError("Cube Input save failed: " + (cause != null ? cause.getMessage() : e.getMessage()), e); if (!rep.isConnected()) rep.connect(); }

Prevention

When it happens

Trigger: Calling saveRep (directly or by saving a transformation containing a Cube Input step) while the Repository's saveStepAttribute fails: repository DB down/disconnected, insufficient write permission on the transformation, corrupted repository schema, or attribute value rejected by the underlying storage.

Common situations: Saving a ktr to a database repository that lost connectivity mid-save; read-only repository user; repository upgrade mismatch between PDI client and repository schema; network blip on a remote repo.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/3e30f1562fa8aa82. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/cubeinput/CubeInputMeta.java:229

        rowLimit = String.valueOf( rep.getStepAttributeInteger( id_step, "limit" ) );
      }
      addfilenameresult = rep.getStepAttributeBoolean( id_step, "addfilenameresult" );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "CubeInputMeta.Exception.UnexpectedErrorWhileReadingStepInfo" ), e );
    }
  }

  @Override public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
    throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "file_name", filename );
      rep.saveStepAttribute( id_transformation, id_step, "limit", rowLimit );
      rep.saveStepAttribute( id_transformation, id_step, "addfilenameresult", addfilenameresult );

    } catch ( KettleException e ) {
      throw new KettleException( BaseMessages.getString( PKG, "CubeInputMeta.Exception.UnableToSaveStepInfo" )
        + 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 ) {
    CheckResult cr;

    cr =
      new CheckResult( CheckResult.TYPE_RESULT_COMMENT, BaseMessages.getString(
        PKG, "CubeInputMeta.CheckResult.FileSpecificationsNotChecked" ), stepMeta );
    remarks.add( cr );
  }

  @Override public StepInterface getStep( StepMeta stepMeta, StepDataInterface stepDataInterface, int cnr, TransMeta tr,
                                          Trans trans ) {
    return new CubeInput( stepMeta, stepDataInterface, cnr, tr, trans );

View on GitHub (pinned to f3058517a1)