Xernive's picture
Fix Hunyuan3D error handling + enhanced logging
0e805d4
raw
history blame
2.59 kB
"""Result caching system for GPU quota savings."""
import hashlib
import time
from pathlib import Path
from typing import Optional, Tuple
import shutil
from core.config import CACHE_EXPIRY_HOURS
class CacheManager:
"""Manages result caching to save GPU quota."""
def __init__(self, cache_dir: str = "cache"):
self.cache_dir = Path(cache_dir)
self.cache_dir.mkdir(exist_ok=True)
self.expiry_seconds = CACHE_EXPIRY_HOURS * 3600
def get_cache_key(self, prompt: str, quality: str, user_id: str = "default") -> str:
"""Generate unique cache key from parameters."""
# Include hour timestamp for cache invalidation
timestamp = int(time.time() / 3600)
key_string = f"{user_id}_{prompt}_{quality}_{timestamp}"
return hashlib.sha256(key_string.encode()).hexdigest()
def get_cached_result(self, prompt: str, quality: str) -> Optional[Path]:
"""Check if result exists in cache."""
cache_key = self.get_cache_key(prompt, quality)
cache_path = self.cache_dir / f"{cache_key}.glb"
if cache_path.exists():
file_age = time.time() - cache_path.stat().st_mtime
if file_age < self.expiry_seconds:
print(f"[Cache] Hit: {cache_path.name}")
return cache_path
else:
# Expired, remove it
cache_path.unlink()
print(f"[Cache] Expired: {cache_path.name}")
print(f"[Cache] Miss: {cache_key}")
return None
def save_to_cache(self, prompt: str, quality: str, result_path: Path) -> None:
"""Save generation result to cache."""
cache_key = self.get_cache_key(prompt, quality)
cache_path = self.cache_dir / f"{cache_key}.glb"
shutil.copy(result_path, cache_path)
print(f"[Cache] Saved: {cache_path.name}")
def cleanup_old_cache(self) -> Tuple[int, float]:
"""Remove expired cache files."""
removed_count = 0
removed_size_mb = 0.0
for cache_file in self.cache_dir.glob("*.glb"):
file_age = time.time() - cache_file.stat().st_mtime
if file_age > self.expiry_seconds:
size_mb = cache_file.stat().st_size / 1e6
cache_file.unlink()
removed_count += 1
removed_size_mb += size_mb
if removed_count > 0:
print(f"[Cache] Cleaned up {removed_count} files ({removed_size_mb:.2f} MB)")
return removed_count, removed_size_mb