commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue common/src/commdrivers/_helpers/ObjectLibr...


From: Jan Ischebeck
Subject: gnue common/src/commdrivers/_helpers/ObjectLibr...
Date: Thu, 01 Aug 2002 18:29:43 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Jan Ischebeck <address@hidden>  02/08/01 18:29:43

Modified files:
        common/src/commdrivers/_helpers: ObjectLibrarian.py 
                                         ObjectEnabler.py 
        appserver      : TODO 

Log message:
        added timeout for dynamic created objects to RPC library, and a garbage 
collector which is running in a seperate thread

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/commdrivers/_helpers/ObjectEnabler.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/TODO.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: gnue/appserver/TODO
diff -c gnue/appserver/TODO:1.1 gnue/appserver/TODO:1.2
*** gnue/appserver/TODO:1.1     Wed Jun  5 15:15:58 2002
--- gnue/appserver/TODO Thu Aug  1 18:29:43 2002
***************
*** 5,9 ****
  * close session after connection is finished or authentification failed
    ( in DBdriver )
  
! * add timeouts for dynamic objects ( f.e. session should be closed after max. 
!   2 hours inactivity )
--- 5,13 ----
  * close session after connection is finished or authentification failed
    ( in DBdriver )
  
! * session management:
!   create a combined timeout for a whole session, i.e. only if a session 
!   timeouts, release all other objects
!   
! 
! * add a safe 'restart' command (which reloads configuration files etc., with 
very low downtime, and (if possible) no need to restart clients)
Index: gnue/common/src/commdrivers/_helpers/ObjectEnabler.py
diff -c gnue/common/src/commdrivers/_helpers/ObjectEnabler.py:1.1 
gnue/common/src/commdrivers/_helpers/ObjectEnabler.py:1.2
*** gnue/common/src/commdrivers/_helpers/ObjectEnabler.py:1.1   Tue Jun 11 
19:44:15 2002
--- gnue/common/src/commdrivers/_helpers/ObjectEnabler.py       Thu Aug  1 
18:29:43 2002
***************
*** 40,45 ****
--- 40,46 ----
    def __init__(self, rpcdef, bindings, params):
      DirectoryServer.DirectoryServer.__init__(self, rpcdef, bindings, params)
      self._dispatchers=[self.objectDispatcher]+self._dispatchers
+     ObjectLibrarian._global_GarbageCollector.start_in_new_thread()
  
  
    def objectDispatcher(self, method, params):
Index: gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py
diff -c gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py:1.2 
gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py:1.3
*** gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py:1.2 Wed Dec 19 
02:50:26 2001
--- gnue/common/src/commdrivers/_helpers/ObjectLibrarian.py     Thu Aug  1 
18:29:43 2002
***************
*** 28,34 ****
  # NOTES:
  #
  
! import sha, time
  
  class InvalidObjectReference(StandardError):
    pass
--- 28,34 ----
  # NOTES:
  #
  
! import sha, time, thread
  
  class InvalidObjectReference(StandardError):
    pass
***************
*** 47,53 ****
      _index += time.clock()
      object._ObjectLibrarian__refid = \
          sha.new("%s%s%s"%(id(object), object, _index)).hexdigest()
! 
      return object._ObjectLibrarian__refid
  
  
--- 47,58 ----
      _index += time.clock()
      object._ObjectLibrarian__refid = \
          sha.new("%s%s%s"%(id(object), object, _index)).hexdigest()
!     
!     # add creation time
!     now = time.time()
!     object._ObjectLibrarian__creationtime = now
!     object._ObjectLibrarian__lastusage = now
!     
      return object._ObjectLibrarian__refid
  
  
***************
*** 57,63 ****
  
  def retrieveObject(handle):
    try:
!     return _objects[handle]
    except KeyError:
      raise InvalidObjectReference
  
--- 62,77 ----
  
  def retrieveObject(handle):
    try:
!     object = _objects[handle]
! 
!     if hasattr(object,"_ObjectLibrarian__myGC"):
!       # call private Garbage Collector (f.e. for sessions)
!       object._ObjectLibrarian__myGC.beingRetrieved(object)
!     else:
!       # just store last used time
!       object._ObjectLibrarian__lastusage = time.time()
!     
!     return object
    except KeyError:
      raise InvalidObjectReference
  
***************
*** 69,71 ****
--- 83,136 ----
      pass
    except AttributeError:
      pass
+ 
+ def getObjectLibrarianStatus():
+   status={}
+   status["objcount"]=len(_objects)
+   return status
+ 
+ class GarbageCollector:
+   def __init__(self):
+     self.defaultTimeout=3600  # in seconds
+     self.loopLength=20        # in seconds
+     self.running=0
+     
+   def setDefaultTimeout(self,timespan):
+     self.defaultTimeout=timespan
+ 
+   def getDefaultTimeout(self):
+     return self.defaultTimeout
+ 
+   def setLoopLength(self,length):
+     self.loopLength=length
+     
+   def getLoopLength(self):
+     return self.loopLength
+   
+   def cleanUp(self):
+     # is this threadsafe ?
+     keys=_objects.keys()
+     now=time.time()
+     for handle in keys:
+       try:
+         object=_objects[handle]
+         if not hasattr(object,"_ObjectLibrarian__myGC"):
+           if object._ObjectLibrarian__lastusage + self.defaultTimeout < now:
+             deferenceObject(object)
+       except:
+         pass
+   def loop(self):
+     while 1==1:
+       self.cleanUp()
+       time.sleep(self.loopLength)
+       
+   def start_in_new_thread(self):
+     if self.running:
+       return
+     self.running=1
+     thread.start_new_thread(self.loop,())   
+ 
+ 
+ _global_GarbageCollector = GarbageCollector()
+ 
+ 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]