pentaho/pentaho-kettle · error · KettleException

Unable to save step information to the repository for…

Error message

Unable to save step information to the repository for id_step=

What it means

XMLJoinMeta.saveRep persists the step's settings (targetXPath, joinCompareField, encoding, omitXMLHeader, omitNullValues) as step attributes in the Kettle repository. Any exception raised by the repository while saving these attributes is wrapped in this KettleException with the step id appended. It signals that the step definition could not be persisted, not that a transformation run failed.

Solutions

  1. Check repository connectivity and reconnect before saving
  2. Verify the repository user has write permissions
  3. Retry saving the transformation after fixing the repository
  4. Inspect the wrapped cause (e.getCause()) for the underlying repository error

Example fix

// before
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
// after
if ( rep == null ) { return; } // skip repository save when running file-only
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
Defensive patterns

Strategy: try-catch

Validate before calling

// before saving
if ( rep == null || !rep.isConnected() ) { throw new IllegalStateException("Repository not connected"); }

Type guard

boolean repoWritable = rep != null && rep.isConnected();

Try / catch

try { meta.saveRep(rep, metaStore, idTransformation, idStep); } catch (KettleException e) { log.error("Repo save failed for step", e); throw e; }

Prevention

When it happens

Trigger: Calling saveRep during transformation save when the repository connection is broken, the repository is read-only, a saveStepAttribute call fails (e.g. invalid id_step, database error), or encoding/attribute values cannot be stored.

Common situations: Saving a transformation to a database repository that has gone down or lost connectivity; saving to a repository where the user lacks write permission; corrupted repository metadata tables.

Related errors


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

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xmljoin/XMLJoinMeta.java:232

    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
    throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "valueXMLfield", valueXMLfield );
      rep.saveStepAttribute( id_transformation, id_step, "targetXMLstep", targetXMLstep );
      rep.saveStepAttribute( id_transformation, id_step, "targetXMLfield", targetXMLfield );
      rep.saveStepAttribute( id_transformation, id_step, "sourceXMLstep", sourceXMLstep );
      rep.saveStepAttribute( id_transformation, id_step, "sourceXMLfield", sourceXMLfield );
      rep.saveStepAttribute( id_transformation, id_step, "complexJoin", complexJoin );
      rep.saveStepAttribute( id_transformation, id_step, "targetXPath", targetXPath );
      rep.saveStepAttribute( id_transformation, id_step, "joinCompareField", joinCompareField );
      rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
      rep.saveStepAttribute( id_transformation, id_step, "omitXMLHeader", omitXMLHeader );
      rep.saveStepAttribute( id_transformation, id_step, "omitNullValues", omitNullValues );
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
    }
  }

  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;
    // checks for empty field which are required
    if ( this.targetXMLstep == null || this.targetXMLstep.length() == 0 ) {
      cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString( PKG,
              "XMLJoin.CheckResult.TargetXMLStepNotSpecified" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString( PKG,
              "XMLJoin.CheckResult.TargetXMLStepSpecified" ), stepMeta );

View on GitHub (pinned to f3058517a1)