pentaho/pentaho-kettle · error · KettleException

PropertyInputMeta.Exception.ErrorSavingToRepository

Error message

PropertyInputMeta.Exception.ErrorSavingToRepository

What it means

This KettleException wraps any failure that occurs while persisting the 'Get File Names' (PropertyInput) step's settings to the Kettle repository. PropertyInputMeta.saveRep() saves each step attribute (file names, masks, field definitions, extra field names) via rep.saveStepAttribute(); any Exception from those repository writes is caught and rethrown as this error with the failing step id in the message and the original cause chained. It means the step definition could not be saved, so the transformation metadata in the repository is incomplete or stale.

Solutions

  1. Check connectivity to the repository database and retry the transformation save.
  2. Verify the repository DB user has INSERT/UPDATE privileges on R_STEP_ATTRIBUTE and related tables.
  3. Inspect the chained cause (KettleException.getCause()) for the actual repository error and fix it.
  4. If using a file repository, confirm the file/directory is writable and not locked.
  5. Test the repository connection in Spoon (Tools > Repository > Connect) and re-login if the session expired.

Example fix

// before
try (Connection c = DriverManager.getConnection(url)) { // connection dropped mid-save
  transMeta.saveRep(rep, null, null, "MyTrans");
}
// after
// ensure repo reachable and retry with a fresh connection, and log the root cause
try {
  transMeta.saveRep(rep, null, null, "MyTrans");
} catch (KettleException e) {
  logError("Step save failed: " + e.getCause()); // inspect root cause, not just the wrapper
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before saving
if (rep != null && rep.isConnected()) {
  transMeta.saveRep(rep, null, null, transName);
} else {
  throw new KettleException("Repository not connected; aborting save");
}

Try / catch

try {
  stepMeta.saveRep(transMeta.getRepository(), transMeta, transMeta.getObjectId(), stepMeta.getObjectId());
} catch (KettleException e) {
  Throwable root = e.getCause(); // repository driver error lives here
  logError("Save of PropertyInput step " + e.getMessage() + " failed: " + root, root);
  // retry after reconnecting the repository
}

Prevention

When it happens

Trigger: Calling saveRep() (directly or via saving a transformation containing this step) when the underlying repository write fails: repository database connection lost or read-only, invalid/rolled-back transaction, ID mismatch, or any SQLException thrown by saveStepAttribute for one of the TAG_* attributes (lines 1120-1158).

Common situations: Repository database (e.g. Postgres/MySQL) unreachable or dropped mid-save; DB user lacks write privileges on R_STEP_ATTRIBUTE; repository moved to read-only mode; network interruption while saving a large transformation; corrupted repository schema after an upgrade.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/propertyinput/PropertyInputMeta.java:1160

        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_CURRENCY, field.getCurrencySymbol() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_DECIMAL, field.getDecimalSymbol() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_GROUP, field.getGroupSymbol() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_LENGTH, field.getLength() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_PRECISION, field.getPrecision() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_TRIM_TYPE, field.getTrimTypeCode() );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_FIELD_REPEAT, field.isRepeated() );
      }

      rep.saveStepAttribute( idTransformation, idStep, TAG_SHORT_FILE_FIELD_NAME, shortFileFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_PATH_FIELD_NAME, pathFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_HIDDEN_FIELD_NAME, hiddenFieldName );
      rep.saveStepAttribute(
        idTransformation, idStep, TAG_LAST_MODIFICATION_TIME_FIELD_NAME, lastModificationTimeFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_URI_NAME_FIELD_NAME, uriNameFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_ROOT_URI_NAME_FIELD_NAME, rootUriNameFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_EXTENSION_FIELD_NAME, extensionFieldName );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PropertyInputMeta.Exception.ErrorSavingToRepository", "" + idStep ), e );
    }
  }

  public FileInputList getFiles( Bowl bowl, VariableSpace space ) {
    String[] required = new String[ fileName.length ];
    Arrays.fill( required, YES );
    boolean[] subDirs = new boolean[ fileName.length ]; // boolean arrays are defaulted to false.

    return FileInputList.createFileList( bowl, space, fileName, fileMask, excludeFileMask, required, subDirs );
  }

  @Override
  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
    Repository repository, IMetaStore metaStore ) {

    // See if we get input...

View on GitHub (pinned to f3058517a1)