{"record":{"id":"9597adf9717760c6","repo":"aeron-io/aeron","slug":"checksum-class-name-must-be-specified","errorCode":null,"errorMessage":"Checksum class name must be specified!","messagePattern":"Checksum class name must be specified!","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"aeron-archive/src/main/java/io/aeron/archive/ArchiveTool.java","lineNumber":1054,"sourceCode":"                        he.state(targetState);\n                        out.println(\"(recordingId=\" + recordingId + \") changed state to \" + targetState);\n                    }\n                }\n            });\n\n            if (!found.get())\n            {\n                throw new AeronException(\"no recording found with recordingId: \" + recordingId);\n            }\n        }\n    }\n\n    private static String validateChecksumClass(final String checksumClassName)\n    {\n        final String className = null == checksumClassName ? null : checksumClassName.trim();\n        if (Strings.isEmpty(className))\n        {\n            throw new IllegalArgumentException(\"Checksum class name must be specified!\");\n        }\n\n        return className;\n    }\n\n    private static Checksum createChecksum(final Set<VerifyOption> options, final String checksumClassName)\n    {\n        if (null == checksumClassName)\n        {\n            if (options.contains(APPLY_CHECKSUM))\n            {\n                throw new IllegalArgumentException(\n                    \"Checksum class name is required when \" + APPLY_CHECKSUM + \" option is specified!\");\n            }\n\n            return null;\n        }\n","sourceCodeStart":1036,"sourceCodeEnd":1072,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-archive/src/main/java/io/aeron/archive/ArchiveTool.java#L1036-L1072","documentation":"validateChecksumClass throws IllegalArgumentException when the checksum class name argument is null, empty, or only whitespace. Verify/checksum operations need a concrete Checksum implementation class name to instantiate. The tool refuses to proceed without one.","triggerScenarios":"Running ArchiveTool checksum/checksumRecording/verify without supplying --checksum-class (or supplying an empty/blank value), when the code path calls validateChecksumClass.","commonSituations":"Forgot the CLI flag for checksum operations; passed an empty string from a script variable; whitespace-only value from config.","solutions":["Pass a checksum class name, e.g. io.aeron.security.XmlChecksum or your own Checksum implementation class.","Trim and non-empty-check the config value before invoking the tool.","Only invoke checksum operations when a checksum provider is actually configured."],"exampleFix":"// before\nString checksumClass = config.get(\"checksum.class\"); // null -> throws\nArchiveTool.checksum(out, archiveDir, options, checksumClass);\n// after\nString checksumClass = config.getOrDefault(\"checksum.class\", \"io.aeron.archive.checksum.Sha256Checksum\");\nArchiveTool.checksum(out, archiveDir, options, checksumClass);","handlingStrategy":"validation","validationCode":"if (checksumClassName == null || checksumClassName.trim().isEmpty()) {\n    throw new IllegalArgumentException(\"--checksum-class is required for checksum operations\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    ArchiveTool.checksum(out, archiveDir, options, checksumClassName);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"Checksum class name must be specified\")) {\n        // re-run with a configured class name\n    } else throw e;\n}","preventionTips":["Make the checksum class a required config entry wherever checksum operations are scripted.","Trim and non-empty-check config values before passing them to ArchiveTool.","Document the checksum provider class in runbooks for verify/checksum commands."],"tags":["aeron","archive","checksum","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}