{"record":{"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":846,"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":828,"sourceCodeEnd":864,"githubUrl":"https://github.com/redis/redis-py/blob/6a6b581b48225afa0b76912d1028c6035baee932/redis/asyncio/cluster.py#L828-L864","documentation":"Raised by get_node_from_key when the computed key_slot has no entry in the slots cache — i.e. no node is known to own that hash slot. SlotNotCoveredError subclasses RedisClusterException. Typically a symptom that topology discovery has not run, is stale, or the cluster genuinely has uncovered slots (require_full_coverage=False).","triggerScenarios":"Calling get_node_from_key(key) before the initial CLUSTER NODES/SLOTS discovery populated slots_cache; calling it right after construction without any command having triggered discovery; a cluster with require_full_coverage=False where some slots have no owner.","commonSituations":"Using get_node_from_key for manual routing without first issuing a command that triggers topology refresh; cluster still forming/scaling; slots_cache evicted after a failed rediscovery.","solutions":["Trigger discovery first: run any cluster command (e.g. await client.cluster_nodes()) or call client.get_nodes() before get_node_from_key.","If slots can legitimately be uncovered, handle SlotNotCoveredError and retry after a refresh.","Ensure require_full_coverage=True (default) for clusters that should cover all 16384 slots."],"exampleFix":"// before\nnode = client.get_node_from_key('user:42')\n// after\nawait client.cluster_nodes()  # ensure topology is populated\nnode = client.get_node_from_key('user:42')","handlingStrategy":"validation","validationCode":"await client.cluster_nodes()  # force topology discovery\nslot = client.keyslot(key)\nif client.nodes_manager.slots_cache.get(slot) is None:\n    raise ValueError(f'slot {slot} for key {key!r} not covered')\nnode = client.get_node_from_key(key)","typeGuard":"def slot_is_covered(client, key) -> bool:\n    return client.nodes_manager.slots_cache.get(client.keyslot(key)) is not None","tryCatchPattern":"from redis.exceptions import SlotNotCoveredError\nfor _ in range(max_attempts):\n    try:\n        node = client.get_node_from_key(key)\n        break\n    except SlotNotCoveredError:\n        await client.cluster_nodes()  # refresh topology\nelse:\n    raise","preventionTips":["Trigger discovery (any cluster command) before manual key->node routing.","Handle SlotNotCoveredError by refreshing topology and retrying."],"tags":["cluster","topology","slots","routing","discovery"],"backgroundTag":null,"analyzedSha":"6a6b581b48225afa0b76912d1028c6035baee932","analyzedAt":"2026-08-10T12:52:44.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}