{"record":{"id":"5b928792703db56f","repo":"XX-net/XX-Net","slug":"report-out-of-quota-s","errorCode":null,"errorMessage":"report_out_of_quota:%s","messagePattern":"report_out_of_quota:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"code/default/gae_proxy/local/appid_manager.py","lineNumber":67,"sourceCode":"                        time.sleep(1)\n                    return None\n                else:\n                    self.logger.warn(\"reset appid\")\n                    self.reset_appid()\n\n            appid = random.choice(self.working_appid_list)\n            return str(appid)\n        else:\n            for _ in range(0, 10):\n                appid = self.public_appid.get()\n                if appid in self.out_of_quota_appids or appid in self.not_exist_appids:\n                    continue\n                else:\n                    return appid\n            return None\n\n    def report_out_of_quota(self, appid):\n        self.logger.warn(\"report_out_of_quota:%s\", appid)\n        with self.lock:\n            if appid not in self.out_of_quota_appids:\n                self.out_of_quota_appids.append(appid)\n            try:\n                self.working_appid_list.remove(appid)\n            except:\n                pass\n\n    def report_not_exist(self, appid, ip):\n        self.logger.debug(\"report_not_exist:%s %s\", appid, ip)\n        th = threading.Thread(target=self.process_appid_not_exist, args=(appid, ip), name=\"process_appid_not_exist\")\n        th.start()\n\n    def process_appid_not_exist(self, appid, ip):\n        ret = self.check_api(ip, \"xxnet-1\")\n        if ret and ret.ok:\n            self.set_appid_not_exist(appid)\n        else:","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/gae_proxy/local/appid_manager.py#L49-L85","documentation":"An appid was reported as out of quota by the GAE fetch path: it's logged, added to out_of_quota_appids, and removed from working_appid_list so it won't be selected until reset.","triggerScenarios":"request_gae_server / request_gae_proxy receiving a quota-exceeded response (typically HTTP 503 from GAE) for a given appid.","commonSituations":"Daily GAE free quota exhausted on that appid; shared/overused appid; one appid absorbing all traffic because of misconfigured rotation.","solutions":["Configure additional appids so traffic is distributed","Wait for daily quota reset (Pacific midnight) or 10-minute local reset","Spread appids across separate GCP projects","Reduce traffic or use x-tunnel/other front for heavy downloads"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Distribute traffic across many appids","Track out_of_quota_appids and alert when it equals the configured set","Wait out the quota reset instead of retrying immediately"],"tags":["gae-proxy","appid","quota"],"backgroundTag":"api-quota-exceeded","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}