pentaho/pentaho-kettle · error · KettleException

GoogleAnalytics.Error.UnableToSaveToRep

Error message

GoogleAnalytics.Error.UnableToSaveToRep

What it means

GaInputStepMeta.saveRep wraps any exception raised while persisting Google Analytics step attributes (profiles, metrics, dimensions, conversion masks, output types) to the repository. The message is concatenated with the id_step for identification. Thrown because a failed save would silently lose step configuration.

Solutions

  1. Check the nested cause for the underlying repository/SQL error (permissions, limits, connectivity).
  2. Connect with a repository user that has write permission on the transformation directory.
  3. Reconnect and retry the save.
  4. Reduce the number/length of stored fields if repository column limits are exceeded.

Example fix

// before
rep.save( transMeta, "path", null ); // fails with read-only user

// after
rep.disconnect();
rep.connect( writableUser, password );
rep.save( transMeta, "path", null );
Defensive patterns

Strategy: try-catch

Validate before calling

if ( !rep.isConnected() || !rep.hasPermission( dir, PermissionMeta.TYPE_PERMISSION_MODIFY ) ) {
  throw new KettleException( "Repository not writable" );
}

Try / catch

try {
  rep.save( transMeta, path, null );
} catch ( KettleException e ) {
  log.error( "saveRep failed: " + e.getMessage(), e.getCause() );
}

Prevention

When it happens

Trigger: Calling saveRep(Repository, IMetaStore, ObjectId, ObjectId) when any rep.saveStepAttribute(...) call fails — connection loss, insufficient write permission, DB constraint/size violation on long metric/dimension lists.

Common situations: Saving with a read-only repository account; very long dimension/metric lists exceeding column sizes; network drop during save; repository backend database full.

Related errors


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

Appendix: source

Thrown at plugins/google-analytics/core/src/main/java/org/pentaho/di/trans/steps/googleanalytics/GaInputStepMeta.java:612

      rep.saveStepAttribute( id_transformation, id_step, "useSegment", useSegment );
      rep.saveStepAttribute( id_transformation, id_step, "useCustomSegment", useCustomSegment );
      rep.saveStepAttribute( id_transformation, id_step, "customSegment", customSegment );
      rep.saveStepAttribute( id_transformation, id_step, "segmentId", segmentId );
      rep.saveStepAttribute( id_transformation, id_step, "segmentName", segmentName );
      rep.saveStepAttribute( id_transformation, id_step, "samplingLevel", samplingLevel );
      rep.saveStepAttribute( id_transformation, id_step, "rowLimit", rowLimit );

      for ( int i = 0; i < feedField.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "feedFieldType", feedFieldType[ i ] );
        rep.saveStepAttribute( id_transformation, id_step, i, "feedField", feedField[ i ] );
        rep.saveStepAttribute( id_transformation, id_step, i, "outField", outputField[ i ] );
        rep.saveStepAttribute( id_transformation, id_step, i, "conversionMask", conversionMask[ i ] );
        rep.saveStepAttribute( id_transformation, id_step, i, "type", ValueMetaFactory.getValueMetaName( outputType[ i ] ) );

      }

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "GoogleAnalytics.Error.UnableToSaveToRep" )
        + id_step, e );
    }
  }

  @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 ( prev == null || prev.size() == 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "GoogleAnalytics.CheckResult.NotReceivingFields" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(

View on GitHub (pinned to f3058517a1)