{"id":"0351ff9fbc646e6f","repo":"redis/redis-py","slug":"slot-slot-is-not-covered-by-the-cluster","errorCode":null,"errorMessage":"Slot \"{slot}\" is not covered by the cluster.","messagePattern":"Slot \"(.+?)\" is not covered by the cluster\\.","errorType":"exception","errorClass":"SlotNotCoveredError","httpStatus":null,"severity":"error","filePath":"redis/asyncio/cluster.py","lineNumber":845,"sourceCode":"\n    def get_node_from_key(\n        self, key: str, replica: bool = False\n    ) -> Optional[\"ClusterNode\"]:\n        \"\"\"\n        Get the cluster node corresponding to the provided key.\n\n        :param key:\n        :param replica:\n            | Indicates if a replica should be returned\n            |\n              None will returned if no replica holds this key\n\n        :raises SlotNotCoveredError: if the key is not covered by any slot.\n        \"\"\"\n        slot = self.keyslot(key)\n        slot_cache = self.nodes_manager.slots_cache.get(slot)\n        if not slot_cache:\n            raise SlotNotCoveredError(f'Slot \"{slot}\" is not covered by the cluster.')\n\n        if replica:\n            if len(self.nodes_manager.slots_cache[slot]) < 2:\n                return None\n            node_idx = 1\n        else:\n            node_idx = 0\n\n        return slot_cache[node_idx]\n\n    def get_random_primary_or_all_nodes(self, command_name):\n        \"\"\"\n        Returns random primary or all nodes depends on READONLY mode.\n        \"\"\"\n        if self.read_from_replicas and command_name in READ_COMMANDS:\n            return self.get_random_node()\n\n        return self.get_random_primary_node()","sourceCodeStart":827,"sourceCodeEnd":863,"githubUrl":"https://github.com/redis/redis-py/blob/da03cdc7e8731092b13e395605c3c1fb2de25de1/redis/asyncio/cluster.py#L827-L863","documentation":"Raised by RedisCluster.get_node_from_key (redis/asyncio/cluster.py:845) when the key's computed slot is absent from slots_cache. The cluster client maps a key to a slot and looks up which node serves it; if topology discovery has not populated that slot (or the cluster genuinely does not cover it), it raises SlotNotCoveredError naming the slot.","triggerScenarios":"Calling get_node_from_key before initial CLUSTER SLOTS discovery completed, or against a cluster that does not cover all 16384 slots (e.g., a partially set-up or degraded cluster). slots_cache.get(slot) returns None.","commonSituations":"Querying a slot immediately after constructing the client (race with discovery); cluster in a mid-resharding state; cluster with fewer nodes than slots; slots_cache stale after failover until refreshed.","solutions":["Ensure full slot coverage: run `redis-cli --cluster check` and fix missing slots.","Wait for / trigger topology refresh before key-based node lookup (the client refreshes on MOVED, or call CLUSTER SLOTS explicitly).","Use regular command execution (get/set) which retries on MOVED and refreshes the slot map, instead of manual get_node_from_key.","Retry after a short backoff to allow discovery to populate."],"exampleFix":"// before\nnode = c.get_node_from_key('mykey')  # raises if slot unknown\n// after\nawait c.get('mykey')  # let the client refresh slots via MOVED handling\nnode = c.get_node_from_key('mykey')","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"from redis.exceptions import SlotNotCoveredError\nfor _ in range(MAX_RETRIES):\n    try:\n        await c.get('mykey')  # refreshes slots via MOVED handling\n        node = c.get_node_from_key('mykey')\n        break\n    except SlotNotCoveredError:\n        await asyncio.sleep(backoff)\n        continue","preventionTips":["Ensure the cluster covers all 16384 slots (redis-cli --cluster check).","Let the client self-heal via MOVED-driven slot refresh rather than manual get_node_from_key.","Retry briefly after construction to let initial discovery complete."],"tags":["redis","asyncio","cluster","topology","slots","routing","discovery"],"analyzedSha":"da03cdc7e8731092b13e395605c3c1fb2de25de1","analyzedAt":"2026-08-04T20:26:47.563Z","schemaVersion":2}