0

genpoi UUID improvements

* When reading the cache, catch some errors on load, instead of crashing
* When writing to cache, write to tmp file, then move it into place.
  This should be more robust if a ctrl+c is recieved while writing the
  cache

Addresses #1266
This commit is contained in:
Andrew Chin
2015-12-27 14:59:03 -05:00
parent 0ba0c60ed2
commit 270741eb8f

View File

@@ -24,6 +24,7 @@ import re
import sys import sys
import time import time
import urllib2 import urllib2
import datetime
from collections import defaultdict from collections import defaultdict
from multiprocessing import Pool from multiprocessing import Pool
@@ -210,9 +211,21 @@ class PlayerDict(dict):
def load_cache(cls, outputdir): def load_cache(cls, outputdir):
cache_file = os.path.join(outputdir, "uuidcache.dat") cache_file = os.path.join(outputdir, "uuidcache.dat")
if os.path.exists(cache_file): if os.path.exists(cache_file):
gz = gzip.GzipFile(cache_file) try:
cls.uuid_cache = json.load(gz) gz = gzip.GzipFile(cache_file)
logging.info("Loaded UUID cache from %r with %d entries", cache_file, len(cls.uuid_cache.keys())) 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: else:
cls.uuid_cache = {} cls.uuid_cache = {}
logging.info("Initialized an empty UUID cache") logging.info("Initialized an empty UUID cache")
@@ -220,9 +233,13 @@ class PlayerDict(dict):
@classmethod @classmethod
def save_cache(cls, outputdir): def save_cache(cls, outputdir):
cache_file = os.path.join(outputdir, "uuidcache.dat") cache_file = os.path.join(outputdir, "uuidcache.dat")
gz = gzip.GzipFile(cache_file, "wb") try:
json.dump(cls.uuid_cache, gz) gz = gzip.GzipFile(cache_file + ".tmp", "wb")
logging.info("Wrote UUID cache with %d entries", len(cls.uuid_cache.keys())) 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): def __getitem__(self, item):
if item == "EntityId": if item == "EntityId":