Clean up all Redis keys for a channel more efficiently
(self, channel_id)
| 2164 | logger.error(f"Error checking orphaned metadata: {e}", exc_info=True) |
| 2165 | |
| 2166 | def _clean_redis_keys(self, channel_id): |
| 2167 | """Clean up all Redis keys for a channel more efficiently""" |
| 2168 | total_deleted = 0 |
| 2169 | |
| 2170 | try: |
| 2171 | # Release the M3U profile slot while channel_stream / metadata still exist. |
| 2172 | # Scanning live:channel keys first deletes metadata and breaks release_stream() |
| 2173 | # fallback, leaving profile_connections counters stuck (e.g. profile_connections:70 = 1). |
| 2174 | try: |
| 2175 | channel = Channel.objects.get(uuid=channel_id) |
| 2176 | if not channel.release_stream(): |
| 2177 | logger.debug(f"Channel {channel_id}: release_stream found no keys to clean") |
| 2178 | except (Channel.DoesNotExist, Exception): |
| 2179 | try: |
| 2180 | stream = Stream.objects.get(stream_hash=channel_id) |
| 2181 | if not stream.release_stream(): |
| 2182 | logger.debug(f"Stream {channel_id}: release_stream found no keys to clean") |
| 2183 | except (Stream.DoesNotExist, Exception): |
| 2184 | logger.debug(f"No Channel or Stream found for {channel_id}") |
| 2185 | |
| 2186 | if self.redis_client: |
| 2187 | try: |
| 2188 | patterns = [ |
| 2189 | f"live:channel:{channel_id}:*", |
| 2190 | RedisKeys.events_channel(channel_id), |
| 2191 | ] |
| 2192 | |
| 2193 | for pattern in patterns: |
| 2194 | cursor = 0 |
| 2195 | while True: |
| 2196 | cursor, keys = self.redis_client.scan(cursor, match=pattern, count=100) |
| 2197 | if keys: |
| 2198 | self.redis_client.delete(*keys) |
| 2199 | total_deleted += len(keys) |
| 2200 | |
| 2201 | if cursor == 0: |
| 2202 | break |
| 2203 | |
| 2204 | logger.info(f"Cleaned up {total_deleted} Redis keys for channel {channel_id}") |
| 2205 | except Exception as e: |
| 2206 | logger.error(f"Error cleaning Redis keys for channel {channel_id}: {e}") |
| 2207 | finally: |
| 2208 | close_old_connections() |
| 2209 | |
| 2210 | return total_deleted |
| 2211 | |
| 2212 | def refresh_channel_registry(self): |
| 2213 | """Refresh TTL for active channels using standard keys""" |