redis/redis-py · error · DataError
XCFGSET requires at least one of idmp_duration or…
Error message
XCFGSET requires at least one of idmp_duration or idmp_maxsize
What it means
Raised by xcfgset() when both idmp_duration and idmp_maxsize are None. XCFGSET configures a stream's IDMP map and must set at least one of the two parameters (retention duration or max size); a call with neither is a no-op and therefore rejected. It is a DataError.
Solutions
- Pass at least one of idmp_duration (int seconds, 1-300) or idmp_maxsize (int, 1-1000000).
- If the values come from optional config, ensure at least one is non-None before calling.
Example fix
# before
client.xcfgset('mystream')
# after
client.xcfgset('mystream', idmp_duration=120, idmp_maxsize=1000) Defensive patterns
Strategy: validation
Validate before calling
if idmp_duration is None and idmp_maxsize is None:
raise ValueError('xcfgset requires at least one of idmp_duration or idmp_maxsize')
client.xcfgset(name, idmp_duration=idmp_duration, idmp_maxsize=idmp_maxsize) Try / catch
from redis.exceptions import DataError
try:
client.xcfgset(name, idmp_duration=idmp_duration, idmp_maxsize=idmp_maxsize)
except DataError as e:
if 'requires at least one' in str(e):
client.xcfgset(name, idmp_duration=100) Prevention
- Ensure at least one of idmp_duration/idmp_maxsize is non-None from config before calling.
- Default to sensible values (e.g. duration=100, maxsize=1000) rather than leaving both unset.
When it happens
Trigger: Calling client.xcfgset('mystream') with no keyword arguments, or client.xcfgset('mystream', None, None).
Common situations: Calling xcfgset with config values that resolved to None, or invoking it speculatively without parameters.
Related errors
- IDMPAUTO and IDMP can only be used with id='*'
- Only one of ```idmpauto``` or ```idmp``` may be specified
- XACKDEL requires at least one message ID
- XADD fields must be a non-empty dict
- XADD idmp must be a tuple of (producer_id, idempotent_id)
AI-assisted analysis of redis/redis-py@6a6b581b48 (2026-08-10).
Data as JSON: /api/errors/22b6cb3ac3d3945e.
Report an issue: GitHub.
Appendix: source
Thrown at redis/commands/core.py:7110
idmp_duration: How long Redis remembers each iid in seconds.
Default: 100 seconds (or value set by stream-idmp-duration config).
Minimum: 1 second, Maximum: 300 seconds.
Redis won't forget an iid for this duration (unless maxsize is reached).
Should accommodate application crash recovery time.
idmp_maxsize: Maximum number of iids Redis remembers per producer ID (pid).
Default: 100 iids (or value set by stream-idmp-maxsize config).
Minimum: 1 iid, Maximum: 1,000,000 (1M) iids.
Should be set to: mark-delay [in msec] × (messages/msec) + margin.
Example: 10K msgs/sec (10 msgs/msec), 80 msec mark-delay
→ maxsize = 10 × 80 + margin = 1000 iids.
Returns:
OK on success.
For more information, see https://redis.io/commands/xcfgset
"""
if idmp_duration is None and idmp_maxsize is None:
raise DataError(
"XCFGSET requires at least one of idmp_duration or idmp_maxsize"
)
pieces: list[EncodableT] = []
if idmp_duration is not None:
if (
not isinstance(idmp_duration, int)
or idmp_duration < 1
or idmp_duration > 300
):
raise DataError(
"XCFGSET idmp_duration must be an integer between 1 and 300"
)
pieces.extend([b"IDMP-DURATION", idmp_duration])
if idmp_maxsize is not None:
if (View on GitHub (pinned to 6a6b581b48)