Explorar el Código

[hot] fix bug that caused session crashing when cache was full

version-14
Rushabh Mehta hace 8 años
padre
commit
612d612b7e
Se han modificado 3 ficheros con 18 adiciones y 15 borrados
  1. +2
    -2
      frappe/__init__.py
  2. +6
    -6
      frappe/translate.py
  3. +10
    -7
      frappe/utils/redis_wrapper.py

+ 2
- 2
frappe/__init__.py Ver fichero

@@ -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):


+ 6
- 6
frappe/translate.py Ver fichero

@@ -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):


+ 10
- 7
frappe/utils/redis_wrapper.py Ver fichero

@@ -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



Cargando…
Cancelar
Guardar