pentaho/pentaho-kettle · error · KettleException
ChangeFileEncodingMeta.Exception.UnableToSaveStepInfo
ChangeFileEncodingMeta.Exception.UnableToSaveStepInfo
Error message
ChangeFileEncodingMeta.Exception.UnableToSaveStepInfo
What it means
ChangeFileEncodingMeta.saveRep() wraps repository writes of the step's attributes in a try/catch and rethrows as KettleException with this message (plus the step id appended) when saving the transformation fails at this step. The failing step's ObjectId is embedded in the message.
Solutions
- Check the chained cause for the concrete SQL/database error.
- Verify the repository user has write permissions and the database is not read-only.
- Retry saving; if connection timeouts persist, increase the connection pool/timeout settings.
- Save the transformation locally (.ktr) as a workaround while fixing repository access.
Example fix
// before: saving without checking connection
rep.save(transMeta, "desc", null, true);
// after: ensure connection
if ( !rep.isConnected() ) { rep.connect(); }
rep.save(transMeta, "desc", null, true); Defensive patterns
Strategy: try-catch
Validate before calling
// Ensure repository is writable before saving
if ( !rep.isConnected() || rep.isReadOnly() ) { throw new IllegalStateException( "Repository not writable" ); } Try / catch
try {
rep.save( transMeta, "desc", null, true );
} catch ( KettleException e ) {
if ( e.getMessage().contains( "UnableToSaveStepInfo" ) ) {
log.error( "Save failed for step {}: {}", e.getCause(), e.getMessage() );
} else { throw e; }
} Prevention
- Grant repository users write permissions on target directories of the repository.
- Watch database disk quotas and connection timeouts for scheduled saves.
- Save locally as fallback when repository access is degraded.
When it happens
Trigger: In saveRep: rep.saveStepAttribute calls throw — database write failure, connection dropped, read-only repository, or constraint violation in r_step_attribute.
Common situations: Repository database is read-only or disk quota exceeded; connection timeout on large transformations; permission denied on the repository for the current user.
Related errors
- ChangeFileEncodingMeta.Exception.UnexpectedErrorReadingStepInfo
- Unexpected error reading step information from the…
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/8314b3679fcf83bb.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/changefileencoding/ChangeFileEncodingMeta.java:228
throw new KettleException(
BaseMessages.getString( PKG, "ChangeFileEncodingMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "filenamefield", filenamefield );
rep.saveStepAttribute( id_transformation, id_step, "targetfilenamefield", targetfilenamefield );
rep.saveStepAttribute( id_transformation, id_step, "sourceencoding", sourceencoding );
rep.saveStepAttribute( id_transformation, id_step, "targetencoding", targetencoding );
rep.saveStepAttribute( id_transformation, id_step, "addsourceresultfilenames", addsourceresultfilenames );
rep.saveStepAttribute( id_transformation, id_step, "addtargetresultfilenames", addtargetresultfilenames );
rep.saveStepAttribute( id_transformation, id_step, "createparentfolder", createparentfolder );
} catch ( Exception e ) {
throw new KettleException(
BaseMessages.getString( PKG, "ChangeFileEncodingMeta.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;
String error_message = "";
if ( Utils.isEmpty( filenamefield ) ) {
error_message = BaseMessages.getString( PKG, "ChangeFileEncodingMeta.CheckResult.FileFieldMissing" );
cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
remarks.add( cr );
} else {
error_message = BaseMessages.getString( PKG, "ChangeFileEncodingMeta.CheckResult.FileFieldOK" );
cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );
remarks.add( cr );View on GitHub (pinned to f3058517a1)