Files
gogo2/fix_cache.py
2025-07-25 22:34:13 +03:00

133 lines
5.1 KiB
Python

#!/usr/bin/env python3
"""
Cache Fix Script
Quick script to diagnose and fix cache issues, including the Parquet deserialization error
"""
import sys
import logging
from utils.cache_manager import get_cache_manager, cleanup_corrupted_cache, get_cache_health
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def main():
"""Main cache fix routine"""
print("=== Trading System Cache Fix ===")
print()
# Get cache manager
cache_manager = get_cache_manager()
# 1. Scan cache health
print("1. Scanning cache health...")
health_summary = get_cache_health()
print(f"Total files: {health_summary['total_files']}")
print(f"Valid files: {health_summary['valid_files']}")
print(f"Corrupted files: {health_summary['corrupted_files']}")
print(f"Health percentage: {health_summary['health_percentage']:.1f}%")
print(f"Total cache size: {health_summary['total_size_mb']:.1f} MB")
print()
# Show detailed report
for cache_dir, report in health_summary['directories'].items():
if report['total_files'] > 0:
print(f"Directory: {cache_dir}")
print(f" Files: {report['valid_files']}/{report['total_files']} valid")
print(f" Size: {report['total_size_mb']:.1f} MB")
if report['corrupted_files'] > 0:
print(f" CORRUPTED FILES ({report['corrupted_files']}):")
for corrupted in report['corrupted_files_list']:
print(f" - {corrupted['file']}: {corrupted['error']}")
if report['old_files']:
print(f" OLD FILES ({len(report['old_files'])}):")
for old_file in report['old_files'][:3]: # Show first 3
print(f" - {old_file['file']}: {old_file['age_days']} days old")
if len(report['old_files']) > 3:
print(f" ... and {len(report['old_files']) - 3} more")
print()
# 2. Fix corrupted files
if health_summary['corrupted_files'] > 0:
print("2. Fixing corrupted files...")
# First show what would be deleted
print("Files that will be deleted:")
dry_run_result = cleanup_corrupted_cache(dry_run=True)
for cache_dir, files in dry_run_result.items():
if files:
print(f" {cache_dir}:")
for file_info in files:
print(f" {file_info}")
# Ask for confirmation
response = input("\nProceed with deletion? (y/N): ").strip().lower()
if response == 'y':
print("Deleting corrupted files...")
actual_result = cleanup_corrupted_cache(dry_run=False)
deleted_count = 0
for cache_dir, files in actual_result.items():
for file_info in files:
if "DELETED:" in file_info:
deleted_count += 1
print(f"Deleted {deleted_count} corrupted files")
else:
print("Skipped deletion")
else:
print("2. No corrupted files found - cache is healthy!")
print()
# 3. Optional: Clean old files
print("3. Checking for old files...")
old_files_result = cache_manager.cleanup_old_files(days_to_keep=7, dry_run=True)
old_file_count = sum(len(files) for files in old_files_result.values())
if old_file_count > 0:
print(f"Found {old_file_count} old files (>7 days)")
response = input("Clean up old files? (y/N): ").strip().lower()
if response == 'y':
actual_old_result = cache_manager.cleanup_old_files(days_to_keep=7, dry_run=False)
deleted_old_count = sum(len([f for f in files if "DELETED:" in f]) for files in actual_old_result.values())
print(f"Deleted {deleted_old_count} old files")
else:
print("Skipped old file cleanup")
else:
print("No old files found")
print()
print("=== Cache Fix Complete ===")
print("The system should now work without Parquet deserialization errors.")
print("If you continue to see issues, consider running with --emergency-reset")
def emergency_reset():
"""Emergency cache reset"""
print("=== EMERGENCY CACHE RESET ===")
print("WARNING: This will delete ALL cache files!")
print("You will need to re-download all historical data.")
print()
response = input("Are you sure you want to proceed? Type 'DELETE ALL CACHE' to confirm: ")
if response == "DELETE ALL CACHE":
cache_manager = get_cache_manager()
success = cache_manager.emergency_cache_reset(confirm=True)
if success:
print("Emergency cache reset completed.")
print("All cache files have been deleted.")
else:
print("Emergency reset failed.")
else:
print("Emergency reset cancelled.")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--emergency-reset":
emergency_reset()
else:
main()