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

[Xen-changelog] xsnode.py:



ChangeSet 1.1713.1.27, 2005/06/17 19:18:44+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        xsnode.py:
          Updated watches/event code from Mike Wray.
        Signed-off-by: Mike Wray <mike.wray@xxxxxx>
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 xsnode.py |   72 +++++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 48 insertions(+), 24 deletions(-)


diff -Nru a/tools/python/xen/xend/xenstore/xsnode.py 
b/tools/python/xen/xend/xenstore/xsnode.py
--- a/tools/python/xen/xend/xenstore/xsnode.py  2005-06-17 21:04:06 -04:00
+++ b/tools/python/xen/xend/xenstore/xsnode.py  2005-06-17 21:04:06 -04:00
@@ -46,12 +46,12 @@
             watcher.delSubs(self)
         return watcher
 
-    def notify(self, path, val):
+    def notify(self, token, path, val):
         try:
-            self.fn(self, path, val)
-        except SystemExitException:
+            self.fn(self, token, path, val)
+        except SystemExit:
             raise
-        except:
+        except Exception, ex:
             pass
 
 class Watcher:
@@ -71,6 +71,9 @@
     def getPath(self):
         return self.path
 
+    def getToken(self):
+        return self.path
+
     def addSubs(self, subs):
         self.subscriptions.append(subs)
         self.watch()
@@ -83,14 +86,15 @@
     def watch(self):
         if self.xs: return
         self.xs = xs.open()
-        self.xs.watch(self.path)
+        self.xs.watch(path=self.getPath(), token=self.getToken())
 
     def unwatch(self):
         if self.xs:
-            try:
-                self.xs.unwatch(self.path)
-            except Exception, ex:
-                print 'Watcher>unwatch>', ex
+## Possibly crashes xenstored.
+##            try:
+##                self.xs.unwatch(path=self.getPath(), token=self.getToken())
+##            except Exception, ex:
+##                print 'Watcher>unwatch>', ex
             try:
                 self.xs.close()
             except Exception, ex:
@@ -102,17 +106,22 @@
 
     def getNotification(self):
         p = self.xs.read_watch()
-        self.xs.acknowledge_watch()
+        self.xs.acknowledge_watch(p[1])
         return p
 
     def notify(self):
         try:
-            p = self.getNotification()
-            v = self.xs.read(p)
-            for s in subscriptions:
-                s.notify(p, v)
+            (path, token) = self.getNotification()
+            if path.endswith("@eid"):
+                pass
+            else:
+                val = self.xs.read(path)
+                for subs in self.subscriptions:
+                    subs.notify(token, path, val)
+        except SystemExit:
+            raise
         except Exception, ex:
-            print 'Notify exception:', ex
+            raise
 
 class EventWatcher(Watcher):
 
@@ -126,6 +135,9 @@
     def getEvent(self):
         return self.event
 
+    def getToken(self):
+        return self.event
+
 class XenStore:
 
     xs = None
@@ -145,8 +157,10 @@
                     self.xs = xs.open()
                     ex = None
                     break
+                except SystemExit:
+                    raise
                 except Exception, ex:
-                    print >>sys.stderr, "Exception connecting to xsdaemon:", ex
+                    print >>sys.stderr, "Exception connecting to xenstored:", 
ex
                     print >>sys.stderr, "Trying again..."
                     time.sleep(1)
             else:
@@ -241,7 +255,10 @@
 
     def write(self, path, data, create=True, excl=False):
         self.mkdirs(path)
-        self.getxs().write(path, data, create=create, excl=excl)
+        try:
+            self.getxs().write(path, data, create=create, excl=excl)
+        except Exception, ex:
+            raise
 
     def begin(self, path):
         self.getxs().transaction_start(path)
@@ -261,7 +278,10 @@
         del self.subscriptions[s.sid]
         watcher = s.unwatch()
         if watcher and not watcher.watching():
-            del self.watchers[path]
+            try:
+                del self.watchers[watcher.getPath()]
+            except:
+                pass
 
     def subscribe(self, event, fn):
         path = getEventPath(event)
@@ -280,13 +300,10 @@
             self.mkdirs(eventPath)
             eid = 1
             if self.exists(eidPath):
-                data = self.read(eidPath)
-                print 'sendEvent>', 'data=', data, type(data)
                 try:
                     eid = int(self.read(eidPath))
                     eid += 1
                 except Exception, ex:
-                    print 'sendEvent>', ex
                     pass
             self.write(eidPath, str(eid))
             self.write(os.path.join(eventPath, str(eid)), data)
@@ -346,6 +363,15 @@
         xenstore = XenStore()
         return xenstore
 
+def sendEvent(event, val):
+    getXenStore.sendEvent(event, val)
+
+def subscribe(event, fn):
+    return getXenStore().subscribe(event, fn)
+
+def unsubscribe(sid):
+    getXenStore().unsubscribe(sid)
+
 class XenNode:
 
     def __init__(self, path="/", create=True):
@@ -389,9 +415,7 @@
             return None
 
     def setData(self, data, path=""):
-        path = self.relPath(path)
-        #print 'XenNode>setData>', 'path=', path, 'data=', data
-        return self.store.write(path, data)
+        return self.store.write(self.relPath(path), data)
 
     def getLock(self):
         return None

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.