pentaho/pentaho-kettle · error · KettleException

MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository

MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository

Error message

MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository

What it means

MonetDBBulkLoaderMeta.saveRep() wraps any Exception thrown while persisting the step's configuration (field mappings, database relation) to the repository in a KettleException carrying the 'UnableToSaveStepInfoToRepository' message. It means the step metadata could not be written; the message string is concatenated with id_step to identify which step failed. The original exception is preserved as the cause.

Solutions

  1. Check the cause chain for the underlying KettleDatabaseException and fix the repository connectivity/permission problem
  2. Verify the referenced databaseMeta still exists in the repository (re-select the connection in the step dialog)
  3. Ensure the transformation itself has been saved first so id_step is valid
  4. Retry the save after restoring the repository connection

Example fix

// before
rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId());
// after
if (databaseMeta != null && databaseMeta.getObjectId() != null) {
  rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId());
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify repository writability before saving
if (rep == null || !rep.isConnected()) throw new KettleException("Repository is not connected");
if (id_step == null) throw new KettleException("Step must be persisted before saving step metadata");
if (meta.getDatabaseMeta() != null && meta.getDatabaseMeta().getObjectId() == null) {
  throw new KettleException("Referenced database connection is not saved in the repository");
}

Try / catch

try {
  meta.saveRep(rep, metaStore, idTransformation, idStep);
} catch (KettleException e) {
  logError("Save failed for step " + idStep + ": " + e.getCause(), e);
  throw e; // retry after fixing repository connectivity/permissions
}

Prevention

When it happens

Trigger: Calling saveRep() when the Repository throws on any of the save operations, notably rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId()) or attribute writes — e.g. repository connection lost, insufficient permissions, or id_step not yet persisted.

Common situations: Saving a transformation when the repository database is down or read-only; the step's databaseMeta points to a deleted database object; repository user lacks INSERT permissions on r_step_attribute/r_step_database; disk full on the repository DB server.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


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

Appendix: source

Thrown at plugins/monet-db-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/monetdbbulkloader/MonetDBBulkLoaderMeta.java:477

      // MonetDB Settings Tab
      rep.saveStepAttribute( id_transformation, id_step, TAG_FIELD_SEPARATOR, fieldSeparator );
      rep.saveStepAttribute( id_transformation, id_step, "field_enclosure", fieldEnclosure );
      rep.saveStepAttribute( id_transformation, id_step, "null_representation", NULLrepresentation );
      rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );

      // Output Fields Tab
      for ( int i = 0; i < fieldTable.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "stream_name", fieldTable[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", fieldStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_format_ok", fieldFormatOk[i] );
      }

      // Also, save the step-database relationship!
      if ( databaseMeta != null ) {
        rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
          PKG, "MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository" )
          + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
      VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Default: nothing changes to rowMeta
  }

  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
      RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
      Repository repository, IMetaStore metaStore ) {
    CheckResult cr;
    String error_message = "";

    if ( databaseMeta != null ) {

View on GitHub (pinned to f3058517a1)