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
- Check connectivity to the repository database and retry the transformation save.
- Verify the repository DB user has INSERT/UPDATE privileges on R_STEP_ATTRIBUTE and related tables.
- Inspect the chained cause (KettleException.getCause()) for the actual repository error and fix it.
- If using a file repository, confirm the file/directory is writable and not locked.
- 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
- Check repository connectivity before programmatic saves.
- Grant the repo user write access to R_STEP_ATTRIBUTE.
- Log the chained cause, not just the wrapper message.
- Use file-based repository or retry logic in flaky network environments.
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
- ZipFileMeta.Exception.UnableToSaveStepInfo
- ElasticSearchBulkMeta.Exception.ErrorReadingRepository
- ElasticSearchBulkMeta.Exception.ErrorSavingToRepository
- ERROR_0002
- GetTableNamesMeta.Exception.UnableToSaveStepInfo
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)