From 1325ad570e6944bf8dbc8d35d85947355373163f Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 14 Jun 2015 21:48:36 -0700 Subject: [PATCH] Event cleanup pipeline. --- api.py | 3 +++ channel.py | 15 ++------------- include.yaml | 4 ++++ lib/models.py | 29 +++++++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/api.py b/api.py index 298ff7b..33a8399 100644 --- a/api.py +++ b/api.py @@ -56,6 +56,9 @@ def Poll(google_user, client, client_address, instance_id, args): instance = models.Instance.FindOrCreate(instance_id, polling=True, active=True) assert instance.polling + # Update last_poll + instance.save() + events = [] if google_user: events.append({ diff --git a/channel.py b/channel.py index 21859b8..245f98d 100644 --- a/channel.py +++ b/channel.py @@ -29,7 +29,6 @@ class OnChannelConnect(webapp2.RequestHandler): @db.transactional() def post(self): instance_id = self.request.get('from') - logging.info('Instance: %s', instance_id) instance = models.Instance.FromID(instance_id) if not instance: logging.warning('Channel opened with invalid instance_id: %s', instance_id) @@ -47,18 +46,8 @@ class OnChannelDisconnect(webapp2.RequestHandler): @utils.local_namespace def post(self): instance_id = self.request.get('from') - logging.info('Instance: %s', instance_id) - instance_key = db.Key.from_path('Instance', instance_id) - - subscriptions = list(models.Subscription.all().filter('instance =', instance_key)) - if subscriptions: - db.delete(subscriptions) - - pins = models.Pin.all().filter('instance =', instance_key) - for pin in pins: - pin.Delete() - - db.delete(instance_key) + instance = models.Instance.FromID(instance_id) + instance.Delete() app = webapp2.WSGIApplication([ diff --git a/include.yaml b/include.yaml index 55edd70..dc12a65 100644 --- a/include.yaml +++ b/include.yaml @@ -7,6 +7,10 @@ handlers: script: cosmopolite.auth.app secure: always +- url: /cosmopolite/cron/.* + script: cosmopolite.cron.app + login: admin + - url: /_ah/channel/.* script: cosmopolite.channel.app diff --git a/lib/models.py b/lib/models.py index 152d1dd..8f0c98e 100644 --- a/lib/models.py +++ b/lib/models.py @@ -94,6 +94,7 @@ class Instance(db.Model): # key_name=instance_id active = db.BooleanProperty(required=True, default=False) polling = db.BooleanProperty(required=True, default=False) + last_poll = db.DateTimeProperty(required=True, auto_now=True) @classmethod def FromID(cls, instance_id): @@ -105,6 +106,19 @@ class Instance(db.Model): logging.info('Instance: %s', instance_id) return cls.get_or_insert(instance_id, **kwargs) + def Delete(self): + logging.info('Deleting instance %s', self.key().name()) + + subscriptions = Subscription.all().filter('instance =', self) + for subscription in subscriptions: + subscription.Delete() + + pins = Pin.all().filter('instance =', self) + for pin in pins: + pin.Delete() + + self.delete() + def GetSubscriptions(self): return ( Subscription.all() @@ -327,6 +341,7 @@ class Subject(db.Model): .filter('instance =', instance_key)) events = [] + # TODO: bulk delete for pin in pins: events.append(pin.ToEvent(event_type='unpin')) pin.delete() @@ -428,7 +443,7 @@ class Subscription(db.Model): .filter('readable_only_by_me =', readable_only_by_me) .filter('writable_only_by_me =', writable_only_by_me)) for subscription in subscriptions: - subscription.delete() + subscription.Delete() def SendMessage(self, msg): encoded = json.dumps(msg, default=utils.EncodeJSON) @@ -445,13 +460,23 @@ class Subscription(db.Model): Event.all() .ancestor(self)) ret = [] + to_delete = [] for e in events: if str(e.key().id()) in acks: - e.delete() + to_delete.append(e) else: ret.append(e.ToEvent()) + db.delete(events) return ret + def Delete(self): + events = ( + Event.all() + .ancestor(self)) + db.delete(events) + + self.delete() + class Event(db.Model): # parent=Subscription