redis/redis-py · error · DataError
XCLAIM time must be an integer
Error message
XCLAIM time must be an integer
What it means
Raised by xclaim() when the optional `time` argument (absolute Unix-ms idle time) is provided but is not an int. Strict isinstance(int) at core.py:7309.
Source
Thrown at redis/commands/core.py:7310
if not isinstance(min_idle_time, int) or min_idle_time < 0:
raise DataError("XCLAIM min_idle_time must be a non negative integer")
if not isinstance(message_ids, (list, tuple)) or not message_ids:
raise DataError(
"XCLAIM message_ids must be a non empty list or "
"tuple of message IDs to claim"
)
kwargs = {}
pieces: list[EncodableT] = [name, groupname, consumername, str(min_idle_time)]
pieces.extend(list(message_ids))
if idle is not None:
if not isinstance(idle, int):
raise DataError("XCLAIM idle must be an integer")
pieces.extend((b"IDLE", str(idle)))
if time is not None:
if not isinstance(time, int):
raise DataError("XCLAIM time must be an integer")
pieces.extend((b"TIME", str(time)))
if retrycount is not None:
if not isinstance(retrycount, int):
raise DataError("XCLAIM retrycount must be an integer")
pieces.extend((b"RETRYCOUNT", str(retrycount)))
if force:
if not isinstance(force, bool):
raise DataError("XCLAIM force must be a boolean")
pieces.append(b"FORCE")
if justid:
if not isinstance(justid, bool):
raise DataError("XCLAIM justid must be a boolean")
pieces.append(b"JUSTID")
kwargs["parse_justid"] = True
return self.execute_command("XCLAIM", *pieces, **kwargs)
@overloadView on GitHub (pinned to da03cdc7e8)
Solutions
- Pass an int Unix-ms, or None to omit.
- Coerce: time = int(raw) if raw is not None else None - especially time.time()*1000 which is a float.
Example fix
# before
r.xclaim('s','g','c', 0, ['1-0'], time=time.time()*1000) # float
# after
r.xclaim('s','g','c', 0, ['1-0'], time=int(time.time()*1000)) Defensive patterns
Strategy: type-guard
Validate before calling
ts = int(time.time()*1000) if use_time else None r.xclaim(name, group, consumer, ms, ids, time=ts)
Type guard
def opt_int(v): return v if v is None else int(v)
Try / catch
from redis.exceptions import DataError
try:
r.xclaim(name, group, consumer, ms, ids, time=ts)
except DataError:
r.xclaim(name, group, consumer, ms, ids, time=int(ts)) Prevention
- time.time()*1000 is a float - always wrap in int().
When it happens
Trigger: xclaim(..., time='1700000000000') (str), =time_val as float. time=None or omitted is valid.
Common situations: Passing int(time.time()*1000) that returned a float; reading a timestamp string; a datetime-derived float.
Related errors
- XCLAIM min_idle_time must be a non negative integer
- XCLAIM idle must be an integer
- XCLAIM retrycount must be an integer
- XCLAIM force must be a boolean
- XCLAIM justid must be a boolean
AI-assisted analysis of redis/redis-py@da03cdc7e8 (2026-08-04).
Data as JSON: /data/errors/5d1c1ab2a6c8a8b1.json.
Report an issue: GitHub.