From 49f14e54cf92cc065c30ea7bd19e5ba4eb75ebec Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Tue, 5 Jan 2016 18:12:59 -0800 Subject: [PATCH] Stop some pathological datastore behavior when a client is fetching many messages. --- lib/models.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/models.py b/lib/models.py index f49d359..f6a9cab 100644 --- a/lib/models.py +++ b/lib/models.py @@ -199,6 +199,17 @@ class Subject(db.Model): cls._cache[key_name] = obj return obj + @classmethod + def ReadThrough(cls, key): + obj = cls._cache.get(key.name()) + if obj: + return obj + + obj = cls.get(key) + if obj: + cls._cache[key.name()] = obj + return obj + @db.transactional() def GetRecentMessages(self, num_messages): query = ( @@ -515,12 +526,13 @@ class Message(db.Model): random_value = db.IntegerProperty(required=True) def ToEvent(self): + parent = Subject.ReadThrough(self.parent_key()) return { 'event_type': 'message', 'id': self.id_, 'sender': str(Message.sender.get_value_for_datastore(self).id_or_name()), - 'subject': self.parent().ToDict(), + 'subject': parent.ToDict(), 'created': self.created, 'sender_message_id': self.sender_message_id, 'random_value': self.random_value, @@ -539,12 +551,13 @@ class Pin(db.Model): sender_address = db.StringProperty(required=True) def ToEvent(self, event_type='pin'): + parent = Subject.ReadThrough(self.parent_key()) return { 'event_type': event_type, 'id': str(self.key().id()), 'sender': str(Pin.sender.get_value_for_datastore(self).id_or_name()), - 'subject': self.parent().ToDict(), + 'subject': parent.ToDict(), 'created': self.created, 'sender_message_id': self.sender_message_id, 'message': self.message,