{"record":{"id":"7260efd49c2d2eef","repo":"floci-io/floci","slug":"alreadyexistsexception","errorCode":"AlreadyExistsException","errorMessage":"Backup vault already exists: {vaultName}","messagePattern":"Backup vault already exists: (.+?)","errorType":"exception","errorClass":"AwsException","httpStatus":400,"severity":"error","filePath":"src/main/java/io/github/hectorvent/floci/services/backup/BackupService.java","lineNumber":71,"sourceCode":"        this.jobStore       = storageFactory.create(\"backup\", \"backup-jobs.json\",       new TypeReference<>() {});\n        this.recoveryStore  = storageFactory.create(\"backup\", \"backup-recovery-points.json\", new TypeReference<>() {});\n        this.regionResolver = regionResolver;\n        this.jobCompletionDelaySeconds = config.services().backup().jobCompletionDelaySeconds();\n    }\n\n    @PreDestroy\n    void shutdown() {\n        scheduler.shutdownNow();\n    }\n\n    // ── Vault ──────────────────────────────────────────────────────────────────\n\n    public BackupVault createBackupVault(String vaultName, String encryptionKeyArn,\n                                         String creatorRequestId, Map<String, String> tags,\n                                         String region) {\n        String key = vaultKey(region, vaultName);\n        if (vaultStore.get(key).isPresent()) {\n            throw new AwsException(\"AlreadyExistsException\", \"Backup vault already exists: \" + vaultName, 400);\n        }\n        BackupVault vault = new BackupVault();\n        vault.setBackupVaultName(vaultName);\n        vault.setBackupVaultArn(regionResolver.buildArn(\"backup\", region, \"backup-vault:\" + vaultName));\n        vault.setEncryptionKeyArn(encryptionKeyArn);\n        vault.setCreationDate(Instant.now().getEpochSecond());\n        vault.setCreatorRequestId(creatorRequestId);\n        vault.setNumberOfRecoveryPoints(0);\n        vault.setTags(tags);\n        vaultStore.put(key, vault);\n        LOG.infov(\"Created backup vault {0} in {1}\", vaultName, region);\n        return vault;\n    }\n\n    public BackupVault describeBackupVault(String vaultName, String region) {\n        return vaultStore.get(vaultKey(region, vaultName))\n                .orElseThrow(() -> new AwsException(\"ResourceNotFoundException\", \"Backup vault not found: \" + vaultName, 404));\n    }","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/floci-io/floci/blob/62ff490619e7bd3554597c28c704081b4c15add5/src/main/java/io/github/hectorvent/floci/services/backup/BackupService.java#L53-L89","documentation":"Thrown by createBackupVault when a vault with the same name already exists in the region (vault keys are region + name). AWS Backup vault names are unique per region and per account, so re-creating an existing name fails with AlreadyExistsException (HTTP 400).","triggerScenarios":"Calling CreateBackupVault twice with the same BackupVaultName in the same region; re-running an init script that creates the default vault without checking first.","commonSituations":"Idempotent-looking setup scripts that don't check existence; repeated test fixtures between emulator restarts when persistence retains state; assuming a CreatorRequestId deduplicates like it does in some AWS APIs — here the name alone collides.","solutions":["Call DescribeBackupVault / ListBackupVaults first and reuse the existing vault if present","Or catch AlreadyExistsException and treat it as success when the existing vault matches your intent","Use unique vault names per test run when isolation matters"],"exampleFix":"// before\nbackup.createBackupVault(CreateBackupVaultRequest.builder()\n    .backupVaultName(\"audit-vault\").build());\n\n// after\ntry {\n    backup.createBackupVault(CreateBackupVaultRequest.builder()\n        .backupVaultName(\"audit-vault\").build());\n} catch (AlreadyExistsException e) {\n    // vault already present — reuse it\n}","handlingStrategy":"try-catch","validationCode":"boolean exists = backup.listBackupVaults(ListBackupVaultsRequest.builder().build())\n    .backupVaultList().stream()\n    .anyMatch(v -> vaultName.equals(v.backupVaultName()));\nif (!exists) { backup.createBackupVault(...); }","typeGuard":null,"tryCatchPattern":"catch (AlreadyExistsException e) { /* idempotent create — fetch and reuse the existing vault */ }","preventionTips":["Make vault-creation steps in init scripts idempotent via existence checks","Use unique vault names per test run when persistence keeps state between restarts"],"tags":["backup","vault","already-exists","aws-emulator"],"backgroundTag":null,"analyzedSha":"62ff490619e7bd3554597c28c704081b4c15add5","analyzedAt":"2026-08-14T14:25:23.764Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}