On 03/16/2012 10:36 AM, Serge Hallyn wrote:
Hi,
It seems I've run into quite the heisenbug, reported at
https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/922628
It manifests itself as virPidWait returning status=4 for iptables (which
should never exit with status=4).
Maybe iptables isn't documented as exiting with $? of 4, but that's what
is happening. The libvirt code in question is quite clear that it
grabbed an accurate exit status from the child process.
ret = virPidWait(cmd->pid, exitstatus ? exitstatus : &status);
if (ret == 0) {
cmd->pid = -1;
cmd->reap = false;
if (status) {
char *str = virCommandToString(cmd);
char *st = virCommandTranslateStatus(status);
virCommandError(VIR_ERR_INTERNAL_ERROR,
_("Child process (%s) status unexpected: %s"),
str ? str : cmd->args[0], NULLSTR(st));
But it's only been seen on two (very
different) machines, and the slightest shifting of the winds makes it go
away. Given how sneaky this bug appears to be, there's a slight
temptation to have iptablesAddRemoveRule pass in a int* for status and
better deal with the -EINTR. But I fear that might be papering over a
worse race.
I don't follow how you think there is a -EINTR being encountered in
libvirt. I think you'd be better off investigating why iptables really
is exiting with status 4.
--
Eric Blake eblake(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org