On 03/16/2012 11:50 AM, Eric Blake wrote:
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.
Well, yes. I figured that either (1) iptables actually got -EINTR from
the kernel and passed that along as its exit code, or (2) something went
wrong with memory being overwritten in libvirt, however unlikely.
Stranger things have happened. If (1), I was wondering if it was being
ignored on purpose.
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.
Yeah I don't really either.
> I think you'd be better off investigating why iptables really
is exiting with status 4.
Well, given what EINTR means, shouldn't src/util/iptables.c re-try the
command if it gets that?
Anyway I'll keep digging, but was wondering if anyone else has seen this.
-serge
--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list