pentaho/pentaho-kettle · error · KettleException

JobDosToUnix.Error.Exception.UnableSaveRep

Error message

JobDosToUnix.Error.Exception.UnableSaveRep

What it means

Thrown when saving a 'DOS to Unix' job entry's attributes (including ConversionType codes) to the repository fails. saveRep() wraps the KettleDatabaseException in a KettleException with this message plus the job id and the cause chained. The entry's metadata was not persisted.

Solutions

  1. Read the chained KettleDatabaseException cause for the concrete SQL error
  2. Confirm repository tables exist and are up to date (run upgrade scripts)
  3. Grant the repository user write privileges on repository tables
  4. Retry the save after resolving DB connectivity/locks

Example fix

// before
entry.saveRep(rep, metaStore, idJob); // throws with message + id only
// after
try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("UnableSaveRep job " + idJob + " cause: " + e.getCause());
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (rep instanceof KettleDatabaseRepository
    && !((KettleDatabaseRepository) rep).isConnected()) {
  throw new IllegalStateException("Repository not connected; save aborted");
}

Try / catch

try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("UnableSaveRep job=" + idJob + " cause=" + e.getCause());
  throw e;
}

Prevention

When it happens

Trigger: Calling saveRep() (via JobMeta.save) when rep.saveJobEntryAttribute() throws: DB down, table locked/missing, write permission denied, or value overflow mid-loop.

Common situations: Repository database outage during save; schema not installed/upgraded; DB user lacking INSERT/UPDATE grants; concurrent saves causing lock timeouts.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/dostounix/JobEntryDosToUnix.java:296

    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "arg_from_previous", arg_from_previous );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", include_subfolders );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_errors_less_than", nr_errors_less_than );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "resultfilenames", resultfilenames );

      // save the arguments...
      if ( source_filefolder != null ) {
        for ( int i = 0; i < source_filefolder.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "source_filefolder", source_filefolder[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "wildcard", wildcard[i] );
          rep.saveJobEntryAttribute(
            id_job, getObjectId(), "ConversionType", getConversionTypeCode( conversionTypes[i] ) );
        }
      }
    } catch ( KettleDatabaseException dbe ) {

      throw new KettleException( BaseMessages.getString( PKG, "JobDosToUnix.Error.Exception.UnableSaveRep" )
        + id_job, dbe );
    }
  }

  public Result execute( Result previousResult, int nr ) throws KettleException {
    Result result = previousResult;
    result.setNrErrors( 1 );
    result.setResult( false );

    List<RowMetaAndData> rows = previousResult.getRows();
    RowMetaAndData resultRow = null;

    nrErrors = 0;
    nrProcessedFiles = 0;
    nrErrorFiles = 0;
    limitFiles = Const.toInt( environmentSubstitute( getNrErrorsLessThan() ), 10 );
    successConditionBroken = false;
    successConditionBrokenExit = false;

View on GitHub (pinned to f3058517a1)