{"record":{"id":"2eb71625dc333c4e","repo":"conductor-oss/conductor","slug":"file-already-uploaded","errorCode":null,"errorMessage":"File already uploaded: {}","messagePattern":"File already uploaded: (.+?)","errorType":"exception","errorClass":"ConflictException","httpStatus":409,"severity":"warning","filePath":"core/src/main/java/org/conductoross/conductor/core/storage/FileStorageServiceImpl.java","lineNumber":102,"sourceCode":"    public FileUploadUrlResponse getUploadUrl(String workflowId, String fileId) {\n        FileModel model = getOwnedFile(workflowId, fileId);\n        String uploadUrl =\n                fileStorage.generateUploadUrl(\n                        model.getStoragePath(), properties.getSignedUrlExpiration());\n        long expiresAt = Instant.now().plus(properties.getSignedUrlExpiration()).toEpochMilli();\n\n        FileUploadUrlResponse response = new FileUploadUrlResponse();\n        response.setFileHandleId(FileIdToFileHandleIdConverter.toFileHandleId(fileId));\n        response.setUploadUrl(uploadUrl);\n        response.setExpiresAt(expiresAt);\n        return response;\n    }\n\n    @Override\n    public FileUploadCompleteResponse confirmUpload(String workflowId, String fileId) {\n        FileModel model = getOwnedFile(workflowId, fileId);\n        if (model.getUploadStatus() == FileUploadStatus.UPLOADED) {\n            throw new ConflictException(\"File already uploaded: \" + fileId);\n        }\n\n        StorageFileInfo info = fileStorage.getStorageFileInfo(model.getStoragePath());\n        if (info == null || !info.isExists()) {\n            throw new NonTransientException(\"File not found on storage backend: \" + fileId);\n        }\n\n        fileMetadataDAO.updateUploadComplete(\n                fileId, FileUploadStatus.UPLOADED, info.getContentHash(), info.getContentSize());\n\n        FileUploadCompleteResponse response = new FileUploadCompleteResponse();\n        response.setFileHandleId(FileIdToFileHandleIdConverter.toFileHandleId(fileId));\n        response.setUploadStatus(FileUploadStatus.UPLOADED);\n        response.setContentHash(info.getContentHash());\n        return response;\n    }\n\n    @Override","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/core/src/main/java/org/conductoross/conductor/core/storage/FileStorageServiceImpl.java#L84-L120","documentation":"Thrown by FileStorageServiceImpl.confirmUpload when the file's upload status is already UPLOADED. Confirming an already-completed upload is idempotent-rejected as a ConflictException (HTTP 409) to prevent double-completion or duplicate metadata updates.","triggerScenarios":"Calling confirmUpload a second time for the same fileId; retrying confirmUpload after it already succeeded; client double-submitting the confirm request.","commonSituations":"At-least-once delivery with no idempotency guard on the client; frontend retry after a timeout where the first call actually succeeded; orchestrator replay of the confirm step.","solutions":["Treat a 409 'already uploaded' as success in the client (idempotent completion).","Track confirm state client-side to avoid redundant confirm calls.","Use the returned status to short-circuit subsequent retries."],"exampleFix":"// before\nfileStorageService.confirmUpload(wfId, fileId); // throws on second call\n\n// after - treat 409 as already-complete\ntry {\n    fileStorageService.confirmUpload(wfId, fileId);\n} catch (ConflictException e) {\n    // already uploaded; nothing to do\n}","handlingStrategy":"try-catch","validationCode":"FileHandle meta = fileStorageService.getFileMetadata(wfId, fileId);\nboolean alreadyDone = meta.getUploadStatus() == FileUploadStatus.UPLOADED;","typeGuard":null,"tryCatchPattern":"try {\n    fileStorageService.confirmUpload(wfId, fileId);\n} catch (ConflictException e) {\n    // already uploaded; treat as success\n}","preventionTips":["Make confirm idempotent on the client (409 = done)","Avoid retrying confirm after success"],"tags":["file-storage","upload","conflict","idempotency","conductor","java"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}