{"record":{"id":"df4c8abffb392d6b","repo":"floci-io/floci","slug":"invalidnexttoken","errorCode":"InvalidNextToken","errorMessage":"The NextToken value is not valid.","messagePattern":"The NextToken value is not valid\\.","errorType":"exception","errorClass":"AwsException","httpStatus":400,"severity":"warning","filePath":"src/main/java/io/github/hectorvent/floci/services/autoscaling/AutoScalingService.java","lineNumber":511,"sourceCode":"            instanceRefreshes.put(instanceRefreshKey(region, asgName, refresh.getInstanceRefreshId()), refresh);\n        }\n    }\n\n    public InstanceRefreshPage describeInstanceRefreshes(String region, String asgName, List<String> refreshIds,\n                                                          Integer maxRecords, String nextToken) {\n        requireGroup(region, asgName);\n        int offset = parseNextToken(nextToken);\n        int limit = maxRecords != null ? Math.min(Math.max(maxRecords, 1), 100) : 50;\n        Set<String> requestedIds = refreshIds != null && !refreshIds.isEmpty()\n                ? new HashSet<>(refreshIds) : null;\n        List<InstanceRefresh> matches = instanceRefreshes.values().stream()\n                .filter(r -> region.equals(r.getRegion()))\n                .filter(r -> asgName.equals(r.getAutoScalingGroupName()))\n                .filter(r -> requestedIds == null || requestedIds.contains(r.getInstanceRefreshId()))\n                .sorted(Comparator.comparing(InstanceRefresh::getStartTime).reversed())\n                .collect(Collectors.toList());\n        if (offset > matches.size()) {\n            throw new AwsException(\"InvalidNextToken\", \"The NextToken value is not valid.\", 400);\n        }\n        int end = Math.min(offset + limit, matches.size());\n        String followingToken = end < matches.size() ? String.valueOf(end) : null;\n        return new InstanceRefreshPage(matches.subList(offset, end), followingToken);\n    }\n\n    // ── Load balancer attachment ───────────────────────────────────────────────\n\n    public void attachLoadBalancerTargetGroups(String region, String name, List<String> tgArns) {\n        AutoScalingGroup asg = requireGroup(region, name);\n        for (String arn : tgArns) {\n            if (!asg.getTargetGroupARNs().contains(arn)) {\n                asg.getTargetGroupARNs().add(arn);\n            }\n        }\n        groups.put(asgKey(region, name), asg);\n    }\n","sourceCodeStart":493,"sourceCodeEnd":529,"githubUrl":"https://github.com/floci-io/floci/blob/62ff490619e7bd3554597c28c704081b4c15add5/src/main/java/io/github/hectorvent/floci/services/autoscaling/AutoScalingService.java#L493-L529","documentation":"Thrown by describeInstanceRefreshes when the NextToken encodes an offset past the end of the filtered result list. Floci represents pagination tokens as integer offsets; a token whose offset exceeds the number of matching refreshes is stale or fabricated, so it returns InvalidNextToken (HTTP 400) the same way AWS rejects expired tokens.","triggerScenarios":"Calling DescribeInstanceRefreshes with a NextToken obtained from an earlier page after refreshes were deleted or the list shrank; reusing a token from a different ASG or filter set (InstanceRefreshIds); manually crafting a token value.","commonSituations":"Resuming pagination long after the first page in slow batch jobs; concurrent cleanup deleting refresh history between pages; passing an empty-but-nonnull token string of digits like '999'.","solutions":["Restart pagination from the first page (omit NextToken) when this error arrives","Keep the filter parameters (ASG name, InstanceRefreshIds, MaxRecords) identical across paged calls","Don't persist NextToken values across long-lived sessions; treat tokens as short-lived cursors"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"catch (InvalidNextTokenException e) { restart listing from page 1 without NextToken; }","preventionTips":["Hold pagination parameters constant across a paged walk","Abandon and restart pagination when the underlying list may have changed"],"tags":["autoscaling","pagination","next-token","aws-emulator"],"backgroundTag":null,"analyzedSha":"62ff490619e7bd3554597c28c704081b4c15add5","analyzedAt":"2026-08-14T14:25:23.764Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}