pentaho/pentaho-kettle · error · KettleException
CubeOutputMeta.Exception.UnableToSaveStepInfo
CubeOutputMeta.Exception.UnableToSaveStepInfo
Error message
CubeOutputMeta.Exception.UnableToSaveStepInfo
What it means
CubeOutputMeta.saveRep persists the Cube Output step's settings (file_name, add_to_result_filenames, do_not_open_newfile_init) via rep.saveStepAttribute. Any KettleException from the repository is wrapped with 'CubeOutputMeta.Exception.UnableToSaveStepInfo' plus the step id. It means the Cube Output step's metadata could not be written to the repository.
Solutions
- Verify repository connectivity and retry the save.
- Check the wrapped cause exception for the exact repository/SQL error.
- Ensure the repository user has write permission on the transformation and step attribute tables.
- Save locally as XML to preserve work, then resolve repository issues before re-saving.
Example fix
// before: single blind save
transMeta.saveRep(rep, metaStore, transId, null);
// after: retry with reconnect on failure
try {
transMeta.saveRep(rep, metaStore, transId, null);
} catch (KettleException e) {
if (!rep.isConnected()) { rep.connect(); }
transMeta.saveRep(rep, metaStore, transId, null);
} Defensive patterns
Strategy: try-catch
Validate before calling
if (rep == null || !rep.isConnected()) { throw new KettleException("Repository not connected; cannot save Cube Output step"); } Try / catch
try { cubeOutputMeta.saveRep(rep, metaStore, transId, stepId); } catch (KettleException e) { logError("Save failed: " + e.getCause().getMessage(), e); // fallback: save as XML
transMeta.setFilename(localBackupPath); transMeta.saveXml(); } Prevention
- Save a local XML copy before writing to the repository.
- Ensure the repository user can write to r_step_attribute.
- Avoid concurrent edits of the same transformation by multiple users.
- Check DB tablespace/size limits before bulk saves.
When it happens
Trigger: saveRep while rep.saveStepAttribute throws: repository connection lost, insufficient write permission, DB constraint violation, or storage failure for the step attribute rows.
Common situations: Saving a ktr to a database repository during a network outage; read-only repository credentials; repository table full or constraint violation after a PDI version upgrade; concurrent edits by another user locking rows.
Related errors
- CubeInputMeta.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/4b39ac7ecd76a674.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/cubeoutput/CubeOutputMeta.java:176
try {
filename = rep.getStepAttributeString( id_step, "file_name" );
addToResultFilenames = rep.getStepAttributeBoolean( id_step, "add_to_result_filenames" );
doNotOpenNewFileInit = rep.getStepAttributeBoolean( id_step, "do_not_open_newfile_init" );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "CubeOutputMeta.Exception.UnexpectedErrorInReadingStepInfo" ), e );
}
}
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, "add_to_result_filenames", addToResultFilenames );
rep.saveStepAttribute( id_transformation, id_step, "do_not_open_newfile_init", doNotOpenNewFileInit );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "CubeOutputMeta.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;
// Check output fields
if ( prev != null && prev.size() > 0 ) {
cr =
new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
PKG, "CubeOutputMeta.CheckResult.ReceivingFields", String.valueOf( prev.size() ) ), stepMeta );
remarks.add( cr );
}
cr =View on GitHub (pinned to f3058517a1)