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
- Check the nested cause for the underlying repository/SQL error (permissions, limits, connectivity).
- Connect with a repository user that has write permission on the transformation directory.
- Reconnect and retry the save.
- 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
- Use write-enabled repository accounts
- Watch DB column limits for long metric/dimension lists
- Retry saves after transient network failures
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
- AppendMeta.Exception.UnableToSaveStepInfo
- CombinationLookupMeta.Exception.UnableToSaveStepInfo
- DynamicSQLRowMeta.Exception.UnableToSaveStepInfo
- ExecProcessMeta.Exception.UnableToSaveStepInfo
- ExecSQLRowMeta.Exception.UnableToSaveStepInfo
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)