Tagging module NodeManager - NodeManager-1.8-1
[nodemanager.git] / accounts.py
index 6bffdbe..480129c 100644 (file)
@@ -10,6 +10,14 @@ code.  For no particular reason, TYPE is divided hierarchically by
 periods; at the moment the only convention is that all sliver accounts
 have type that begins with sliver.
 
+There are any number of race conditions that may result from the fact
+that account names are not unique over time.  Moreover, it's a bad
+idea to perform lengthy operations while holding the database lock.
+In order to deal with both of these problems, we use a worker thread
+for each account name that ever exists.  On 32-bit systems with large
+numbers of accounts, this may cause the NM process to run out of
+*virtual* memory!  This problem may be remedied by decreasing the
+maximum stack size.
 """
 
 import Queue
@@ -41,7 +49,6 @@ def register_class(acct_class):
 
 # private account name -> worker object association and associated lock
 name_worker_lock = threading.Lock()
-# dict of account_name: <Worker Object>
 name_worker = {}
 
 def allpwents():
@@ -55,9 +62,7 @@ def get(name):
     """Return the worker object for a particular username.  If no such object exists, create it first."""
     name_worker_lock.acquire()
     try:
-        if name not in name_worker: 
-            logger.verbose("Accounts:get(%s) new Worker" % name)
-            name_worker[name] = Worker(name)
+        if name not in name_worker: name_worker[name] = Worker(name)
         return name_worker[name]
     finally: name_worker_lock.release()
 
@@ -127,7 +132,7 @@ class Worker:
     def stop(self): self._acct.stop()
 
     def is_running(self): 
-        if self._acct.is_running():
+        if (self._acct != None) and self._acct.is_running():
             status = True
         else:
             status = False