{"record":{"id":"6c09a28eb7413973","repo":"apache/beam","slug":"failed-to-extend-visibility-timeout-for-messages-with","errorCode":null,"errorMessage":"Failed to extend visibility timeout for {} messages with expired receipt handles.","messagePattern":"Failed to extend visibility timeout for (.+?) messages with expired receipt handles\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java","lineNumber":861,"sourceCode":"          response.failed().stream()\n              .collect(partitioningBy(this::isHandleInvalid, mapping(e -> e.id(), toSet())));\n\n      // Keep failed IDs only, but discard invalid (expired) receipt handles\n      pendingExtends.keySet().retainAll(failures.getOrDefault(FALSE, ImmutableSet.of()));\n\n      // Skip stats update and inFlight management if explicitly expiring messages for immediate\n      // redelivery\n      if (extensionSec > 0) {\n        numExtendedDeadlines.add(nowMsSinceEpoch, response.successful().size());\n\n        Set<String> invalidMsgIds = failures.getOrDefault(TRUE, ImmutableSet.of());\n        if (invalidMsgIds.size() > 0) {\n          // consider invalid (expired) messages no longer in flight\n          numLateDeadlines.add(nowMsSinceEpoch, invalidMsgIds.size());\n          for (String msgId : invalidMsgIds) {\n            inFlight.remove(msgId);\n          }\n          LOG.warn(\n              \"Failed to extend visibility timeout for {} messages with expired receipt handles.\",\n              invalidMsgIds.size());\n        }\n      }\n\n      retries += 1;\n    }\n  }\n\n  @VisibleForTesting\n  long getVisibilityTimeoutMs() {\n    return visibilityTimeoutMs;\n  }\n\n  /** Log stats if time to do so. */\n  private void stats() {\n    long nowMsSinceEpoch = now();\n    if (lastLogTimestampMsSinceEpoch < 0) {","sourceCodeStart":843,"sourceCodeEnd":879,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java#L843-L879","documentation":"WARN logged by the SQS unbounded reader when a ChangeMessageVisibilityBatch response contains failures whose receipt handles have expired: those messages can no longer have their visibility timeout extended and will be redelivered by SQS. The reader partitions failures by handle validity and drops the expired ones from its pending-extend tracking (numExtendedDeadlines only counts real successes), relying on SQS at-least-once redelivery instead.","triggerScenarios":"Thrown at sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java:861 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["No code change needed for expired handles: SQS redelivers those messages and the reader reprocesses them","If expiry is premature, extend visibility timeout earlier (smaller extension intervals) or increase the initial visibility timeout on the queue","Make the downstream pipeline idempotent since redelivery means possible duplicates"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}