pentaho/pentaho-kettle · error · KettleException

LDAPOutputMeta.Exception.ErrorSavingToRepository

LDAPOutputMeta.Exception.ErrorSavingToRepository

Error message

LDAPOutputMeta.Exception.ErrorSavingToRepository

What it means

LDAPOutputMeta.saveRep wraps persistence of the step settings in try/catch and rethrows as KettleException with Exception.ErrorSavingToRepository (including the step id). Any rep.saveStepAttribute failure while saving the transformation raises this.

Solutions

  1. Test and restore the repository DB connection, then retry the save
  2. Check the repository user's privileges on the R_* repository tables
  3. Check DB disk space and table size limits for long attribute values
  4. Save locally as .ktr as a workaround and re-publish later

Example fix

// before: save without checking connection state
rep.saveStepAttribute(id_transformation, id_step, "useCertificate", useCertificate);
// after: reconnect and retry
if (!rep.isConnected()) { rep.connect(); }
rep.saveStepAttribute(id_transformation, id_step, "useCertificate", useCertificate);
Defensive patterns

Strategy: try-catch

Validate before calling

// Check write access before saving
if (!rep.isConnected() || rep.isReadOnly()) {
  throw new KettleException("Repository not writable");
}

Try / catch

try {
  transMeta.saveRep(rep, metaStore, transMeta.getObjectId());
} catch (KettleException e) {
  logError("Repository save failed for step " + e.getMessage(), e);
  // save to local .ktr as fallback
}

Prevention

When it happens

Trigger: Saving a transformation containing LDAP Output to a repository when the database write fails: connection lost, insufficient privileges, read-only repository, or constraint/size violation on an attribute value.

Common situations: Repository DB out of space or locked; user lacks INSERT/UPDATE rights on repository tables; network drop between Spoon and repository DB during save; saving to a deprecated repository type.

Related errors


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

Appendix: source

Thrown at plugins/ldap/impl/src/main/java/org/pentaho/di/trans/steps/ldapoutput/LDAPOutputMeta.java:858

      rep.saveStepAttribute( id_transformation, id_step, "oldDnFieldName", oldDnFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "newDnFieldName", newDnFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "deleteRDN", deleteRDN );

      for ( int i = 0; i < updateLookup.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", updateLookup[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_attribut", updateStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "value_update", update[i].booleanValue() );

      }
      rep.saveStepAttribute( id_transformation, id_step, "protocol", protocol );
      rep.saveStepAttribute( id_transformation, id_step, "trustStorePath", trustStorePath );
      rep.saveStepAttribute( id_transformation, id_step, "trustStorePassword", Encr
        .encryptPasswordIfNotUsingVariables( trustStorePassword ) );
      rep.saveStepAttribute( id_transformation, id_step, "trustAllCertificates", trustAllCertificates );
      rep.saveStepAttribute( id_transformation, id_step, "useCertificate", useCertificate );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "LDAPOutputMeta.Exception.ErrorSavingToRepository", "" + 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;

    // See if we get input...
    if ( input.length > 0 ) {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "LDAPOutputMeta.CheckResult.NoInputExpected" ), stepMeta );
    } else {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(

View on GitHub (pinned to f3058517a1)