xai-org/x-algorithm · error · ValueError

Attempts must be greater than 0

Error message

Attempts must be greater than 0

What it means

attempts sets how many times the renewal loop retries a failed kinit before backing off. __init__ requires attempts > 0; zero or negative values would mean a failed renewal is never retried, silently losing the ticket. Raised at construction.

Source

Thrown at grox/libs/kerberos_cli/kerberos.py:30

    keytab_path: str
    principal: str
    renew_interval: int = 3600
    attempts: int = 5
    retry_interval: int = 60


class KerberosRenewer:
    def __init__(self, keytab_path: str, principal: str, **kwargs):
        self._renewer: asyncio.Task | None = None
        self.config = KerberosConfig(
            keytab_path=keytab_path, principal=principal, **kwargs
        )
        if not Path(self.config.keytab_path).exists():
            raise FileNotFoundError(f"Keytab file not found: {self.config.keytab_path}")
        if self.config.renew_interval <= 0:
            raise ValueError("Renew interval must be greater than 0")
        if self.config.attempts <= 0:
            raise ValueError("Attempts must be greater than 0")
        if self.config.retry_interval <= 0:
            raise ValueError("Retry interval must be greater than 0")

    async def _kerberos_renewal_loop(self):
        while True:
            attempts = self.config.attempts
            while attempts > 0:
                attempts -= 1
                try:
                    await self._renew_kerberos_ticket()
                    logger.info(
                        f"Kerberos ticket renewed successfully for {self.config.principal}"
                    )
                    break
                except Exception:
                    if attempts == 0:
                        logger.error(
                            f"Kerberos renewal failed after {self.config.attempts} attempts: {traceback.format_exc()}"

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Set attempts to a positive integer (e.g. 3–5 retries before the retry_interval wait).
  2. If you wanted unlimited retries, keep attempts positive and rely on the outer while True loop which resets attempts each cycle.

Example fix

# before
client = KerberosClient(kt, principal, attempts=0)  # ValueError

# after
client = KerberosClient(kt, principal, attempts=3)
Defensive patterns

Strategy: validation

Validate before calling

attempts = attempts if attempts and attempts > 0 else 3
client = KerberosClient(kt, principal, attempts=attempts)

Try / catch

try:
    client = KerberosClient(kt, p, attempts=a)
except ValueError as e:
    if 'Attempts' in str(e):
        client = KerberosClient(kt, p, attempts=3)
    else:
        raise

Prevention

When it happens

Trigger: KerberosClient(..., attempts=0) or negative, e.g. from a config where attempts was meant to be 'infinite' and someone used 0.

Common situations: Config refactor that dropped the attempts key and defaulted it to 0; environment-specific override files with attempts: 0 to 'disable retries' — not supported here.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/bc203920a9f2f9c3. Report an issue: GitHub.