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

JsonOutputMeta.saveRep persists the step's settings to the Kettle repository via rep.saveStepAttribute; any exception is wrapped as 'Unable to save step information to the repository for id_step=<id>'. It means saving this step's metadata (including its output field grid) failed at the repository layer.

Solutions

  1. Check repository database connectivity, disk space, and write permissions for your repository user.
  2. Retry the save after reconnecting; check for locks or stale sessions in the repository.
  3. Verify the repository schema matches your PDI version (run the repository upgrade/repair SQL).
  4. As a workaround, save the transformation as a local .ktr file, fix the repository, then re-save.
Defensive patterns

Strategy: try-catch

Try / catch

try { repository.save(transMeta, "desc", null, true); } catch (KettleException e) {
  if (e.getMessage().startsWith("Unable to save step information to the repository")) {
    log.error("Repository save failed; export to .ktr as backup and check DB", e);
  }
  throw e;
}

Prevention

When it happens

Trigger: Saving a transformation to a database/enterprise repository where saveStepAttribute throws — connection loss, transaction failure, read-only repository, or constraint violations in the attribute tables.

Common situations: Repository DB read-only or out of space; connection dropped mid-save; insufficient user permissions on the repository; repository schema mismatch after a PDI version upgrade.

Related errors


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

Appendix: source

Thrown at plugins/json/core/src/main/java/org/pentaho/di/trans/steps/jsonoutput/JsonOutputMeta.java:445

      rep.saveStepAttribute( id_transformation, id_step, "file_name", fileName );
      rep.saveStepAttribute( id_transformation, id_step, "file_extention", extension );
      rep.saveStepAttribute( id_transformation, id_step, "file_append", fileAppended );
      rep.saveStepAttribute( id_transformation, id_step, "file_add_stepnr", stepNrInFilename );
      rep.saveStepAttribute( id_transformation, id_step, "file_add_partnr", partNrInFilename );
      rep.saveStepAttribute( id_transformation, id_step, "file_add_date", dateInFilename );
      rep.saveStepAttribute( id_transformation, id_step, "file_add_time", timeInFilename );
      rep.saveStepAttribute( id_transformation, id_step, "create_parent_folder", createparentfolder );
      rep.saveStepAttribute( id_transformation, id_step, "DoNotOpenNewFileInit", DoNotOpenNewFileInit );
      rep.saveStepAttribute( id_transformation, id_step, "file_servlet_output", servletOutput );

      for ( int i = 0; i < outputFields.length; i++ ) {
        JsonOutputField field = outputFields[i];

        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", field.getFieldName() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_element", field.getElementName() );
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
    }
  }

  public String buildFilename( String filename, Date date ) {
    SimpleDateFormat daf = new SimpleDateFormat();

    // Replace possible environment variables...
    StringBuilder filenameOutput = new StringBuilder( filename );

    if ( dateInFilename ) {
      daf.applyPattern( BaseFileOutputMeta.DEFAULT_DATE_FORMAT );
      String d = daf.format( date );
      filenameOutput.append( '_' ).append( d );
    }
    if ( timeInFilename ) {
      daf.applyPattern( BaseFileOutputMeta.DEFAULT_TIME_FORMAT );
      String t = daf.format( date );
      filenameOutput.append( '_' ).append( t );

View on GitHub (pinned to f3058517a1)