[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v3] tools: console: Relax stream EOF handling



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 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 redhat com>

Michal


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]