pentaho/pentaho-kettle · error · KettleException

JsonInputMeta.Exception.ErrorSavingToRepository

JsonInputMeta.Exception.ErrorSavingToRepository

Error message

JsonInputMeta.Exception.ErrorSavingToRepository

What it means

KettleException with message key JsonInputMeta.Exception.ErrorSavingToRepository (including the id_step), thrown by JsonInputMeta.saveRep when persisting the step's attributes to the repository fails. Any exception from the rep.saveStepAttribute calls (DB error, constraint violation, connection loss) is wrapped here.

Solutions

  1. Check the wrapped cause: fix repository DB connectivity or the reported DB error and retry the save.
  2. Verify the repository user has INSERT/UPDATE rights on R_STEP_ATTRIBUTE.
  3. Reconnect to the repository (right-click -> reconnect) if the session was stale, then save again.
  4. Coordinate with other users to avoid concurrent saves of the same transformation (version/lock the object).

Example fix

// before
rep.save(new RepositoryDirectory(), transName, transMeta, monitor); // fails when DB down
// after
if (!rep.isConnected()) rep.connect();
rep.save(dir, transName, transMeta, monitor);
Defensive patterns

Strategy: retry

Validate before calling

// confirm write access before saving
if (!rep.testConnectionSuccess()) throw new IllegalStateException("Repository unreachable");
// and confirm user has save rights on the directory in your repository security model

Try / catch

try { rep.save(dir, name, transMeta, monitor); }
catch (KettleException e) {
  if (getRootCause(e) instanceof SQLException && isTransient(e)) { retrySaveWithBackoff(); }
  else throw e;
}

Prevention

When it happens

Trigger: saveRep loop of rep.saveStepAttribute(...) throws: repository DB unavailable, transaction/lock conflict, value too long for the attribute column, or read-only repository connection.

Common situations: Saving a transformation while the repository database is down or network is flaky; two users saving the same transformation concurrently; repository user lacking write permissions; attribute values exceeding column size limits.

Related errors


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

Appendix: source

Thrown at plugins/json/core/src/main/java/org/pentaho/di/trans/steps/jsoninput/JsonInputMeta.java:995

        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, i, "field_repeat", field.isRepeated() );
      }
      rep.saveStepAttribute( id_transformation, id_step, "IsInFields", inFields );
      rep.saveStepAttribute( id_transformation, id_step, "IsAFile", isAFile );

      rep.saveStepAttribute( id_transformation, id_step, "valueField", valueField );
      rep.saveStepAttribute( id_transformation, id_step, "shortFileFieldName", getShortFileNameField() );
      rep.saveStepAttribute( id_transformation, id_step, "pathFieldName", getPathField() );
      rep.saveStepAttribute( id_transformation, id_step, "hiddenFieldName", isHiddenField() );
      rep.saveStepAttribute(
        id_transformation, id_step, "lastModificationTimeFieldName", getLastModificationDateField() );
      rep.saveStepAttribute( id_transformation, id_step, "uriNameFieldName", getUriField() );
      rep.saveStepAttribute( id_transformation, id_step, "rootUriNameFieldName", getRootUriField() );
      rep.saveStepAttribute( id_transformation, id_step, "extensionFieldName", getExtensionField() );
      rep.saveStepAttribute( id_transformation, id_step, "sizeFieldName", getSizeField() );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JsonInputMeta.Exception.ErrorSavingToRepository", "" + id_step ), e );
    }
  }

  public FileInputList getFiles( Bowl bowl, VariableSpace space ) {
    return FileInputList.createFileList(
      bowl, space, getFileName(), getFileMask(), getExcludeFileMask(), getFileRequired(),
      inputFiles.includeSubFolderBoolean() );
  }

  @Override
  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;

    if ( !isInFields() ) {
      // See if we get input...

View on GitHub (pinned to f3058517a1)