{"record":{"id":"5521474ad685bffa","repo":"redis/redis-py","slug":"no-slave-found-for-self-service-name-r","errorCode":null,"errorMessage":"No slave found for {self.service_name!r}","messagePattern":"No slave found for (.+?)","errorType":"exception","errorClass":"SlaveNotFoundError","httpStatus":null,"severity":"error","filePath":"redis/asyncio/sentinel.py","lineNumber":170,"sourceCode":"                await self.disconnect(inuse_connections=False)\n        return master_address\n\n    async def rotate_slaves(self) -> AsyncIterator:\n        \"\"\"Round-robin slave balancer\"\"\"\n        slaves = await self.sentinel_manager.discover_slaves(self.service_name)\n        if slaves:\n            if self.slave_rr_counter is None:\n                self.slave_rr_counter = random.randint(0, len(slaves) - 1)\n            for _ in range(len(slaves)):\n                self.slave_rr_counter = (self.slave_rr_counter + 1) % len(slaves)\n                slave = slaves[self.slave_rr_counter]\n                yield slave\n        # Fallback to the master connection\n        try:\n            yield await self.get_master_address()\n        except MasterNotFoundError:\n            pass\n        raise SlaveNotFoundError(f\"No slave found for {self.service_name!r}\")\n\n    def rotate_replicas(self) -> AsyncIterator:\n        \"\"\"Round-robin replica balancer.\n\n        This is an alias for :py:meth:`rotate_slaves`,\n        using the preferred Redis 5.0+ terminology.\n        \"\"\"\n        return self.rotate_slaves()\n\n\nclass Sentinel(AsyncSentinelCommands):\n    \"\"\"\n    Redis Sentinel cluster client\n\n    >>> from redis.sentinel import Sentinel\n    >>> sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1)\n    >>> master = sentinel.master_for('mymaster', socket_timeout=0.1)\n    >>> await master.set('foo', 'bar')","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/redis/redis-py/blob/6a6b581b48225afa0b76912d1028c6035baee932/redis/asyncio/sentinel.py#L152-L188","documentation":"Raised as SlaveNotFoundError (a ConnectionError subclass) from SentinelConnectionPool.rotate_slaves after it discovers zero usable slaves for the service AND the fallback to discover_master also raises MasterNotFoundError. This means the slave-for() client has nowhere to send a read: no replicas and no master fallback. It is thrown when iterating slave addresses during connection establishment for a slave pool.","triggerScenarios":"Opening/using a slave_for()/replica_for() client where discover_slaves() returns an empty list (all replicas down, in SDOWN/ODOWN, or none configured) and discover_master() also fails with MasterNotFoundError.","commonSituations":"All replicas are down or in ODOWN/SDOWN state. A fresh Sentinel deployment with no replicas attached to the service. Quorum loss so Sentinel cannot report master or slaves. service_name typo so Sentinel knows nothing about the service.","solutions":["Verify with `redis-cli -p 26379 sentinel replicas <service_name>` that replicas exist and are not flagged down.","Ensure at least one replica is configured and reachable; add replicas if none exist.","Check Sentinel quorum and the service_name spelling.","Temporarily read from master by using master_for() instead of slave_for()."],"exampleFix":"# before\nslave = sentinel.slave_for('mymaster')\nawait slave.get('k')  # SlaveNotFoundError\n# after\nmaster = sentinel.master_for('mymaster')\nawait master.get('k')  # read from master until replicas recover","handlingStrategy":"fallback","validationCode":"replicas = await sentinel.discover_slaves(service_name)\nif not replicas:\n    logger.warning(\"no replicas; falling back to master\")","typeGuard":null,"tryCatchPattern":"from redis.asyncio.sentinel import SlaveNotFoundError\ntry:\n    return await slave_client.get(key)\nexcept SlaveNotFoundError:\n    return await sentinel.master_for(service_name).get(key)","preventionTips":["Provide a master fallback for reads when replicas may be unavailable.","Monitor replica count via discover_slaves before relying on slave_for()."],"tags":["sentinel","replica","connection","async"],"backgroundTag":null,"analyzedSha":"6a6b581b48225afa0b76912d1028c6035baee932","analyzedAt":"2026-08-10T12:52:44.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}