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

  1. Check the chained cause for the concrete SQL/database error.
  2. Verify the repository user has write permissions and the database is not read-only.
  3. Retry saving; if connection timeouts persist, increase the connection pool/timeout settings.
  4. 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

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


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)