{"record":{"id":"c8afe757ebe248a8","repo":"pentaho/pentaho-kettle","slug":"gpbulkloadermeta-exception-unabletosavestepinfotorepository","errorCode":null,"errorMessage":"GPBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository","messagePattern":"GPBulkLoaderMeta\\.Exception\\.UnableToSaveStepInfoToRepository","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/gp-bulk-loader/core/src/main/java/org/pentaho/di/trans/steps/gpbulkloader/GPBulkLoaderMeta.java","lineNumber":412,"sourceCode":"      rep.saveStepAttribute( id_transformation, id_step, \"data_file\", dataFile );\n      rep.saveStepAttribute( id_transformation, id_step, \"log_file\", logFile );\n\n      rep.saveStepAttribute( id_transformation, id_step, \"erase_files\", eraseFiles );\n      rep.saveStepAttribute( id_transformation, id_step, \"encoding\", encoding );\n      rep.saveStepAttribute( id_transformation, id_step, \"dbname_override\", dbNameOverride );\n\n      for ( int i = 0; i < fieldTable.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"stream_name\", fieldTable[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"field_name\", fieldStream[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"date_mask\", dateMask[i] );\n      }\n\n      // Also, save the step-database relationship!\n      if ( databaseMeta != null ) {\n        rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"GPBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository\" )\n        + id_step, e );\n    }\n  }\n\n  @Override\n  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,\n    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {\n    // Default: nothing changes to rowMeta\n  }\n\n  @Override\n  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,\n    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,\n    Repository repository, IMetaStore metaStore ) {\n    CheckResult cr;\n    String error_message = \"\";\n","sourceCodeStart":394,"sourceCodeEnd":430,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/gp-bulk-loader/core/src/main/java/org/pentaho/di/trans/steps/gpbulkloader/GPBulkLoaderMeta.java#L394-L430","documentation":"Thrown by GPBulkLoaderMeta.saveRep when persisting the step's settings to the Kettle repository fails. Saving field mappings, database relation (insertStepDatabase) and other attributes is wrapped in a try/catch and rethrown as this KettleException with the step id appended to the message. The original exception is chained as the cause.","triggerScenarios":"Calling saveRep (during transformation save) when insertStepDatabase fails due to a foreign-key violation, repository connection loss, or the referenced databaseMeta object not yet being saved (null ObjectId).","commonSituations":"Saving a transformation whose database connection was deleted from the repository; read-only repository credentials; duplicate/insert conflicts in r_step_database after concurrent saves by two Spoon sessions.","solutions":["Inspect getCause() for the underlying repository error (most often insertStepDatabase or write failure)","Ensure the referenced database connection is saved in the repository before saving the transformation","Verify repository user has INSERT/UPDATE rights on the step attribute tables","Retry the save after reconnecting; avoid two users saving the same transformation concurrently"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// before saving\nif ( databaseMeta != null && databaseMeta.getObjectId() == null ) {\n  rep.save( databaseMeta, null, metaStore ); // save connection first\n}","typeGuard":"boolean canSave = rep != null && rep.isConnected() && (databaseMeta == null || databaseMeta.getObjectId() != null);","tryCatchPattern":"try { meta.saveRep( rep, metaStore, id_transformation, id_step ); } catch ( KettleException e ) { log.error( \"Step save failed for step \" + id_step + \": \" + e.getCause(), e ); }","preventionTips":["Save referenced database connections before saving steps that reference them","Avoid concurrent saves of the same transformation by two Spoon sessions","Use repository accounts with INSERT/UPDATE privileges","Check getCause() to identify the failing insert"],"tags":["kettle","repository","metadata","persistence"],"backgroundTag":"database-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}