pentaho/pentaho-kettle · error · KettleException

JobEntryFTPS.SuccesConditionBroken

JobEntryFTPS.SuccesConditionBroken

Error message

JobEntryFTPS.SuccesConditionBroken

What it means

JobEntryFTPSGet throws this KettleException when the entry's success-condition logic has flagged too many errors (successConditionBroken) while iterating the file list. The entry tracks error count (NrErrors) against configured limits (e.g., 'success if no errors', 'success if error count less than N', or a percentage); once the limit is crossed, further file processing is aborted with this message. The text comes from the JobEntryFTPS.SuccesConditionBroken message key with the error count as a parameter.

Solutions

  1. Fix the underlying per-file failures logged as NrErrors (check remote file permissions, existence, and FTPS connectivity).
  2. Relax the success condition in the job entry settings (e.g., change from 'success if no errors' to a higher error limit) if partial success is acceptable.
  3. Add a filter/wildcard so the file list only contains files the job can actually process.

Example fix

// before: any single file error aborts the entry
entry.setSuccessCondition( JobEntryFTPSGet.SUCCESS_IF_NO_ERRORS );
// after: tolerate up to N errors
entry.setSuccessCondition( JobEntryFTPSGet.SUCCESS_IF_ERRORS_LESS );
entry.setNrErrorsLimit( "5" );
Defensive patterns

Strategy: validation

Validate before calling

// validate entry config before executing
if ( JobEntryFTPSGet.SUCCESS_IF_ERRORS_LESS.equals( entry.getSuccessCondition() )
     && ( entry.getNrErrorsLimit() == null || Integer.parseInt( entry.getNrErrorsLimit() ) <= 0 ) ) {
  throw new IllegalArgumentException( "nr_errors_limit must be > 0 for SUCCESS_IF_ERRORS_LESS" );
}

Try / catch

try {
  jobEntry.execute( result, context );
} catch ( KettleException e ) {
  if ( e.getMessage() != null && e.getMessage().contains( "SuccesConditionBroken" ) ) {
    log.warn( "FTPS get aborted after error threshold; check per-file failures in logs" );
    result.setResult( false );
  } else { throw e; }
}

Prevention

When it happens

Trigger: Executing JobEntryFTPSGet where individual file downloads fail (missing remote files, permission errors, connection drops), incrementing NrErrors past the configured success-condition threshold; the next loop iteration at the successConditionBroken check throws.

Common situations: Remote directories containing files the FTPS account cannot read; transient network drops mid-batch; misconfigured success_condition / nr_errors_limit in the job entry dialog so a single failure trips the limit.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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

Appendix: source

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

    return result;
  }

  private void downloadFiles( FTPSConnection connection, String folder, Pattern pattern, Result result )
    throws KettleException {

    List<FTPFile> fileList = connection.getFileList( folder );
    if ( isDetailed() ) {
      logDetailed( BaseMessages.getString( PKG, "JobEntryFTPS.FoundNFiles", fileList.size() ) );
    }

    for ( int i = 0; i < fileList.size(); i++ ) {

      if ( parentJob.isStopped() ) {
        throw new KettleException( BaseMessages.getString( PKG, "JobEntryFTPS.JobStopped" ) );
      }

      if ( successConditionBroken ) {
        throw new KettleException( BaseMessages.getString( PKG, "JobEntryFTPS.SuccesConditionBroken", NrErrors ) );
      }

      FTPFile file = fileList.get( i );
      if ( isDetailed() ) {
        logDetailed( BaseMessages.getString(
          PKG, "JobEntryFTPS.AnalysingFile", file.getPath(), file.getName(), file.getMode(), file
            .getDate().toString(), file.getFileType() == 0 ? "File" : "Folder", String
            .valueOf( file.getSize() ) ) );
      }

      if ( !file.isDirectory() && !file.isLink() ) {
        // download file
        boolean getIt = true;
        if ( getIt ) {
          try {
            // See if the file matches the regular expression!
            if ( pattern != null ) {
              Matcher matcher = pattern.matcher( file.getName() );

View on GitHub (pinned to f3058517a1)