From 612d612b7ebc7668621755f0adb69b99c85494c5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 14 Nov 2016 17:22:08 +0530 Subject: [PATCH] [hot] fix bug that caused session crashing when cache was full --- frappe/__init__.py | 4 ++-- frappe/translate.py | 12 ++++++------ frappe/utils/redis_wrapper.py | 17 ++++++++++------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index e068c23b97..af6aadeb8b 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -135,6 +135,8 @@ def init(site, sites_path=None, new_site=False): local.jenv = None local.jloader =None local.cache = {} + local.form_dict = _dict() + local.session = _dict() setup_module_map() @@ -149,8 +151,6 @@ def connect(site=None, db_name=None): if site: init(site) local.db = Database(user=db_name or local.conf.db_name) - local.form_dict = _dict() - local.session = _dict() set_user("Administrator") def get_site_config(sites_path=None, site_path=None): diff --git a/frappe/translate.py b/frappe/translate.py index 19a253f169..45f8394b3c 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -94,7 +94,7 @@ def get_dict(fortype, name=None): fortype = fortype.lower() cache = frappe.cache() asset_key = fortype + ":" + (name or "-") - translation_assets = cache.hget("translation_assets", frappe.local.lang) or {} + translation_assets = cache.hget("translation_assets", frappe.local.lang, shared=True) or {} if not asset_key in translation_assets: if fortype=="doctype": @@ -123,7 +123,7 @@ def get_dict(fortype, name=None): translation_assets[asset_key] = message_dict - cache.hset("translation_assets", frappe.local.lang, translation_assets) + cache.hset("translation_assets", frappe.local.lang, translation_assets, shared=True) return translation_assets[asset_key] @@ -203,7 +203,7 @@ def load_lang(lang, apps=None): if lang=='en': return {} - out = frappe.cache().hget("lang_full_dict", lang) + out = frappe.cache().hget("lang_full_dict", lang, shared=True) if not out: out = {} for app in (apps or frappe.get_all_apps(True)): @@ -216,7 +216,7 @@ def load_lang(lang, apps=None): parent_out.update(out) out = parent_out - frappe.cache().hset("lang_full_dict", lang, out) + frappe.cache().hset("lang_full_dict", lang, out, shared=True) return out or {} @@ -260,8 +260,8 @@ def clear_cache(): # clear translations saved in boot cache cache.delete_key("bootinfo") - cache.delete_key("lang_full_dict") - cache.delete_key("translation_assets") + cache.delete_key("lang_full_dict", shared=True) + cache.delete_key("translation_assets", shared=True) cache.delete_key("lang_user_translations") def get_messages_for_app(app): diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index 06d124447d..9798d2aef6 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -8,7 +8,9 @@ from frappe.utils import cstr class RedisWrapper(redis.Redis): """Redis client that will automatically prefix conf.db_name""" - def make_key(self, key, user=None): + def make_key(self, key, user=None, shared=False): + if shared: + return key if user: if user == True: user = frappe.session.user @@ -129,12 +131,13 @@ class RedisWrapper(redis.Redis): def llen(self, key): return super(redis.Redis, self).llen(self.make_key(key)) - def hset(self, name, key, value): + def hset(self, name, key, value, shared=False): if not name in frappe.local.cache: frappe.local.cache[name] = {} frappe.local.cache[name][key] = value try: - super(redis.Redis, self).hset(self.make_key(name), key, pickle.dumps(value)) + super(redis.Redis, self).hset(self.make_key(name, shared=shared), + key, pickle.dumps(value)) except redis.exceptions.ConnectionError: pass @@ -142,7 +145,7 @@ class RedisWrapper(redis.Redis): return {key: pickle.loads(value) for key, value in super(redis.Redis, self).hgetall(self.make_key(name)).iteritems()} - def hget(self, name, key, generator=None): + def hget(self, name, key, generator=None, shared=False): if not name in frappe.local.cache: frappe.local.cache[name] = {} if key in frappe.local.cache[name]: @@ -150,7 +153,7 @@ class RedisWrapper(redis.Redis): value = None try: - value = super(redis.Redis, self).hget(self.make_key(name), key) + value = super(redis.Redis, self).hget(self.make_key(name, shared=shared), key) except redis.exceptions.ConnectionError: pass @@ -165,12 +168,12 @@ class RedisWrapper(redis.Redis): pass return value - def hdel(self, name, key): + def hdel(self, name, key, shared=False): if name in frappe.local.cache: if key in frappe.local.cache[name]: del frappe.local.cache[name][key] try: - super(redis.Redis, self).hdel(self.make_key(name), key) + super(redis.Redis, self).hdel(self.make_key(name, shared=shared), key) except redis.exceptions.ConnectionError: pass