{"record":{"id":"909d89ea0101d6f5","repo":"pentaho/pentaho-kettle","slug":"failed-to-create-object-in-repository-object-0-already-909d89","errorCode":null,"errorMessage":"Failed to create object in repository. Object [{0}] already exists.","messagePattern":"Failed to create object in repository\\. Object \\[(.+?)\\] already exists\\.","errorType":"exception","errorClass":"KettleObjectExistsException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositorySlaveServerDelegate.java","lineNumber":131,"sourceCode":"    slaveServer.setName( row.getString( KettleDatabaseRepository.FIELD_SLAVE_NAME, null ) );\n    slaveServer.setHostname( row.getString( KettleDatabaseRepository.FIELD_SLAVE_HOST_NAME, null ) );\n    slaveServer.setPort( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PORT, null ) );\n    slaveServer.setWebAppName( row.getString( KettleDatabaseRepository.FIELD_SLAVE_WEB_APP_NAME, null ) );\n    slaveServer.setUsername( row.getString( KettleDatabaseRepository.FIELD_SLAVE_USERNAME, null ) );\n    slaveServer.setPassword( Encr.decryptPasswordOptionallyEncrypted( row.getString(\n      KettleDatabaseRepository.FIELD_SLAVE_PASSWORD, null ) ) );\n    slaveServer.setProxyHostname( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_HOST_NAME, null ) );\n    slaveServer.setProxyPort( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_PORT, null ) );\n    slaveServer.setNonProxyHosts( row.getString( KettleDatabaseRepository.FIELD_SLAVE_NON_PROXY_HOSTS, null ) );\n    slaveServer.setMaster( row.getBoolean( KettleDatabaseRepository.FIELD_SLAVE_MASTER, false ) );\n\n    return slaveServer;\n  }\n\n  public synchronized ObjectId insertSlave( SlaveServer slaveServer ) throws KettleException {\n    if ( getSlaveID( slaveServer.getName() ) != null ) {\n      // This slave server name is already in use. Throw an exception.\n      throw new KettleObjectExistsException( \"Failed to create object in repository. Object [\"\n        + slaveServer.getName() + \"] already exists.\" );\n    }\n\n    ObjectId id = repository.connectionDelegate.getNextSlaveServerID();\n\n    RowMetaAndData table = new RowMetaAndData();\n\n    table.addValue(\n      new ValueMetaInteger( KettleDatabaseRepository.FIELD_SLAVE_ID_SLAVE ), id );\n    table.addValue(\n      new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_NAME ), slaveServer\n        .getName() );\n    table.addValue(\n      new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_HOST_NAME ),\n      slaveServer.getHostname() );\n    table.addValue(\n      new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PORT ), slaveServer\n        .getPort() );","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositorySlaveServerDelegate.java#L113-L149","documentation":"insertSlave throws KettleObjectExistsException if a slave server with the same name already exists in R_SLAVE, checked via getSlaveID(name) before allocating a new ID. This preserves unique slave names in the repository.","triggerScenarios":"Calling insertSlave(slaveServer) when getSlaveID(slaveServer.getName()) returns a non-null ID — i.e. the slave name is already taken. Reached from saveSlaveServer flows that choose insert over update.","commonSituations":"Concurrent registration of identically named slaves from two clients; import scripts that re-insert slaves on every run; copying cluster definitions between repositories with pre-existing slaves.","solutions":["Check getSlaveID(name) first and update the existing slave instead of inserting","Rename the slave server to a unique name before inserting","Catch KettleObjectExistsException and reuse/update the existing slave record","Make imports idempotent: upsert by name rather than blind insert"],"exampleFix":"// before\nObjectId id = delegate.insertSlave(slave);\n// after\nObjectId existingId = delegate.getSlaveID(slave.getName());\nObjectId id = (existingId != null)\n  ? existingId\n  : delegate.insertSlave(slave);","handlingStrategy":"validation","validationCode":"ObjectId existingId = delegate.getSlaveID(slave.getName());\nif (existingId != null) { /* update existing slave instead of inserting */ }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Upsert by name: look up before insert","Make cluster import scripts idempotent","Avoid concurrent slave registration from multiple clients","Catch KettleObjectExistsException and reuse the existing ID"],"tags":["repository","duplicate","slave-server","conflict"],"backgroundTag":"file-already-exists","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"}