{"record":{"id":"6dd4ae07e29fb10f","repo":"xai-org/x-algorithm","slug":"retry-interval-must-be-greater-than-0","errorCode":null,"errorMessage":"Retry interval must be greater than 0","messagePattern":"Retry interval must be greater than 0","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"grox/libs/kerberos_cli/kerberos.py","lineNumber":32,"sourceCode":"    renew_interval: int = 3600\n    attempts: int = 5\n    retry_interval: int = 60\n\n\nclass KerberosRenewer:\n    def __init__(self, keytab_path: str, principal: str, **kwargs):\n        self._renewer: asyncio.Task | None = None\n        self.config = KerberosConfig(\n            keytab_path=keytab_path, principal=principal, **kwargs\n        )\n        if not Path(self.config.keytab_path).exists():\n            raise FileNotFoundError(f\"Keytab file not found: {self.config.keytab_path}\")\n        if self.config.renew_interval <= 0:\n            raise ValueError(\"Renew interval must be greater than 0\")\n        if self.config.attempts <= 0:\n            raise ValueError(\"Attempts must be greater than 0\")\n        if self.config.retry_interval <= 0:\n            raise ValueError(\"Retry interval must be greater than 0\")\n\n    async def _kerberos_renewal_loop(self):\n        while True:\n            attempts = self.config.attempts\n            while attempts > 0:\n                attempts -= 1\n                try:\n                    await self._renew_kerberos_ticket()\n                    logger.info(\n                        f\"Kerberos ticket renewed successfully for {self.config.principal}\"\n                    )\n                    break\n                except Exception:\n                    if attempts == 0:\n                        logger.error(\n                            f\"Kerberos renewal failed after {self.config.attempts} attempts: {traceback.format_exc()}\"\n                        )\n                    else:","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/grox/libs/kerberos_cli/kerberos.py#L14-L50","documentation":"retry_interval is the sleep between failed kinit attempt batches. __init__ requires it to be positive; <= 0 would cause a tight retry loop hammering the KDC. The check runs after keytab existence and interval/attempts checks in the same validation block.","triggerScenarios":"KerberosClient(..., retry_interval=0) or negative — commonly a missing config key defaulting to 0, or seconds/milliseconds confusion.","commonSituations":"Defaults object where retry_interval was added later and old configs lack it; someone setting 0 intending 'retry immediately' which this library forbids.","solutions":["Set retry_interval to a positive value (e.g. 30–60 seconds).","Audit shared KerberosConfig defaults so all three numeric fields have positive fallbacks."],"exampleFix":"# before\nclient = KerberosClient(kt, principal, retry_interval=0)  # ValueError\n\n# after\nclient = KerberosClient(kt, principal, retry_interval=30)","handlingStrategy":"validation","validationCode":"retry_interval = retry_interval if retry_interval and retry_interval > 0 else 30\nclient = KerberosClient(kt, principal, retry_interval=retry_interval)","typeGuard":null,"tryCatchPattern":"try:\n    client = KerberosClient(kt, p, retry_interval=ri)\nexcept ValueError as e:\n    if 'Retry interval' in str(e):\n        client = KerberosClient(kt, p, retry_interval=30)\n    else:\n        raise","preventionTips":["Coerce missing numeric configs to sane positive defaults","Never set retry sleeps to 0 in shared templates"],"tags":["kerberos","config-validation","backoff"],"backgroundTag":"invalid-config-value","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}