pentaho/pentaho-kettle · error · KettleException

CloneRowMeta.Exception.UnexpectedErrorSavingStepInfo

Error message

CloneRowMeta.Exception.UnexpectedErrorSavingStepInfo

What it means

CloneRowMeta.saveRep persists the Clone Row step's settings to the Pentaho Repository via saveStepAttribute calls. If any repository write fails, the catch block rethrows as a KettleException with this message. It indicates the step metadata could not be saved.

Solutions

  1. Check repository DB connectivity and user write privileges
  2. Verify database disk space and that tables are not read-only
  3. Retry saving; if it persists, save as XML file instead
  4. Inspect repository DB error logs for the underlying failure
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: verify repository is writable before save
if (repository.isReadOnly()) throw new IllegalStateException("Repository is read-only");

Try / catch

try {
  transMeta.save(rep, metaStore, comment);
} catch (KettleException e) {
  log.error("Step save failed; exporting to XML fallback", e);
  transMeta.exportResources();
}

Prevention

When it happens

Trigger: Saving a transformation to the repository when rep.saveStepAttribute throws — repository DB write failure, constraint violation, or read-only connection.

Common situations: Repository database disk full or read-only, transaction rollback on save, insufficient DB user privileges to insert into R_STEP_ATTRIBUTE.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/bf4d6d553aa71c3a. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/clonerow/CloneRowMeta.java:222

      throw new KettleException( BaseMessages.getString(
        PKG, "CloneRowMeta.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, "nrclones", nrclones );
      rep.saveStepAttribute( id_transformation, id_step, "addcloneflag", addcloneflag );
      rep.saveStepAttribute( id_transformation, id_step, "cloneflagfield", cloneflagfield );
      rep.saveStepAttribute( id_transformation, id_step, "nrcloneinfield", nrcloneinfield );
      rep.saveStepAttribute( id_transformation, id_step, "nrclonefield", nrclonefield );
      rep.saveStepAttribute( id_transformation, id_step, "addclonenum", addclonenum );

      rep.saveStepAttribute( id_transformation, id_step, "clonenumfield", clonenumfield );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "CloneRowMeta.Exception.UnexpectedErrorSavingStepInfo" ), e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
                         VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Output field (boolean) ?
    if ( addcloneflag ) {
      String realfieldValue = space.environmentSubstitute( cloneflagfield );
      if ( !Utils.isEmpty( realfieldValue ) ) {
        ValueMetaInterface v = new ValueMetaBoolean( realfieldValue );
        v.setOrigin( origin );
        rowMeta.addValueMeta( v );
      }
    }
    // Output clone row number
    if ( addclonenum ) {

View on GitHub (pinned to f3058517a1)