[libvirt] [PATCH v3] tools: console: Relax stream EOF handling
Michal Privoznik
mprivozn at redhat.com
Fri Aug 23 12:37:39 UTC 2019
On 8/21/19 3:33 PM, Roman Bolshakov wrote:
> Regular VM shutdown triggers the error for existing session of virsh
> console and it returns with non-zero exit code:
> error: internal error: console stream EOF
>
> The message and status code are misleading because there's no real
> error. virStreamRecv returns 0 correctly when EOF is reached.
>
> Existing implementations of esx, fd, and remote streams behave the same
> for virStreamFinish and virStreamAbort: they close the stream. So, we
> can continue to use virStreamAbort to handle EOF and errors from
> virStreamRecv but additonally we can report error if virStreamAbort
> fails.
>
> Fixes: 29f2b5248c6 ("tools: console: pass stream/fd errors to user")
> Signed-off-by: Roman Bolshakov <r.bolshakov at yadro.com>
> ---
> tools/virsh-console.c | 8 +++-----
> 1 file changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/tools/virsh-console.c b/tools/virsh-console.c
> index e16f841e57..a235a9a283 100644
> --- a/tools/virsh-console.c
> +++ b/tools/virsh-console.c
> @@ -106,7 +106,9 @@ virConsoleShutdown(virConsolePtr con)
>
> if (con->st) {
> virStreamEventRemoveCallback(con->st);
> - virStreamAbort(con->st);
> + if (virStreamAbort(con->st) < 0)
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("cannot terminate console stream"));
> virStreamFree(con->st);
> con->st = NULL;
> }
> @@ -172,10 +174,6 @@ virConsoleEventOnStream(virStreamPtr st,
> if (got == -2)
> goto cleanup; /* blocking */
> if (got <= 0) {
> - if (got == 0)
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("console stream EOF"));
> -
I still think we need to call virStreamFinish() in this case and not
virStreamAbort() (hidden in virConsoleShutdown()). The reason is that
when we read 0 bytes (= indication of EOF) the virStreamFinish() informs
the sending side that we've read all the data and we've done so
successfuly. If we abort the stream, it's sending a message that we've
encountered an error on the very last packet in the stream, which is not
true. It may not be that huge of the problem in case of ESX where the
only difference between streamFinish() and streamAbort() is an error
message that is or is not logged.
However, I will merge your patch because it's removing spurious error
message and I'll post a patch to allow graceful console shutdown.
Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
Michal
More information about the libvir-list
mailing list