Commit 67d66184 by Calen Pennington

Push `set_many` save() calls into per-type caches

parent 97c2513e
...@@ -223,7 +223,8 @@ class DjangoOrmFieldCache(object): ...@@ -223,7 +223,8 @@ class DjangoOrmFieldCache(object):
if field_object is None: if field_object is None:
self._cache[cache_key] = field_object = self._create_object(kvs_key) self._cache[cache_key] = field_object = self._create_object(kvs_key)
self._set_field_value(kvs_key, value) self._set_field_value(field_object, kvs_key, value)
field_object.save()
@contract(kvs_key=DjangoKeyValueStore.Key) @contract(kvs_key=DjangoKeyValueStore.Key)
def delete(self, kvs_key): def delete(self, kvs_key):
...@@ -257,9 +258,7 @@ class DjangoOrmFieldCache(object): ...@@ -257,9 +258,7 @@ class DjangoOrmFieldCache(object):
return self._cache_key_for_kvs_key(kvs_key) in self._cache return self._cache_key_for_kvs_key(kvs_key) in self._cache
@contract(kvs_key=DjangoKeyValueStore.Key) @contract(kvs_key=DjangoKeyValueStore.Key)
def _set_field_value(self, kvs_key, value): def _set_field_value(self, field_object, kvs_key, value):
cache_key = self._cache_key_for_kvs_key(kvs_key)
field_object = self._cache.get(cache_key)
field_object.value = json.dumps(value) field_object.value = json.dumps(value)
def __len__(self): def __len__(self):
...@@ -413,9 +412,7 @@ class UserStateCache(DjangoOrmFieldCache): ...@@ -413,9 +412,7 @@ class UserStateCache(DjangoOrmFieldCache):
return kvs_key.field_name in json.loads(field_object.state) return kvs_key.field_name in json.loads(field_object.state)
@contract(kvs_key=DjangoKeyValueStore.Key) @contract(kvs_key=DjangoKeyValueStore.Key)
def _set_field_value(self, kvs_key, value): def _set_field_value(self, field_object, kvs_key, value):
cache_key = self._cache_key_for_kvs_key(kvs_key)
field_object = self._cache.get(cache_key)
state = json.loads(field_object.state) state = json.loads(field_object.state)
state[kvs_key.field_name] = value state[kvs_key.field_name] = value
field_object.state = json.dumps(state) field_object.state = json.dumps(state)
...@@ -782,8 +779,6 @@ class FieldDataCache(object): ...@@ -782,8 +779,6 @@ class FieldDataCache(object):
""" """
saved_fields = [] saved_fields = []
# field_objects maps a field_object to a list of associated fields
field_objects = dict()
for key in kv_dict: for key in kv_dict:
# If the field is valid and isn't already in the dictionary, add it. # If the field is valid and isn't already in the dictionary, add it.
...@@ -795,27 +790,13 @@ class FieldDataCache(object): ...@@ -795,27 +790,13 @@ class FieldDataCache(object):
if key.scope not in self.cache: if key.scope not in self.cache:
continue continue
self.cache[key.scope].set(key, kv_dict[key])
field_object = self.cache[key.scope].get(key)
if field_object not in field_objects.keys():
field_objects[field_object] = []
# Update the list of associated fields
field_objects[field_object].append(key)
for field_object in field_objects:
try: try:
# Save the field object that we made above self.cache[key.scope].set(key, kv_dict[key])
field_object.save() # If save is successful on this field, add it to
# If save is successful on this scope, add the saved fields to
# the list of successful saves # the list of successful saves
saved_fields.extend([key.field_name for key in field_objects[field_object]]) saved_fields.append(key.field_name)
except DatabaseError: except DatabaseError:
log.exception('Error saving fields %r', field_objects[field_object]) log.exception('Error saving field %r', key)
raise KeyValueMultiSaveError(saved_fields) raise KeyValueMultiSaveError(saved_fields)
@contract(key=DjangoKeyValueStore.Key) @contract(key=DjangoKeyValueStore.Key)
......
...@@ -373,7 +373,7 @@ class StorageTestBase(object): ...@@ -373,7 +373,7 @@ class StorageTestBase(object):
exception = exception_context.exception exception = exception_context.exception
self.assertEquals(len(exception.saved_field_names), 1) self.assertEquals(len(exception.saved_field_names), 1)
self.assertEquals(exception.saved_field_names[0], 'existing_field') self.assertEquals(exception.saved_field_names[0], 'other_existing_field')
class TestUserStateSummaryStorage(StorageTestBase, TestCase): class TestUserStateSummaryStorage(StorageTestBase, TestCase):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment