mirror of
https://github.com/pacnpal/Pac-cogs.git
synced 2025-12-20 10:51:05 -05:00
Fixed the guild_only import by importing it directly from redbot.core.commands
Improved the cog unload process by: Reducing cleanup timeouts (UNLOAD_TIMEOUT to 5s, CLEANUP_TIMEOUT to 3s) Adding immediate task cancellation Implementing aggressive cleanup with force_cleanup_resources Clearing all references in the finally block Fixed code indentation issues
This commit is contained in:
@@ -40,9 +40,9 @@ from .events import setup_events
|
|||||||
|
|
||||||
logger = logging.getLogger("VideoArchiver")
|
logger = logging.getLogger("VideoArchiver")
|
||||||
|
|
||||||
# Constants for timeouts
|
# Constants for timeouts - reduced for faster cleanup
|
||||||
UNLOAD_TIMEOUT = 30 # seconds
|
UNLOAD_TIMEOUT = 5 # seconds
|
||||||
CLEANUP_TIMEOUT = 15 # seconds
|
CLEANUP_TIMEOUT = 3 # seconds
|
||||||
|
|
||||||
class VideoArchiver(GroupCog):
|
class VideoArchiver(GroupCog):
|
||||||
"""Archive videos from Discord channels"""
|
"""Archive videos from Discord channels"""
|
||||||
@@ -420,22 +420,43 @@ class VideoArchiver(GroupCog):
|
|||||||
raise ProcessingError(f"Error during cog load: {str(e)}")
|
raise ProcessingError(f"Error during cog load: {str(e)}")
|
||||||
|
|
||||||
async def cog_unload(self) -> None:
|
async def cog_unload(self) -> None:
|
||||||
"""Clean up when cog is unloaded with timeout"""
|
"""Clean up when cog is unloaded with aggressive timeout handling"""
|
||||||
self._unloading = True
|
self._unloading = True
|
||||||
try:
|
try:
|
||||||
# Create cleanup task with timeout
|
# Cancel any pending tasks immediately
|
||||||
cleanup_task = asyncio.create_task(self._cleanup())
|
if self._init_task and not self._init_task.done():
|
||||||
|
self._init_task.cancel()
|
||||||
|
|
||||||
|
if self._cleanup_task and not self._cleanup_task.done():
|
||||||
|
self._cleanup_task.cancel()
|
||||||
|
|
||||||
|
# Try normal cleanup first with short timeout
|
||||||
|
cleanup_task = asyncio.create_task(cleanup_resources(self))
|
||||||
try:
|
try:
|
||||||
await asyncio.wait_for(cleanup_task, timeout=UNLOAD_TIMEOUT)
|
await asyncio.wait_for(cleanup_task, timeout=CLEANUP_TIMEOUT)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
logger.error("Cog unload timed out, forcing cleanup")
|
logger.warning("Normal cleanup timed out, forcing cleanup")
|
||||||
# Force cleanup of any remaining resources
|
# Immediately cancel the normal cleanup task
|
||||||
|
cleanup_task.cancel()
|
||||||
|
# Force cleanup without waiting
|
||||||
|
await force_cleanup_resources(self)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error during normal cleanup: {str(e)}")
|
||||||
await force_cleanup_resources(self)
|
await force_cleanup_resources(self)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error during cog unload: {str(e)}")
|
logger.error(f"Error during cog unload: {str(e)}")
|
||||||
await force_cleanup_resources(self)
|
|
||||||
finally:
|
finally:
|
||||||
self._unloading = False
|
self._unloading = False
|
||||||
|
# Ensure ready flag is cleared
|
||||||
|
self.ready.clear()
|
||||||
|
# Clear all references
|
||||||
|
self.bot = None
|
||||||
|
self.processor = None
|
||||||
|
self.queue_manager = None
|
||||||
|
self.update_checker = None
|
||||||
|
self.ffmpeg_mgr = None
|
||||||
|
self.components.clear()
|
||||||
|
self.db = None
|
||||||
|
|
||||||
async def _cleanup(self) -> None:
|
async def _cleanup(self) -> None:
|
||||||
"""Clean up all resources with proper handling"""
|
"""Clean up all resources with proper handling"""
|
||||||
|
|||||||
Reference in New Issue
Block a user