[or-cvs] r21940: {weather} Work around TorCtl's thread leak (in weather/trunk: . lib/weather)

Christian Fromme kaner at strace.org
Sun Mar 14 15:55:15 UTC 2010


Author: kaner
Date: 2010-03-14 15:55:14 +0000 (Sun, 14 Mar 2010)
New Revision: 21940

Modified:
   weather/trunk/Weather.py
   weather/trunk/lib/weather/config.py
   weather/trunk/lib/weather/poller.py
   weather/trunk/lib/weather/utils.py
Log:
Work around TorCtl's thread leak


Modified: weather/trunk/Weather.py
===================================================================
--- weather/trunk/Weather.py	2010-03-14 02:07:11 UTC (rev 21939)
+++ weather/trunk/Weather.py	2010-03-14 15:55:14 UTC (rev 21940)
@@ -14,6 +14,7 @@
 from twisted.internet import reactor
 from twisted.internet.task import LoopingCall 
 
+from weather.torping import TorPing
 from weather.constants import PAGE_TEMPLATE, PAGE_SIGNUP, CONFIRMATION_MAIL, THANKS_OUT, PAGE_SUB_FIN
 from weather.queries import CHECK_SUBS_Q, INSERT_SUBS_Q, CHECK_SUBS_AUTH_Q, ACK_SUB_Q, UNSUBSCRIBE_Q
 from weather.poller import WeatherPoller
@@ -50,9 +51,9 @@
 
     def _isSubscribedAlready(self):
         dbQuery = CHECK_SUBS_Q % (self.email, self.node)
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._checkHasSubRet)
-        q.addErrback(self._errback)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._checkHasSubRet).addErrback(
+            self._errback)
 
     def _checkHasSubRet(self, result):
         # Do we already have a subscription for this address for this node?
@@ -62,15 +63,14 @@
             self.request.finish()
         else:
             # Alright, subscribe it
-            return self._runSaveQuery()
+            self._runSaveQuery()
 
     def _runSaveQuery(self):
         dbQuery = INSERT_SUBS_Q % (self.email, self.node, \
                               self.subs_auth, self.unsubs_auth, self.downtime)
-        q = self.dbConn.runOperation(dbQuery)
-        q.addCallback(self._saved)
-        q.addErrback(self._errback)
-        return q
+        self.dbConn.runOperation(dbQuery).addCallback(
+            self._saved).addErrback(
+            self._errback)
 
     def _saved(self, result):
         url = URLbase + "/confirm-subscribe?auth=" + self.subs_auth
@@ -91,9 +91,9 @@
 
     def _rollBack(self):
         dbQuery = CHECK_SUBS_Q % (self.email, self.node)
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._errOut)
-        q.addErrback(self._errback)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._errOut).addErrback(
+            self._errback)
 
     def _errOut(self):
         self.request.setResponseCode(http.INTERNAL_SERVER_ERROR)
@@ -116,9 +116,9 @@
 
     def _lookupSubsAuth(self, request):
         dbQuery = CHECK_SUBS_AUTH_Q % self.subs_auth
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._checkRet, request)
-        q.addErrback(self._errback, request)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._checkRet, request).addErrback(
+            self._errback, request)
 
     def _checkRet(self, result, request):
         if len(result) is 0:
@@ -132,9 +132,9 @@
 
     def _ackSubscription(self, request):
         dbQuery = ACK_SUB_Q % self.subs_auth
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._subDone, request)
-        q.addErrback(self._errback, request)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._subDone, request).addErrback(
+            self._errback, request)
 
     def _subDone(self, result, request):
         url = URLbase + "/unsubscribe?auth=" + self.unsubs_auth
@@ -161,9 +161,9 @@
 
     def _deleteSub(self, request):
         dbQuery = UNSUBSCRIBE_Q % self.unsubs_auth
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._deleteDone, request)
-        q.addErrback(self._errback, request)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._deleteDone, request).addErrback(
+            self._errback, request)
 
     def _deleteDone(self, result, request):
         request.setResponseCode(http.OK)
@@ -192,7 +192,9 @@
     # Set up database connection
     dbConn = utils.setupDBConn(databaseName)
     # Set up polling timer
