pentaho/pentaho-kettle · error · KettleException

MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository

MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository

Error message

MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository

What it means

MonetDBBulkLoaderMeta.readRep() wraps any Exception thrown while restoring this step's configuration from the repository in a KettleException carrying the 'UnexpectedErrorReadingStepInfoFromRepository' message. It means repository metadata for the step (field mappings, stream/table field names, format flags) could not be read, e.g. a repository I/O problem or corrupt/unexpected step attributes. The original exception is preserved as the cause.

Solutions

  1. Check the cause chain of the KettleException for the real repository error (usually a KettleDatabaseException) and fix that underlying problem first
  2. Verify the repository connection is available and the user can read r_step_attribute for this transformation
  3. Re-open and re-save the transformation in Spoon to rewrite the step attributes
  4. If caused by a version upgrade, upgrade the plugin or recreate the MonetDBBulkLoader step

Example fix

// before
meta.readRep(rep, metaStore, stepId, databases);
// after
try {
  meta.readRep(rep, metaStore, stepId, databases);
} catch (KettleException e) {
  logError("Failed to read MonetDBBulkLoader step info from repository", e); // inspect e.getCause()
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify repository access before loading metadata
if (rep == null || !rep.isConnected()) {
  throw new KettleException("Repository is not connected");
}
ObjectId stepId = transMeta.getStep(stepname).getStepMetaInterface() != null ? stepObjectId : null;
if (stepId == null) throw new KettleException("Step not persisted in repository");

Type guard

boolean canReadStep(Repository rep, ObjectId idStep) {
  try {
    return rep != null && idStep != null && rep.getStepAttributeString(idStep, "field_format_ok") != null || true; // attributes may be optional; check connection instead
  } catch (Exception e) { return false; }
}

Try / catch

try {
  meta.readRep(rep, metaStore, idStep, databases);
} catch (KettleException e) {
  Throwable cause = e.getCause();
  // branch on cause type: KettleDatabaseException => repository I/O, else attribute problem
  throw new KettleException("Reading MonetDBBulkLoader metadata failed: " + (cause != null ? cause.getMessage() : "unknown"), e);
}

Prevention

When it happens

Trigger: Calling readRep() when the underlying Repository throws (connection dropped, missing step attributes for id_step, a null/incompatible attribute value, or repository schema mismatch) — the generic catch around the whole attribute-reading loop converts any such failure into this error.

Common situations: Opening a transformation whose MonetDBBulkLoader step was saved by a different Pentaho/Kettle version; repository database temporarily unreachable; a corrupted repository row for the step; manually edited r_step_attribute rows.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/a2cea8b2d8c445b5. 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:442

      }
      truncate = Boolean.parseBoolean( rep.getStepAttributeString( id_step, "truncate" ) );

      // This expression will only return true if a yes value was previously recorded; false otherwise.
      fullyQuoteSQL = Boolean.parseBoolean( rep.getStepAttributeString( id_step, "fully_quote_sql" ) );
      int nrvalues = rep.countNrStepAttributes( id_step, "stream_name" );

      allocate( nrvalues );

      for ( int i = 0; i < nrvalues; i++ ) {
        fieldTable[i] = rep.getStepAttributeString( id_step, i, "stream_name" );
        fieldStream[i] = rep.getStepAttributeString( id_step, i, "field_name" );
        if ( fieldStream[i] == null ) {
          fieldStream[i] = fieldTable[i];
        }
        fieldFormatOk[i] = rep.getStepAttributeBoolean( id_step, i, "field_format_ok" );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
          PKG, "MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository" ), e );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveDatabaseMetaStepAttribute( id_transformation, id_step, "id_connection", databaseMeta );
      // General Settings Tab
      rep.saveStepAttribute( id_transformation, id_step, "db_connection_name", dbConnectionName );
      rep.saveStepAttribute( id_transformation, id_step, "schema", schemaName );
      rep.saveStepAttribute( id_transformation, id_step, "table", tableName );
      rep.saveStepAttribute( id_transformation, id_step, "buffer_size", bufferSize );
      rep.saveStepAttribute( id_transformation, id_step, "log_file", logFile );
      rep.saveStepAttribute( id_transformation, id_step, "truncate", truncate );
      rep.saveStepAttribute( id_transformation, id_step, "fully_quote_sql", fullyQuoteSQL );

      // MonetDB Settings Tab
      rep.saveStepAttribute( id_transformation, id_step, TAG_FIELD_SEPARATOR, fieldSeparator );

View on GitHub (pinned to f3058517a1)