pentaho/pentaho-kettle · error · KettleException

Unable to save job entry of type 'FTPS' to the repository…

Error message

Unable to save job entry of type 'FTPS' to the repository for id_job=

What it means

KettleException thrown by JobEntryFTPSGet.saveRep when saving the job entry's attributes to the repository fails with a KettleDatabaseException. Message includes the id_job it attempted to save under.

Solutions

  1. Check repository database connectivity and that it is not read-only
  2. Verify the repository user has INSERT/UPDATE rights on the attribute tables
  3. Run the repository upgrade tool if PDI/plugin versions changed
  4. Retry saving; inspect the wrapped KettleDatabaseException for the SQL-level cause

Example fix

// before
rep.saveJobEntryAttribute(id_job, id, "connection_type", badCode); // may violate FK
// after
String code = FTPSConnection.getConnectionTypeByCode(connectionType); // validate first
rep.saveJobEntryAttribute(id_job, id, "connection_type", code);
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure repository is writable beforehand
if (!rep.isConnected() || rep.isReadOnly())
  throw new KettleException("Repository unavailable or read-only");

Try / catch

try {
  jobEntry.saveRep(rep, metaStore, id_job);
} catch (KettleException dbe) {
  logError("Repository save failed for id_job=" + id_job + ": " + dbe.getCause(), dbe);
  throw dbe;
}

Prevention

When it happens

Trigger: saveRep when the repository insert/update of attributes (nr_limit, success_condition, connection_type) fails — connection loss, constraint violation, read-only repository, or schema mismatch

Common situations: repository database down or locked; user lacks write permission on the repository; PDI version upgrade left the repository schema outdated; duplicate/invalid attribute rows

Related errors


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

Appendix: source

Thrown at plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java:356

      rep.saveJobEntryAttribute( id_job, getObjectId(), "AddDateBeforeExtension", AddDateBeforeExtension );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "isaddresult", isaddresult );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "createmovefolder", createmovefolder );

      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxy_host", proxyHost );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxy_port", proxyPort );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxy_username", proxyUsername );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxy_password", Encr
        .encryptPasswordIfNotUsingVariables( proxyPassword ) );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "ifFileExists", getFileExistsAction( ifFileExists ) );

      rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_limit", nr_limit );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "connection_type", FTPSConnection
        .getConnectionType( connectionType ) );

    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException(
        "Unable to save job entry of type 'FTPS' to the repository for id_job=" + id_job, dbe );
    }
  }

  public void setLimit( String nr_limitin ) {
    this.nr_limit = nr_limitin;
  }

  public String getLimit() {
    return nr_limit;
  }

  public void setSuccessCondition( String success_condition ) {
    this.success_condition = success_condition;
  }

  public String getSuccessCondition() {
    return success_condition;

View on GitHub (pinned to f3058517a1)