pentaho/pentaho-kettle · error · KettleException

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

Error message

Unable to save job entry of type 'FTPPUT' to the repository for id_job={0}

What it means

JobEntryFTPPUT.saveRep wraps KettleDatabaseException failures from saveJobEntryAttribute calls and rethrows as 'Unable to save job entry of type FTPPUT to the repository for id_job={0}'. It means persisting this FTP Put entry's settings into the repository failed.

Solutions

  1. Inspect the chained KettleDatabaseException (dbe) for the SQL/DB root cause.
  2. Verify repository database connectivity and that the DB user has INSERT/UPDATE rights on r_jobentry_attribute.
  3. Retry the save after restoring the DB connection; check for lock contention.
  4. Save the job to a file (.kjb) as a workaround while fixing the repository.
Defensive patterns

Strategy: retry

Validate before calling

if ( rep == null || idJob == null ) { throw new IllegalArgumentException("Repository and idJob required before saveRep"); }

Try / catch

try { entry.saveRep(rep, metaStore, idJob); } catch (KettleException e) { log.error("FTPPUT repo save failed for " + idJob, e); /* optionally retry once after reconnect */ }

Prevention

When it happens

Trigger: Calling saveRep when a saveJobEntryAttribute write fails: repository DB unreachable, constraint violation, read-only connection, transaction rollback, or oversized attribute values.

Common situations: Repository database down or network blip during save; insufficient DB user privileges (INSERT/UPDATE); repository locked by another process; disk full on the DB host.

Related errors


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

Appendix: source

Thrown at plugins/put-a-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftpput/JobEntryFTPPUT.java:312

      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_TIMEOUT, timeout );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_REMOVE, remove );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_ONLY_NEW, onlyPuttingNewFiles );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_ACTIVE, activeConnection );
      rep.saveJobEntryAttribute( idJob, getObjectId(), CONTROL_ENCODING, controlEncoding );

      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_PROXY_HOST, proxyHost );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_PROXY_PORT, proxyPort );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_PROXY_USERNAME, proxyUsername );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_PROXY_PASSWORD, Encr
        .encryptPasswordIfNotUsingVariables( proxyPassword ) );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SOCKSPROXY_HOST, socksProxyHost );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SOCKSPROXY_PORT, socksProxyPort );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SOCKSPROXY_USERNAME, socksProxyUsername );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SOCKSPROXY_PASSWORD, Encr
        .encryptPasswordIfNotUsingVariables( socksProxyPassword ) );

    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobFTPPUT.UnableToSaveToRepo", String
        .valueOf( idJob ) ), dbe );
    }
  }

  /**
   * @return Returns the binaryMode.
   */
  public boolean isBinaryMode() {
    return binaryMode;
  }

  /**
   * @param binaryMode The binaryMode to set.
   */
  public void setBinaryMode( boolean binaryMode ) {
    this.binaryMode = binaryMode;
  }

View on GitHub (pinned to f3058517a1)