{"record":{"id":"2d8ea7bc4a8452f5","repo":"pentaho/pentaho-kettle","slug":"combinationlookupmeta-exception-unabletosavestepinfo","errorCode":null,"errorMessage":"CombinationLookupMeta.Exception.UnableToSaveStepInfo","messagePattern":"CombinationLookupMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/combinationlookup/CombinationLookupMeta.java","lineNumber":604,"sourceCode":"        rep.saveStepAttribute( id_transformation, id_step, i, \"lookup_key_name\", keyField[ i ] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"lookup_key_field\", keyLookup[ i ] );\n      }\n\n      rep.saveStepAttribute( id_transformation, id_step, \"return_name\", technicalKeyField );\n      rep.saveStepAttribute( id_transformation, id_step, \"sequence\", sequenceFrom );\n      rep.saveStepAttribute( id_transformation, id_step, \"creation_method\", techKeyCreation );\n\n      // For the moment still save 'use_autoinc' for backwards compatibility (Sven Boden).\n      rep.saveStepAttribute( id_transformation, id_step, \"use_autoinc\", useAutoinc );\n\n      rep.saveStepAttribute( id_transformation, id_step, \"last_update_field\", lastUpdateField );\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, \"CombinationLookupMeta.Exception.UnableToSaveStepInfo\" )\n        + id_step, e );\n    }\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\n    if ( databaseMeta != null ) {\n      Database db = new Database( loggingObject, databaseMeta );\n      try {\n        db.connect();\n\n        if ( !Utils.isEmpty( tablename ) ) {","sourceCodeStart":586,"sourceCodeEnd":622,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/combinationlookup/CombinationLookupMeta.java#L586-L622","documentation":"Generic KettleException thrown by CombinationLookupMeta.saveRep when persisting the step configuration to the repository fails. The localized message 'Unable to save step information to the repository ... id_step=' is concatenated with the step id, and the original exception is attached as cause.","triggerScenarios":"saveRep throws while writing step attributes or while rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId()) is called after saving the main attributes.","commonSituations":"Repository read-only or out of quota; transaction locked by another user/session; foreign key issues when databaseMeta.getObjectId() is null (connection not yet saved); repository schema mismatch after upgrade.","solutions":["Check the wrapped cause; if it points at insertStepDatabase, save the database connection first so its ObjectId is not null.","Verify repository write permissions and that the repository isn't locked or read-only.","Run repository upgrade scripts if the schema predates your PDI version.","Retry the save after resolving contention (another open transformation holding locks)."],"exampleFix":"// before: step references an unsaved shared connection -> insertStepDatabase(null id)\n// after: save the DatabaseMeta first\n//   rep.save(databaseMeta, id_transformation, null);\n//   stepMeta.setDatabaseMeta(databaseMeta);\n//   rep.saveStepAttribute(...) // then save the transformation","handlingStrategy":"try-catch","validationCode":"// before save: ensure the referenced connection is persisted\n// if (meta.getDatabaseMeta() != null && meta.getDatabaseMeta().getObjectId() == null)\n//   rep.save(meta.getDatabaseMeta(), id_transformation, null);","typeGuard":null,"tryCatchPattern":"try {\n  repository.save(transMeta, \"comment\", null);\n} catch (KettleException e) {\n  log.error(\"Save of step to repository failed for id_step=\" + e.getCause(), e);\n}","preventionTips":["Save shared database connections before the steps that use them.","Ensure repository users have write privileges and quota.","Avoid concurrent edits of the same transformation by multiple sessions.","Run repository schema upgrades before saving from a newer client."],"tags":["repository","metadata-save","database","kettle"],"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"}