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

MetaInjectMeta.saveRep() writes each target/source mapping entry as numbered step attributes. Any exception during these saveStepAttribute calls is wrapped in a KettleException including the failing id_step. The transformation cannot be persisted to the repository.

Solutions

  1. Check the wrapped cause for the underlying repository/SQL error.
  2. Verify the repository database is writable and has free space.
  3. Reduce the number of injection mappings if attribute rows hit a storage limit.
  4. Reconnect to the repository and retry the save.
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify repository is writable before saving
if (rep.isReadOnly()) throw new IllegalStateException("Repository is read-only");

Try / catch

try {
  meta.saveRep(rep, metaStore, id_transformation, id_step);
} catch (KettleException e) {
  logError("Save failed for id_step=" + id_step + ": " + e.getCause(), e);
  // retry after reconnecting to the repository
}

Prevention

When it happens

Trigger: saveRep(rep, metaStore, id_transformation, id_step) failing on repository I/O errors, locked/readonly repository connections, or oversized mapping tables.

Common situations: Repository database out of space or read-only; connection lost mid-save; saving a transformation with hundreds of injection mappings exceeding DB limits.

Related errors


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

Appendix: source

Thrown at plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInjectMeta.java:366

        rep.saveStepAttribute( id_transformation, id_step, i, SOURCE_OUTPUT_FIELD_PRECISION, aField.getPrecision() );
      }

      rep.saveStepAttribute( id_transformation, id_step, TARGET_FILE, targetFile );
      rep.saveStepAttribute( id_transformation, id_step, NO_EXECUTION, noExecution );

      List<TargetStepAttribute> keySet = new ArrayList<TargetStepAttribute>( targetSourceMapping.keySet() );
      for ( int i = 0; i < keySet.size(); i++ ) {
        TargetStepAttribute target = keySet.get( i );
        SourceStepField source = targetSourceMapping.get( target );

        rep.saveStepAttribute( id_transformation, id_step, i, MAPPING_TARGET_STEP_NAME, target.getStepname() );
        rep.saveStepAttribute( id_transformation, id_step, i, MAPPING_TARGET_ATTRIBUTE_KEY, target.getAttributeKey() );
        rep.saveStepAttribute( id_transformation, id_step, i, MAPPING_TARGET_DETAIL, target.isDetail() );
        rep.saveStepAttribute( id_transformation, id_step, i, MAPPING_SOURCE_STEP, source.getStepname() );
        rep.saveStepAttribute( id_transformation, id_step, i, MAPPING_SOURCE_FIELD, source.getField() );
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + 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 {

    rowMeta.clear(); // No defined output is expected from this step.
    if ( !Utils.isEmpty( sourceStepName ) ) {
      for ( MetaInjectOutputField field : sourceOutputFields ) {
        try {
          rowMeta.addValueMeta( field.createValueMeta() );
        } catch ( KettlePluginException e ) {
          throw new KettleStepException( "Error creating value meta for output field '" + field.getName() + "'", e );
        }
      }
    }
  }

View on GitHub (pinned to f3058517a1)