pentaho/pentaho-kettle · error · KettleException

YamlInputMeta.Exception.ErrorSavingToRepository

Error message

YamlInputMeta.Exception.ErrorSavingToRepository

What it means

YamlInputMeta.saveRep wraps persistence of the step's attributes to the Kettle repository; any exception is rethrown as a KettleException with this message including the step's ObjectId. It indicates the step configuration could not be saved.

Solutions

  1. Inspect the attached cause for the underlying SQL error (permissions, space, constraint).
  2. Verify the repository user has INSERT/UPDATE rights on the step attribute tables.
  3. Check DB disk space and connectivity, then retry the save.
  4. As a workaround, save the transformation as a .ktr file locally and re-import to the repository later.

Example fix

// before: save fails with read-only DB user
// grant write access:
GRANT INSERT, UPDATE, DELETE ON r_step_attribute TO pdi_user;
Defensive patterns

Strategy: try-catch

Validate before calling

// check write access up front
if (!repository.isConnected()) { repository.connect(user, pass); }
// ensure repository user has write rights on step attribute tables before saving

Try / catch

try { meta.saveRep(repository, metaStore, transObjectId, stepObjectId); }
catch (KettleException e) {
  log.error("Save of YAML Input step failed (id_step=" + stepObjectId + ")", e);
  // fallback: export the transformation to a .ktr file so work is not lost
  transMeta.exportToFile(new File("backup.ktr"));
}

Prevention

When it happens

Trigger: saveRep on this meta class: rep.saveStepAttribute(...) for any attribute (including IsInFields, IsAFile, YamlField) throws — repository write failure inside the try/catch that rethrows with this key.

Common situations: Repository database read-only or out of space, transaction rolled back due to constraint violation, network interruption while saving a transformation, saving to a repository after schema downgrade.

Related errors


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

Appendix: source

Thrown at plugins/yaml-input/impl/src/main/java/org/pentaho/di/trans/steps/yamlinput/YamlInputMeta.java:702

        YamlInputField field = inputFields[i];

        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", field.getName() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_path", field.getPath() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_type", field.getTypeDesc() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_format", field.getFormat() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_currency", field.getCurrencySymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_decimal", field.getDecimalSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_group", field.getGroupSymbol() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_length", field.getLength() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_precision", field.getPrecision() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_trim_type", field.getTrimTypeCode() );
      }
      rep.saveStepAttribute( id_transformation, id_step, "IsInFields", inFields );
      rep.saveStepAttribute( id_transformation, id_step, "IsAFile", IsAFile );

      rep.saveStepAttribute( id_transformation, id_step, "YamlField", yamlField );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "YamlInputMeta.Exception.ErrorSavingToRepository", "" + id_step ), e );
    }
  }

  public FileInputList getFiles( Bowl bowl, VariableSpace space ) {
    return FileInputList.createFileList( bowl, space, fileName, fileMask, fileRequired, includeSubFolderBoolean() );
  }

  private boolean[] includeSubFolderBoolean() {
    int len = fileName.length;
    boolean[] includeSubFolderBoolean = new boolean[len];
    for ( int i = 0; i < len; i++ ) {
      includeSubFolderBoolean[i] = YES.equalsIgnoreCase( includeSubFolders[i] );
    }
    return includeSubFolderBoolean;
  }

  @Override

View on GitHub (pinned to f3058517a1)