提交 35966308 编写于 作者: E Eric Blake

virsh: Fix regression with duplicated error messages

Commit 4f4c3b13 (v3.3) fixed an issue where performing cleanup of
libvirt objects could sometimes lose error messages, by adding code
to copy the libvirt error into last_error prior to cleanup paths.
However, it caused a regression: on other paths, some errors are now
printed twice, if libvirt still remembers in its thread-local
storage that an error was set even after virsh cleared last_error.
For example:

$ virsh -c test:///default snapshot-delete test blah
error: Domain snapshot not found: no domain snapshot with matching name 'blah'
error: Domain snapshot not found: no domain snapshot with matching name 'blah'

Fix things by telling libvirt to discard any thread-local errors at
the same time virsh prints an error message (whether or not the libvirt
error is the same as what is stored in last_error).

Update the virsh-undefine testsuite (partially reverting portions of
commit b620bdee, by removing -q, to more easily pinpoint which commands
are causing which messages), now that there is only one error message
instead of two.
Signed-off-by: NEric Blake <eblake@redhat.com>
Reviewed-by: NMichal Privoznik <mprivozn@redhat.com>
上级 297ed93a
...@@ -30,34 +30,46 @@ fail=0 ...@@ -30,34 +30,46 @@ fail=0
# connection is opened to the test driver, it starts life with a new # connection is opened to the test driver, it starts life with a new
# persistent running domain named 'test' with a different uuid, so # persistent running domain named 'test' with a different uuid, so
# testing this command requires batch mode use of virsh. # testing this command requires batch mode use of virsh.
$abs_top_builddir/tools/virsh -q -c test:///default \ $abs_top_builddir/tools/virsh -c test:///default \
'dominfo test; undefine test; dominfo test' > out1 2>&1 'dominfo test; undefine test; dominfo test' > out1 2>&1
test $? = 0 || fail=1 test $? = 0 || fail=1
sed '/^Persistent/n; /:/d' < out1 > out sed '/^Persistent/n; /:/d' < out1 > out
cat <<\EOF > exp || fail=1 cat <<\EOF > exp || fail=1
Persistent: yes Persistent: yes
Domain test has been undefined
Persistent: no Persistent: no
EOF EOF
compare exp out || fail=1 compare exp out || fail=1
# A similar diagnostic when specifying a domain ID # A similar diagnostic when specifying a domain ID
$abs_top_builddir/tools/virsh -q -c test:///default \ $abs_top_builddir/tools/virsh -c test:///default \
'dominfo 1; undefine 1; dominfo 1' > out1 2>&1 'dominfo 1; undefine 1; dominfo 1' > out1 2>&1
test $? = 0 || fail=1 test $? = 0 || fail=1
sed '/^Persistent/n; /:/d' < out1 > out sed '/^Persistent/n; /:/d' < out1 > out
cat <<\EOF > exp || fail=1 cat <<\EOF > exp || fail=1
Persistent: yes Persistent: yes
Domain 1 has been undefined
Persistent: no Persistent: no
EOF EOF
compare exp out || fail=1 compare exp out || fail=1
# Succeed, now: first shut down, then undefine, both via name. # Succeed, now: first shut down, then undefine, both via name.
$abs_top_builddir/tools/virsh -q -c test:///default \ $abs_top_builddir/tools/virsh -c test:///default \
'shutdown test; undefine test; dominfo test' > out 2>&1 'shutdown test; undefine test; dominfo test' > out 2>&1
test $? = 1 || fail=1 test $? = 1 || fail=1
cat <<\EOF > expout || fail=1 cat <<\EOF > expout || fail=1
Domain test is being shutdown
Domain test has been undefined
error: failed to get domain 'test' error: failed to get domain 'test'
error: Domain not found
EOF EOF
compare expout out || fail=1 compare expout out || fail=1
......
...@@ -276,6 +276,7 @@ vshResetLibvirtError(void) ...@@ -276,6 +276,7 @@ vshResetLibvirtError(void)
{ {
virFreeError(last_error); virFreeError(last_error);
last_error = NULL; last_error = NULL;
virResetLastError();
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册