Added cache-cleaning to the idmapper base class. This works to sync most changes from the admin site-side, but not location changes (which leaves the content cache stale). Thinking of testing the django in-built cache framework instead, maybe using custom fields?
This commit is contained in:
parent
0a39b8f65e
commit
deafb9c544
3 changed files with 28 additions and 4 deletions
|
|
@ -6,6 +6,8 @@ Central caching module.
|
||||||
from sys import getsizeof
|
from sys import getsizeof
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from django.conf import settings
|
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
|
_ENABLE_LOCAL_CACHES = settings.GAME_CACHE_TYPE
|
||||||
|
|
||||||
|
|
@ -13,6 +15,12 @@ _GA = object.__getattribute__
|
||||||
_SA = object.__setattr__
|
_SA = object.__setattr__
|
||||||
_DA = object.__delattr__
|
_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 hooks (OOB not yet functional, don't use yet)
|
||||||
_OOB_FIELD_UPDATE_HOOKS = defaultdict(dict)
|
_OOB_FIELD_UPDATE_HOOKS = defaultdict(dict)
|
||||||
_OOB_PROP_UPDATE_HOOKS = defaultdict(dict)
|
_OOB_PROP_UPDATE_HOOKS = defaultdict(dict)
|
||||||
|
|
@ -35,12 +43,12 @@ def hashid(obj):
|
||||||
hid = _GA(obj, "_hashid")
|
hid = _GA(obj, "_hashid")
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
try:
|
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:
|
except AttributeError:
|
||||||
try:
|
try:
|
||||||
# maybe a typeclass, try to go to dbobj
|
# maybe a typeclass, try to go to dbobj
|
||||||
obj = _GA(obj, "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:
|
except AttributeError:
|
||||||
# this happens if hashing something like ndb. We have to
|
# this happens if hashing something like ndb. We have to
|
||||||
# rely on memory adressing in this case.
|
# rely on memory adressing in this case.
|
||||||
|
|
@ -194,7 +202,10 @@ if _ENABLE_LOCAL_CACHES:
|
||||||
hid = hashid(obj)
|
hid = hashid(obj)
|
||||||
global _FIELD_CACHE
|
global _FIELD_CACHE
|
||||||
if hid:
|
if hid:
|
||||||
del _FIELD_CACHE[hashid(obj)]
|
try:
|
||||||
|
del _FIELD_CACHE[hashid(obj)]
|
||||||
|
except KeyError, e:
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
# clean cache completely
|
# clean cache completely
|
||||||
_FIELD_CACHE = defaultdict(dict)
|
_FIELD_CACHE = defaultdict(dict)
|
||||||
|
|
@ -241,7 +252,10 @@ if _ENABLE_LOCAL_CACHES:
|
||||||
hid = hashid(obj)
|
hid = hashid(obj)
|
||||||
global _PROP_CACHE
|
global _PROP_CACHE
|
||||||
if hid:
|
if hid:
|
||||||
del _PROP_CACHE[hashid(obj)]
|
try:
|
||||||
|
del _PROP_CACHE[hid]
|
||||||
|
except KeyError,e:
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
# clean cache completely
|
# clean cache completely
|
||||||
_PROP_CACHE = defaultdict(dict)
|
_PROP_CACHE = defaultdict(dict)
|
||||||
|
|
@ -295,6 +309,13 @@ if _ENABLE_LOCAL_CACHES:
|
||||||
_ATTR_CACHE = defaultdict(dict)
|
_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:
|
else:
|
||||||
# local caches disabled. Use simple pass-through replacements
|
# local caches disabled. Use simple pass-through replacements
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ except ImportError:
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.contrib.contenttypes.models import ContentType
|
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.utils import to_str, uses_database
|
||||||
from src.utils import logger
|
from src.utils import logger
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,6 +210,8 @@ def update_cached_instance(sender, instance, **kwargs):
|
||||||
if not hasattr(instance, 'cache_instance'):
|
if not hasattr(instance, 'cache_instance'):
|
||||||
return
|
return
|
||||||
sender.cache_instance(instance)
|
sender.cache_instance(instance)
|
||||||
|
from src.server.caches import flush_obj_caches
|
||||||
|
flush_obj_caches(instance)
|
||||||
post_save.connect(update_cached_instance)
|
post_save.connect(update_cached_instance)
|
||||||
|
|
||||||
def cache_size(mb=True):
|
def cache_size(mb=True):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue