{"record":{"id":"32be1124a95bb862","repo":"apache/seatunnel","slug":"wal-purge-acked-requires-older-than-ms-positive","errorCode":null,"errorMessage":"wal-purge-acked requires --older-than-ms <positive-ms>","messagePattern":"wal-purge-acked requires --older-than-ms <positive-ms>","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-edge-agent/seatunnel-edge-agent-starter/src/main/java/org/apache/seatunnel/edge/agent/starter/command/db/EdgeAgentDbCommand.java","lineNumber":320,"sourceCode":"                new MutationBind(now, WalRecordStatus.PENDING.name()),\n                \"RESET DEAD -> PENDING\");\n    }\n\n    private void runWalUnstickSending() throws Exception {\n        DbWriteGuard.requireWriteAllowed(paths, cli);\n        long now = System.currentTimeMillis();\n        executeStatusMutation(\n                WalRecordStatus.SENDING.name(),\n                EdgeAgentDbSql.WAL_COUNT_BY_STATUS_FILTER,\n                EdgeAgentDbSql.WAL_UNSTICK_SENDING,\n                new MutationBind(now, WalRecordStatus.PENDING.name()),\n                \"RESET SENDING -> PENDING\");\n    }\n\n    private void runWalPurgeAcked() throws Exception {\n        DbWriteGuard.requireWriteAllowed(paths, cli);\n        if (cli.getOlderThanMs() <= 0L) {\n            throw new IllegalArgumentException(\n                    \"wal-purge-acked requires --older-than-ms <positive-ms>\");\n        }\n        long cutoff = System.currentTimeMillis() - cli.getOlderThanMs();\n        try (EdgeAgentDbConnection db =\n                EdgeAgentDbConnection.openReadWrite(paths.getSqlitePath())) {\n            long count = countAckedBefore(db, cutoff);\n            if (cli.isDryRun()) {\n                System.out.println(\n                        \"DRY-RUN: would delete \"\n                                + count\n                                + \" ACKED rows with updated_at < \"\n                                + cutoff);\n                return;\n            }\n            if (!cli.isYes()) {\n                throw new IllegalArgumentException(\"Refusing write without --yes\");\n            }\n            try (PreparedStatement statement =","sourceCodeStart":302,"sourceCodeEnd":338,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-edge-agent/seatunnel-edge-agent-starter/src/main/java/org/apache/seatunnel/edge/agent/starter/command/db/EdgeAgentDbCommand.java#L302-L338","documentation":"runWalPurgeAcked purges ACKED WAL rows older than a cutoff computed as now minus --older-than-ms. A zero or negative value would make the cutoff nonsensical or purge rows from now forward, so the command requires a strictly positive millisecond duration and throws IllegalArgumentException otherwise.","triggerScenarios":"Running `agent db wal-purge-acked` without --older-than-ms, or with --older-than-ms 0 or a negative value; a script passing an unset variable that evaluates to 0.","commonSituations":"Users omit the flag assuming a default retention window exists; automation passes ${RETENTION_MS} which is unset; confusion between seconds and milliseconds producing 0.","solutions":["Re-run with a positive duration, e.g. wal-purge-acked --older-than-ms 86400000 (24h).","Fix the script default: OLDER_THAN_MS=${OLDER_THAN_MS:-86400000}.","Remember there is no default; the flag is mandatory. Run with --dry-run first to preview the row count."],"exampleFix":"// before\nagent db wal-purge-acked --yes\n// after\nagent db wal-purge-acked --older-than-ms 86400000 --yes","handlingStrategy":"validation","validationCode":"OLDER_THAN_MS=${OLDER_THAN_MS:-86400000}\nif ! [[ \"$OLDER_THAN_MS\" =~ ^[0-9]+$ ]] || [ \"$OLDER_THAN_MS\" -le 0 ]; then\n  echo \"--older-than-ms must be a positive integer\" >&2; exit 2\nfi","typeGuard":null,"tryCatchPattern":"try {\n  runWalPurgeAcked();\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"--older-than-ms\")) {\n    System.err.println(\"Pass a positive duration in ms, e.g. --older-than-ms 86400000 (24h)\");\n  }\n}","preventionTips":["Treat --older-than-ms as a mandatory flag for wal-purge-acked; never assume a default.","Use shell defaults so unset variables never become 0.","Double-check units (ms, not seconds) when computing retention values.","Run --dry-run first to verify the cutoff selects the expected rows."],"tags":["cli","validation","duration","purge"],"backgroundTag":"missing-required-argument","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}