Author: dmeyer
Date: Fri Apr 21 18:19:10 2006
New Revision: 1435

Modified:
   trunk/beacon/src/client.py
   trunk/beacon/src/query.py

Log:
make reconnect work, internal name cleanup

Modified: trunk/beacon/src/client.py
==============================================================================
--- trunk/beacon/src/client.py  (original)
+++ trunk/beacon/src/client.py  Fri Apr 21 18:19:10 2006
@@ -45,7 +45,7 @@
 import kaa
 import kaa.ipc
 from kaa.weakref import weakref
-from kaa.notifier import OneShotTimer
+from kaa.notifier import OneShotTimer, Signal
 
 # kaa.beacon imports
 from db import Database
@@ -54,7 +54,23 @@
 # get logging object
 log = logging.getLogger('beacon')
 
+DISCONNECTED = 'disconnected'
+CONNECTED    = 'connected'
+SHUTDOWN     = 'shutdown'
 
+class ServerIPC(object):
+    def __init__(self):
+        self.connection = kaa.ipc.IPCClient('beacon')
+        self.signals = self.connection.signals
+        self.server = self.connection.get_object('beacon')
+        self.monitor = self.server.monitor
+
+    def __getattr__(self, attr):
+        return getattr(self.server, attr)
+
+    def is_alive(self):
+        return kaa.ipc.is_proxy_alive(self.server)
+        
 class Client(object):
     """
     Beacon client. This client uses the db read only and needs a server on
@@ -63,14 +79,19 @@
     def __init__(self):
         self.database = None
 
-        self._connect()
+        self.signals = {
+            'connect': Signal(),
+            'disconnect': Signal()
+            }
+        
         # internal list of active queries
         self._queries = []
         # internal list of items to update
         self._changed = []
         # add ourself to shutdown handler for correct disconnect
-        kaa.signals['shutdown'].connect(self.disconnect)
-        kaa.notifier.WeakTimer(self._check_is_connected).start(5)
+        kaa.signals['shutdown'].connect(self._shutdown)
+        self.status = DISCONNECTED
+        self._connect()
 
 
     def _connect(self):
@@ -78,43 +99,67 @@
         Establish connection to the beacon server and locally connect to the
         database (if necessary).
         """
+        if self.status != DISCONNECTED:
+            # no re-connect needed
+            return
+
         # monitor function from the server to start a new monitor for a query
-        self._server = kaa.ipc.IPCClient('beacon').get_object('beacon')
-        self._monitor = self._server.monitor
+        self._server = ServerIPC()
+        self._server.signals["closed"].connect_once(self._disconnected)
         # read only version of the database
         if not self.database:
             self.database = Database(self._server.get_database(), self)
         # connect to server notifications
         self.id = self._server.connect(self)
+        self.status = CONNECTED
+        self.signals['connect'].emit()
 
-    def _check_is_connected(self):
+
+    def _disconnected(self):
+        if self.status != CONNECTED:
+            return
+        log.warning('disconnected from beacon server')
+        kaa.notifier.WeakTimer(self._reconnect).start(2)
+        self.status = DISCONNECTED
+        self.signals['disconnect'].emit()
+
+
+    def _reconnect(self):
         """
         See if the socket with the server is still alive, otherwise reconnect.
         """
-        if kaa.ipc.is_proxy_alive(self._server):
-            # Still alive.
-            return True
+        if self._server.is_alive():
+            # already alive again
+            return False
 
         # Got disconnected; reconnect.
         try:
             self._connect()
         except kaa.ipc.IPCSocketError, (err, msg):
-            log.error('Error: failed to connect to beacon server: %s 
(errno=%d)' % (msg, err))
+            # still dead
+            return True
 
-        # FIXME: re-register any monitors with the server that may have been
-        # lost due to a disconnect.  dischi? :)
+        # reset monitors to queries
+        for query in self._queries:
+            if query != None and query.monitoring:
+                self.monitor_query(query, True)
+
+        # FIXME: also set up all information in the database again, like
+        # mountpoints and directories to monitor
+        log.info('beacon connected again')
+        return False
 
 
-    def disconnect(self):
+    def _shutdown(self):
         """
         Disconnect from the server.
         """
+        self.status = SHUTDOWN
         for q in self._queries:
             if q:
-                q._monitor = False
+                q.monitoring = False
         self._queries = []
         self._server = None
-        self._monitor = None
         self.database = None
         
         
@@ -122,6 +167,8 @@
         """
         Add a mountpoint to the system.
         """
+        if not self.status == CONNECTED:
+            return
         self._server.add_mountpoint(device, directory)
 
 
@@ -140,24 +187,28 @@
         return result
     
 
-    def monitor(self, query, status):
+    def monitor_query(self, query, status):
         """
         Monitor a query
         """
+        if not self.status == CONNECTED:
+            return
         q = None
         if status:
             q = copy.copy(query._query)
             if 'parent' in q:
                 q['parent'] = q['parent']._beacon_id
 
-        self._check_is_connected()
-        self._monitor(self.id, query.id, q, __ipc_noproxy_args=True, 
__ipc_oneway=True)
+        self._server.monitor(self.id, query.id, q, __ipc_noproxy_args=True,
+                             __ipc_oneway=True)
         
 
     def _beacon_request(self, filename):
         """
         Request information about a filename.
         """
+        if not self.status == CONNECTED:
+            return None
         return self._server.request(filename, __ipc_noproxy_result=True,
                                     __ipc_noproxy_args=True)
 
@@ -186,6 +237,8 @@
         """
         Update item in next main loop interation.
         """
+        if not self.status == CONNECTED:
+            return
         if not item:
             # do the update now
             items = []

Modified: trunk/beacon/src/query.py
==============================================================================
--- trunk/beacon/src/query.py   (original)
+++ trunk/beacon/src/query.py   Fri Apr 21 18:19:10 2006
@@ -55,9 +55,8 @@
         self.id = Query.NEXT_ID
         Query.NEXT_ID += 1
         self._query = query
-        self._monitor = False
         self._client = client
-
+        self.monitoring = False
         self.result = self._client.database.query(**query)
     
 
@@ -65,10 +64,10 @@
         """
         Turn on/off query mnitoring
         """
-        if self._monitor == status:
+        if self.monitoring == status:
             return
-        self._client.monitor(self, status)
-        self._monitor = status
+        self._client.monitor_query(self, status)
+        self.monitoring = status
 
         
     def _beacon_progress(self, pos, max, url):
@@ -118,8 +117,8 @@
         """
         Memory debug
         """
-        if self._monitor:
-            self.monitor(False)
+        if self.monitoring:
+            self.monitor_query(False)
         log.debug('del %s' % repr(self))
 
 


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to