{"record":{"id":"9baa7cfe2d31df95","repo":"apolloconfig/apollo","slug":"release-is-not-active","errorCode":null,"errorMessage":"release is not active","messagePattern":"release is not active","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseService.java","lineNumber":458,"sourceCode":"    release.setNamespaceName(namespace.getNamespaceName());\n    release.setConfigurations(GSON.toJson(configurations));\n    release = releaseRepository.save(release);\n\n    namespaceLockService.unlock(namespace.getId());\n    auditService.audit(Release.class.getSimpleName(), release.getId(), Audit.OP.INSERT,\n        release.getDataChangeCreatedBy());\n\n    return release;\n  }\n\n  @Transactional\n  public Release rollback(long releaseId, String operator) {\n    Release release = findOne(releaseId);\n    if (release == null) {\n      throw NotFoundException.releaseNotFound(releaseId);\n    }\n    if (release.isAbandoned()) {\n      throw new BadRequestException(\"release is not active\");\n    }\n\n    String appId = release.getAppId();\n    String clusterName = release.getClusterName();\n    String namespaceName = release.getNamespaceName();\n\n    PageRequest page = PageRequest.of(0, 2);\n    List<Release> twoLatestActiveReleases =\n        findActiveReleases(appId, clusterName, namespaceName, page);\n    if (twoLatestActiveReleases == null || twoLatestActiveReleases.size() < 2) {\n      throw new BadRequestException(\n          \"Can't rollback namespace(appId=%s, clusterName=%s, namespaceName=%s) because there is only one active release\",\n          appId, clusterName, namespaceName);\n    }\n\n    release.setAbandoned(true);\n    release.setDataChangeLastModifiedBy(operator);\n","sourceCodeStart":440,"sourceCodeEnd":476,"githubUrl":"https://github.com/apolloconfig/apollo/blob/d95fc18d112589efc09ddcbe1507047584d55251/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ReleaseService.java#L440-L476","documentation":"Thrown as BadRequestException (HTTP 400) by ReleaseService.rollback when the target release.isAbandoned() is true. Rollback can only operate on an active release; an already-abandoned release cannot be rolled back again.","triggerScenarios":"Calling rollback(releaseId) for a release whose abandoned flag is already set (it was previously rolled back or abandoned).","commonSituations":"Re-rolling back an already-rolled-back release; pointing tooling at a stale release id that has since been abandoned.","solutions":["Pick the current latest ACTIVE release as the rollback target (query findActiveReleases).","If you want that older configuration, publish a new release with the desired config instead of rolling back an abandoned one."],"exampleFix":"// before\nreleaseService.rollback(abandonedReleaseId, operator); // 400\n// after\nRelease active = releaseService.findLatestActiveRelease(appId, cluster, ns);\nreleaseService.rollback(active.getId(), operator);","handlingStrategy":"validation","validationCode":"Release release = releaseService.findOne(releaseId);\nif (release == null || release.isAbandoned()) {\n  // resolve the latest ACTIVE release before rollback\n}","typeGuard":null,"tryCatchPattern":"try {\n  releaseService.rollback(releaseId, operator);\n} catch (BadRequestException e) {\n  if (\"release is not active\".equals(e.getMessage())) {\n    // pick latest active release and retry\n  } else throw e;\n}","preventionTips":["Always resolve the latest active release before offering rollback.","Avoid reusing cached/stale release ids."],"tags":["release","rollback","bad-request","apollo-biz","validation"],"backgroundTag":null,"analyzedSha":"d95fc18d112589efc09ddcbe1507047584d55251","analyzedAt":"2026-08-14T04:00:05.477Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}