pentaho/pentaho-kettle · error · KettleException

SSHMeta.Exception.UnexpectedErrorReadingStepInfo

Error message

SSHMeta.Exception.UnexpectedErrorReadingStepInfo

What it means

SSHMeta.Exception.UnexpectedErrorReadingStepInfo is thrown when loading SSH step settings from a repository (readRep). Any exception from repository attribute lookups or password decryption is wrapped in a KettleException with this message. It indicates the stored repository representation of the step could not be read.

Solutions

  1. Verify the repository (database or file) connection is healthy
  2. Re-save the step in Spoon so attributes are rewritten to the repository
  3. Check the wrapped cause for the underlying repository error (SQL, decryption)
  4. Restore the step/transformation from a repository backup
Defensive patterns

Strategy: try-catch

Validate before calling

// verify repository health before loading:
boolean ok = rep.isConnected() && rep.getRepositoryMeta() != null;

Try / catch

try {
  stepMeta.readRep(rep, metaStore, idStep, databases);
} catch (KettleException e) {
  logError("Failed reading SSH step from repository: " + e.getCause());
}

Prevention

When it happens

Trigger: readRep failing due to repository connectivity problems, missing step attributes, or corrupted encrypted password values.

Common situations: Repository database upgrade/migration inconsistencies; broken repository connection mid-load; step attributes deleted or written by an incompatible plugin version.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ssh/SSHMeta.java:454

      port = rep.getStepAttributeString( idStep, ATTR_PORT );
      userName = rep.getStepAttributeString( idStep, ATTR_USER_NAME );
      password = Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( idStep, ATTR_PASSWORD ) );

      usePrivateKey = rep.getStepAttributeBoolean( idStep, ATTR_USE_PRIVATE_KEY );
      keyFileName = rep.getStepAttributeString( idStep, ATTR_KEY_FILE_NAME );
      passPhrase =
        Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( idStep, ATTR_PASS_PHRASE ) );
      stdOutFieldName = rep.getStepAttributeString( idStep, ATTR_STD_OUT_FIELD_NAME );
      stdErrFieldName = rep.getStepAttributeString( idStep, ATTR_STD_ERR_FIELD_NAME );
      timeOut = rep.getStepAttributeString( idStep, ATTR_TIME_OUT );
      proxyHost = rep.getStepAttributeString( idStep, ATTR_PROXY_HOST );
      proxyPort = rep.getStepAttributeString( idStep, ATTR_PROXY_PORT );
      proxyUsername = rep.getStepAttributeString( idStep, ATTR_PROXY_USERNAME );
      proxyPassword =
        Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( idStep, ATTR_PROXY_PASSWORD ) );

    } catch ( Exception e ) {
      throw new KettleException(
        BaseMessages.getString( PKG, "SSHMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId idTransformation, ObjectId idStep )
    throws KettleException {
    try {
      rep.saveStepAttribute( idTransformation, idStep, ATTR_DYNAMIC_COMMAND_FIELD, dynamicCommandField );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_COMMAND, command );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_COMMAND_FIELD_NAME, commandfieldname );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_PORT, port );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_SERVER_NAME, serverName );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_USER_NAME, userName );
      rep.saveStepAttribute( idTransformation, idStep, ATTR_PASSWORD, Encr
        .encryptPasswordIfNotUsingVariables( password ) );

      rep.saveStepAttribute( idTransformation, idStep, ATTR_USE_PRIVATE_KEY, usePrivateKey );

View on GitHub (pinned to f3058517a1)