pentaho/pentaho-kettle · error · KettleException
StringOperationsMeta.Exception.UnableToSaveStepInfo
Error message
StringOperationsMeta.Exception.UnableToSaveStepInfo
What it means
KettleException thrown by StringOperationsMeta.saveRep when saving the String Operations step's configuration to a Pentaho repository fails. saveRep writes per-row attributes (mask_xml, digits, remove_special_characters, etc.) via rep.saveStepAttribute; any exception in that block is wrapped with this localized message plus the step id and rethrown. The step ObjectId is appended to the message to help locate the failing step.
Solutions
- Check the chained cause exception to identify the underlying repository/database failure.
- Verify the repository account has write permission on the transformation folder.
- Test repository connectivity and retry the save after restoring the connection.
- Shorten or sanitize step attribute values (e.g., large mask XML) if the repository column limits are being hit.
Defensive patterns
Strategy: try-catch
Validate before calling
// before save: ensure repository is writable if ( !repository.getSecurityProvider().hasAccess( ..., PermissionType.MODIFY ) ) throw ...
Try / catch
try { meta.saveRep( rep, metaStore, idTrans, idStep ); } catch ( KettleException e ) { log.error( "saveRep failed for step " + idStep + ": " + e.getCause(), e ); throw e; } Prevention
- Save with an account that has modify rights.
- Avoid oversized/odd attribute values.
- Retry saves after transient DB failures.
- Watch repository storage quotas/column limits.
When it happens
Trigger: Calling saveRep (transformation save) when the repository write fails: connection loss mid-save, database constraint violation, insufficient write permissions, or a null/oversized attribute value passed to saveStepAttribute.
Common situations: Saving a transformation to a read-only repository or without edit rights; DBA-enforced column size limits truncating long mask XML; intermittent database connectivity during save; concurrent edits locking repository rows.
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
- FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository
- SwitchCaseMeta.Exception.UnableToSaveStepInfoToRepository
- Unable to save step information to the repository for…
- AppendMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/e42e7b5f9b2d4db6.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/stringoperations/StringOperationsMeta.java:516
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
for ( int i = 0; i < fieldInStream.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "in_stream_name", fieldInStream[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "out_stream_name", fieldOutStream[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "trim_type", trimType[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "lower_upper", lowerUpper[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "padding_type", padding_type[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "pad_char", padChar[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "pad_len", padLen[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "init_cap", initCap[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "mask_xml", maskXML[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "digits", digits[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "remove_special_characters", remove_special_characters[i] );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "StringOperationsMeta.Exception.UnableToSaveStepInfo" )
+ id_step, e );
}
}
@Override
public void getFields( Bowl bowl, RowMetaInterface inputRowMeta, String name, RowMetaInterface[] info,
StepMeta nextStep, VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
// Add new field?
for ( int i = 0; i < fieldOutStream.length; i++ ) {
ValueMetaInterface v;
String outputField = space.environmentSubstitute( fieldOutStream[i] );
if ( !Utils.isEmpty( outputField ) ) {
// Add a new field
v = new ValueMetaString( outputField );
v.setLength( 100, -1 );
v.setOrigin( name );
inputRowMeta.addValueMeta( v );View on GitHub (pinned to f3058517a1)