pentaho/pentaho-kettle · error · KettleException
DenormaliserMeta.Exception.UnableToSaveStepInfo
DenormaliserMeta.Exception.UnableToSaveStepInfo
Error message
DenormaliserMeta.Exception.UnableToSaveStepInfo
What it means
DenormaliserMeta.saveRep wraps any exception thrown while saving this step's settings to a Kettle repository into a KettleException with the localized message 'DenormaliserMeta.Exception.UnableToSaveStepInfo' plus the step id. The original failure (typically a repository write error) is chained as the cause.
Solutions
- Inspect the chained cause for the underlying database/repository error
- Verify the repository is writable and has free space
- Re-save after re-establishing repository connection
- Check r_step_attribute table constraints and size limits for the failing values
Example fix
// before
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.Exception.UnableToSaveStepInfo" ) + id_step, e );
}
// after: log full cause before rethrowing
} catch ( Exception e ) {
logError( "Unable to save Denormaliser step " + id_step, e );
throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.Exception.UnableToSaveStepInfo" ) + id_step, e );
} Defensive patterns
Strategy: try-catch
Validate before calling
// before saving, verify repository is connected and writable
if ( repository == null || !repository.isConnected() ) {
throw new KettleException("Repository not connected; cannot save transformation");
} Try / catch
try {
repository.save(transMeta, versionComment, null, metaStore);
} catch (KettleException e) {
if (e.getMessage() != null && e.getMessage().contains("UnableToSaveStepInfo") || e.getCause() != null) {
log.error("Save failed for Denormaliser step; cause: " + e.getCause(), e);
}
throw e;
} Prevention
- Verify repository write access and disk space before bulk saves
- Avoid hand-editing transformation metadata before saving
- Save incrementally to isolate which step fails
- Log the chained cause, not just the wrapper message
When it happens
Trigger: Calling TransMeta.saveRep / repository save of a transformation containing a Denormaliser step when saveStepAttribute fails: repository connection lost, database read-only, constraint violation, or oversized attribute values.
Common situations: Repository database read-only or disk full; saving transformations across incompatible Pentaho versions; network interruption during save; invalid characters in field configuration.
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/c5c46fbf48536fd4.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/denormaliser/DenormaliserMeta.java:361
rep.saveStepAttribute( id_transformation, id_step, i, "field_name", field.getFieldName() );
rep.saveStepAttribute( id_transformation, id_step, i, "key_value", field.getKeyValue() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_name", field.getTargetName() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_type", field.getTargetTypeDesc() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_format", field.getTargetFormat() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_length", field.getTargetLength() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_precision", field.getTargetPrecision() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_decimal_symbol", field
.getTargetDecimalSymbol() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_grouping_symbol", field
.getTargetGroupingSymbol() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_currency_symbol", field
.getTargetCurrencySymbol() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_null_string", field.getTargetNullString() );
rep.saveStepAttribute( id_transformation, id_step, i, "target_aggregation_type", field
.getTargetAggregationTypeDesc() );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "DenormaliserMeta.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 ( input.length > 0 ) {
cr =
new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
PKG, "DenormaliserMeta.CheckResult.ReceivingInfoFromOtherSteps" ), stepMeta );
remarks.add( cr );
} else {
cr =
new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(
PKG, "DenormaliserMeta.CheckResult.NoInputReceived" ), stepMeta );View on GitHub (pinned to f3058517a1)