Ignore any watches that fire for which we do not have a registration. This can

happen if there are watches in flight at the same time as a deregistration, and
also seems to happen spuriously on xend restart.

This fixes the Invalid token error that has been seen on xend restart.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
This commit is contained in:
emellor@ewan committed 2005-10-12 13:00:55 +01:00
1 parent 0041d06c95
commit 5ca91af2f8
2 files changed
+19 -7

No files matched your search

+8 -2
View File
@@ -513,6 +513,7 @@ static PyObject *xspy_read_watch(PyObject *self, PyObject *args,
goto exit;
if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec))
goto exit;
again:
Py_BEGIN_ALLOW_THREADS
xsval = xs_read_watch(xh, &num);
Py_END_ALLOW_THREADS
@@ -529,8 +530,13 @@ static PyObject *xspy_read_watch(PyObject *self, PyObject *args,
break;
}
if (i == PyList_Size(xsh->watches)) {
PyErr_SetString(PyExc_RuntimeError, "invalid token");
goto exit;
/* We do not have a registered watch for the one that has just fired.
Ignore this -- a watch that has been recently deregistered can still
have watches in transit. This is a blocking method, so go back to
read again.
*/
free(xsval);
goto again;
}
/* Create tuple (path, token). */
val = Py_BuildValue("(sO)", xsval[XS_WATCH_PATH], token);
+11 -5
View File
@@ -10,6 +10,9 @@ import threading
from xen.lowlevel import xs
from xen.xend.xenstore.xsutil import xshandle
from xen.xend.XendLogging import log
class xswatch:
watchThread = None
@@ -41,10 +44,13 @@ class xswatch:
while True:
try:
we = cls.xs.read_watch()
except RuntimeError, ex:
print ex
raise
watch = we[1]
watch.fn(*watch.args, **watch.kwargs)
watch = we[1]
watch.fn(*watch.args, **watch.kwargs)
except:
log.exception("read_watch failed")
# Ignore this exception -- there's no point throwing it
# further on because that will just kill the watcher thread,
# which achieves nothing.
watchMain = classmethod(watchMain)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.