-    weatherPoller = WeatherPoller(dbConn)
+    # XXX Have one main TorPing instance until TotCtl fixes its thread leak
+    torPing = TorPing()
+    weatherPoller = WeatherPoller(dbConn, torPing)
     pollTimer = LoopingCall(weatherPoller.poller)
     pollTimer.start(pollPeriod)
     # Set up webserver

Modified: weather/trunk/lib/weather/config.py
===================================================================
--- weather/trunk/lib/weather/config.py	2010-03-14 02:07:11 UTC (rev 21939)
+++ weather/trunk/lib/weather/config.py	2010-03-14 15:55:14 UTC (rev 21940)
@@ -13,6 +13,6 @@
 failureThreshold = 4 # this number of failures in a row counts as being
                       # down
 
-pollPeriod = 10 # Check every hour
+pollPeriod = 3600 # Check every hour
 
 databaseName = "subscriptions.db"

Modified: weather/trunk/lib/weather/poller.py
===================================================================
--- weather/trunk/lib/weather/poller.py	2010-03-14 02:07:11 UTC (rev 21939)
+++ weather/trunk/lib/weather/poller.py	2010-03-14 15:55:14 UTC (rev 21940)
@@ -10,8 +10,9 @@
 import weather.utils as utils
 
 class WeatherPoller():
-    def __init__(self, dbConn):
+    def __init__(self, dbConn, torPing):
         self.dbConn = dbConn
+        self.torPing = torPing
 
     def poller(self):
         self._checkAll()
@@ -19,9 +20,9 @@
 
     def _checkAll(self):
         dbQuery = queries.GETALL_SUBS_Q
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._checkRet)
-        q.addErrback(self._errBack)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._checkRet).addErrback(
+            self._errBack)
 
     def _checkRet(self, resultList):
         # Loop through result list and check each node
@@ -40,8 +41,7 @@
         print "Error: ", failure.getErrorMessage()
 
     def _checkHost(self, hostID):
-        torPing = TorPing()
-        return torPing.ping(hostID)
+        return self.torPing.ping(hostID)
 
     def _handleOfflineNode(self, dbRow):
         self._getDowntimes(dbRow[0])
@@ -49,9 +49,9 @@
 
     def _getDowntimes(self, id):
         dbQuery = queries.ALL_BY_ID_Q % id
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._decideNotice)
-        q.addErrback(self._errBack)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._decideNotice).addErrback(
+            self._errBack)
 
     def _decideNotice(self, result):
         downGrace = result[0][6] 
@@ -79,21 +79,21 @@
 
     def _setNoticed(self, id):
         dbQuery = queries.UPDATE_NOTICED_Q % id
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._updateDone)
-        q.addErrback(self._errBack)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._updateDone).addErrback(
+            self._errBack)
 
     def _updateDowntime(self, id):
         dbQuery =  queries.UPDATE_DOWN_Q % id
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._updateDone)
-        q.addErrback(self._errBack)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._updateDone).addErrback(
+            self._errBack)
 
     def _updateDone(self, result):
         print "Query ok"        
 
     def _resetSeendown(self, dbRow):
         dbQuery = queries.RESET_COUNT_Q % dbRow[0]
-        q = self.dbConn.runQuery(dbQuery)
-        q.addCallback(self._updateDone)
-        q.addErrback(self._errBack)
+        self.dbConn.runQuery(dbQuery).addCallback(
+            self._updateDone).addErrback(
+            self._errBack)

Modified: weather/trunk/lib/weather/utils.py
===================================================================
--- weather/trunk/lib/weather/utils.py	2010-03-14 02:07:11 UTC (rev 21939)
+++ weather/trunk/lib/weather/utils.py	2010-03-14 15:55:14 UTC (rev 21940)
@@ -20,7 +20,7 @@
     db = sqlite3.connect(databaseName)
     db.execute(CREATE_TABLE_Q % "subscriptions")
     db.close()
-    dbConn = adbapi.ConnectionPool("sqlite3", databaseName)
+    dbConn = adbapi.ConnectionPool("sqlite3", databaseName, check_same_thread=False)
     return dbConn
 
 def checkMail(email):



More information about the tor-commits mailing list