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
- Verify repository connectivity (reconnect/test the repository connection) and retry saving the transformation.
- Check the repository user has write permission on the target transformation/folder.
- Inspect the wrapped cause (KettleException e) in the stack trace for the underlying repository/SQL error and fix that.
- If the repository schema is outdated, run the repository upgrade scripts to match the PDI version.
- 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
- Test the repository connection before long editing sessions and before saving.
- Use a repository account with write privileges on the target folder.
- Keep the PDI client and repository schema versions in sync.
- Save to local XML as a checkpoint before repository saves.
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
- CubeOutputMeta.Exception.UnableToSaveStepInfo
- CubeOutputMeta.Exception.UnexpectedErrorInReadingStepInfo
- DelayMeta.Exception.UnexpectedErrorReadingStepInfo
- DelayMeta.Exception.UnexpectedErrorSavingStepInfo
- DenormaliserMeta.Exception.UnableToSaveStepInfo
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)