diff --git a/src/server/caches.py b/src/server/caches.py index d311b19fb4..16f2fbd09f 100644 --- a/src/server/caches.py +++ b/src/server/caches.py @@ -6,6 +6,8 @@ Central caching module. from sys import getsizeof from collections import defaultdict from django.conf import settings +from src.server.models import ServerConfig +from src.utils.utils import to_str, uses_database _ENABLE_LOCAL_CACHES = settings.GAME_CACHE_TYPE @@ -13,6 +15,12 @@ _GA = object.__getattribute__ _SA = object.__setattr__ _DA = object.__delattr__ +if uses_database("mysql") and ServerConfig.objects.get_mysql_db_version() < '5.6.4': + # mysql <5.6.4 don't support millisecond precision + _DATESTRING = "%Y:%m:%d-%H:%M:%S:000000" +else: + _DATESTRING = "%Y:%m:%d-%H:%M:%S:%f" + # OOB hooks (OOB not yet functional, don't use yet) _OOB_FIELD_UPDATE_HOOKS = defaultdict(dict) _OOB_PROP_UPDATE_HOOKS = defaultdict(dict) @@ -35,12 +43,12 @@ def hashid(obj): hid = _GA(obj, "_hashid") except AttributeError: try: - date, idnum = _GA(obj, "db_date_created"), _GA(obj, "id") + date, idnum = _GA(obj, "db_date_created").strftime(_DATESTRING), _GA(obj, "id") except AttributeError: try: # maybe a typeclass, try to go to dbobj obj = _GA(obj, "dbobj") - date, idnum = _GA(obj, "db_date_created"), _GA(obj, "id") + date, idnum = _GA(obj, "db_date_created").strftime(_DATESTRING), _GA(obj, "id") except AttributeError: # this happens if hashing something like ndb. We have to # rely on memory adressing in this case. @@ -194,7 +202,10 @@ if _ENABLE_LOCAL_CACHES: hid = hashid(obj) global _FIELD_CACHE if hid: - del _FIELD_CACHE[hashid(obj)] + try: + del _FIELD_CACHE[hashid(obj)] + except KeyError, e: + pass else: # clean cache completely _FIELD_CACHE = defaultdict(dict) @@ -241,7 +252,10 @@ if _ENABLE_LOCAL_CACHES: hid = hashid(obj) global _PROP_CACHE if hid: - del _PROP_CACHE[hashid(obj)] + try: + del _PROP_CACHE[hid] + except KeyError,e: + pass else: # clean cache completely _PROP_CACHE = defaultdict(dict) @@ -295,6 +309,13 @@ if _ENABLE_LOCAL_CACHES: _ATTR_CACHE = defaultdict(dict) + def flush_obj_caches(obj=None): + "Clean all caches on this object" + flush_field_cache(obj) + flush_prop_cache(obj) + flush_attr_cache(obj) + + else: # local caches disabled. Use simple pass-through replacements diff --git a/src/utils/dbserialize.py b/src/utils/dbserialize.py index 0c24908480..44c1d36a1d 100644 --- a/src/utils/dbserialize.py +++ b/src/utils/dbserialize.py @@ -28,6 +28,7 @@ except ImportError: from django.db import transaction from django.core.exceptions import ObjectDoesNotExist from django.contrib.contenttypes.models import ContentType +from src.server.models import ServerConfig from src.utils.utils import to_str, uses_database from src.utils import logger diff --git a/src/utils/idmapper/base.py b/src/utils/idmapper/base.py index 5e6032c60a..e70f59d8c7 100755 --- a/src/utils/idmapper/base.py +++ b/src/utils/idmapper/base.py @@ -210,6 +210,8 @@ def update_cached_instance(sender, instance, **kwargs): if not hasattr(instance, 'cache_instance'): return sender.cache_instance(instance) + from src.server.caches import flush_obj_caches + flush_obj_caches(instance) post_save.connect(update_cached_instance) def cache_size(mb=True):