[CalendarServer-changes] [2792] CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify. py

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 11 10:56:01 PDT 2008


Revision: 2792
          http://trac.macosforge.org/projects/calendarserver/changeset/2792
Author:   sagen at apple.com
Date:     2008-08-11 10:56:01 -0700 (Mon, 11 Aug 2008)
Log Message:
-----------
Make sure that a repeatedly-updated calendar doesn't suffer starvation; let a notification out once in a while.

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py

Modified: CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py
===================================================================
--- CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py	2008-08-08 20:08:21 UTC (rev 2791)
+++ CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py	2008-08-11 17:56:01 UTC (rev 2792)
@@ -180,7 +180,7 @@
                 self.log_debug("Sending to notification server: %s" % (uri,))
                 observer.sendLine(str(uri))
         else:
-            self.log_debug("Queing: %s" % (uri,))
+            self.log_debug("Queuing: %s" % (uri,))
             self.queued.add(uri)
 
     def connectionMade(self):
@@ -258,9 +258,14 @@
     """
 
     delaySeconds = 5
+    sendAnywayAfterCount = 5
 
-    def __init__(self, notifiers, reactor=None, delaySeconds=None):
+    def __init__(self, notifiers, reactor=None, delaySeconds=None,
+        sendAnywayAfterCount=None):
 
+        if sendAnywayAfterCount:
+            self.sendAnywayAfterCount = sendAnywayAfterCount
+
         if delaySeconds:
             self.delaySeconds = delaySeconds
 
@@ -268,18 +273,29 @@
             from twisted.internet import reactor
         self.reactor = reactor
 
-        self.uris = dict()
+        self.uris = {}
         self.notifiers = notifiers
 
     def add(self, uri):
-        delayed = self.uris.get(uri, None)
+        delayed, count = self.uris.get(uri, [None, 0])
+
         if delayed and delayed.active():
-            delayed.reset(self.delaySeconds)
+            count += 1
+            if count < self.sendAnywayAfterCount:
+                # reschedule for delaySeconds in the future
+                delayed.reset(self.delaySeconds)
+                self.uris[uri][1] = count
+                self.log_info("Delaying: %s" % (uri,))
+            else:
+                self.log_info("Not delaying to avoid starvation: %s" % (uri,))
         else:
-            self.uris[uri] = self.reactor.callLater(self.delaySeconds,
-                self.delayedEnqueue, uri)
+            self.log_info("Scheduling: %s" % (uri,))
+            self.uris[uri] = [self.reactor.callLater(self.delaySeconds,
+                self.delayedEnqueue, uri), 0]
 
     def delayedEnqueue(self, uri):
+        self.log_info("Time to send: %s" % (uri,))
+        self.uris[uri][1] = 0
         for notifier in self.notifiers:
             notifier.enqueue(uri)
 
@@ -771,7 +787,7 @@
 
     def hammer(self, count):
         for i in xrange(count):
-            self.enqueue("hammertesting")
+            self.enqueue("hammertesting%d" % (count,))
 
 
 class XMPPNotificationFactory(xmlstream.XmlStreamFactory, LoggingMixIn):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080811/c81ece77/attachment.html 


More information about the calendarserver-changes mailing list