diff --git a/overviewer_core/aux_files/genPOI.py b/overviewer_core/aux_files/genPOI.py index 7fadcc4..a237ad4 100755 --- a/overviewer_core/aux_files/genPOI.py +++ b/overviewer_core/aux_files/genPOI.py @@ -24,6 +24,7 @@ import re import sys import time import urllib2 +import datetime from collections import defaultdict from multiprocessing import Pool @@ -210,9 +211,21 @@ class PlayerDict(dict): def load_cache(cls, outputdir): cache_file = os.path.join(outputdir, "uuidcache.dat") if os.path.exists(cache_file): - gz = gzip.GzipFile(cache_file) - cls.uuid_cache = json.load(gz) - logging.info("Loaded UUID cache from %r with %d entries", cache_file, len(cls.uuid_cache.keys())) + try: + gz = gzip.GzipFile(cache_file) + cls.uuid_cache = json.load(gz) + logging.info("Loaded UUID cache from %r with %d entries", cache_file, len(cls.uuid_cache.keys())) + except (ValueError, IOError): + logging.warning("Failed to load UUID cache -- it might be corrupt") + cls.uuid_cache = {} + corrupted_cache = cache_file + ".corrupted." + datetime.datetime.now().isoformat() + try: + os.rename(cache_file, corrupted_cache) + logging.warning("If %s does not appear to contain meaningful data, you may safely delete it", corrupted_cache) + except OSError: + logging.warning("Failed to backup corrupted UUID cache") + + logging.info("Initialized an empty UUID cache") else: cls.uuid_cache = {} logging.info("Initialized an empty UUID cache") @@ -220,9 +233,13 @@ class PlayerDict(dict): @classmethod def save_cache(cls, outputdir): cache_file = os.path.join(outputdir, "uuidcache.dat") - gz = gzip.GzipFile(cache_file, "wb") - json.dump(cls.uuid_cache, gz) - logging.info("Wrote UUID cache with %d entries", len(cls.uuid_cache.keys())) + try: + gz = gzip.GzipFile(cache_file + ".tmp", "wb") + json.dump(cls.uuid_cache, gz) + os.rename(cache_file + ".tmp", cache_file) + logging.info("Wrote UUID cache with %d entries", len(cls.uuid_cache.keys())) + except (IOError, OSError): + logging.warning("Failed to save UUID cache!") def __getitem__(self, item): if item == "EntityId":