pentaho/pentaho-kettle · error · KettleException

LDIFInputMeta.Exception.ErrorSavingToRepository

LDIFInputMeta.Exception.ErrorSavingToRepository

Error message

LDIFInputMeta.Exception.ErrorSavingToRepository

What it means

LDIFInputMeta.saveRep wraps repository persistence in try/catch and throws KettleException('Error saving step info to repository' + id_step) when any rep.saveStepAttribute call fails. This happens when saving a transformation to a Pentaho Repository and the write of the step's settings fails.

Solutions

  1. Check the repository DB connection and retry the save.
  2. Verify the repository user has write (INSERT/UPDATE) privileges on repository tables.
  3. Check DB server logs/disk space for write failures.
  4. Save the transformation locally as .ktr as a workaround, then re-save once the repository is healthy.

Example fix

// before: silent failure at save time in Spoon
// after: guard before building
if (!rep.getConnection().isValid(5)) {
  throw new KettleException("Repository DB not writable; save locally instead");
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (!rep.getConnection().isValid(5) || !rep.hasWritePermission()) {
  throw new KettleException("Repository not writable; save locally instead");
}

Try / catch

try {
  transMeta.saveRep(rep, metaStore, "my transform", null);
} catch (KettleException e) {
  log.error("Repository save failed; exporting to .ktr as fallback", e);
  transMeta.exportToFile("backup.ktr");
}

Prevention

When it happens

Trigger: Saving a transformation in Spoon to a repository DB where saveStepAttribute fails — DB write error, constraint violation, connection loss, read-only account, or missing id_step.

Common situations: Repository account lacks INSERT/UPDATE permissions; database disk full or tablespace exceeded; connection dropped during save; repository object locked or transformation deleted concurrently.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ldifinput/LDIFInputMeta.java:1023

        rep.saveStepAttribute( id_transformation, id_step, i, "field_decimal", field.getDecimalSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_group", field.getGroupSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_length", field.getLength() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_precision", field.getPrecision() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_trim_type", field.getTrimTypeCode() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_repeat", field.isRepeated() );

      }
      rep.saveStepAttribute( id_transformation, id_step, "shortFileFieldName", shortFileFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "pathFieldName", pathFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "hiddenFieldName", hiddenFieldName );
      rep.saveStepAttribute(
        id_transformation, id_step, "lastModificationTimeFieldName", lastModificationTimeFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "uriNameFieldName", uriNameFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "sizeFieldName", sizeFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "rootUriNameFieldName", rootUriNameFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "extensionFieldName", extensionFieldName );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "LDIFInputMeta.Exception.ErrorSavingToRepository", "" + id_step ), e );
    }
  }

  public FileInputList getFiles( Bowl bowl, VariableSpace space ) {
    return FileInputList.createFileList(
      bowl, space, fileName, fileMask, excludeFileMask, fileRequired, includeSubFolderBoolean() );
  }

  private boolean[] includeSubFolderBoolean() {
    int len = fileName.length;
    boolean[] includeSubFolderBoolean = new boolean[len];
    for ( int i = 0; i < len; i++ ) {
      includeSubFolderBoolean[i] = YES.equalsIgnoreCase( includeSubFolders[i] );
    }
    return includeSubFolderBoolean;
  }

View on GitHub (pinned to f3058517a1)