[virt-tools-list] [PATCH virt-viewer] RFC: Show failed file transfers

Jonathon Jongsma jjongsma at redhat.com
Wed Aug 31 21:10:05 UTC 2016


On Tue, 2016-08-30 at 21:42 +0200, Fabiano Fidêncio wrote:
> Jonathon,
> 
> On Wed, Aug 17, 2016 at 9:10 PM, Jonathon Jongsma <jjongsma at redhat.co
> m> wrote:
> > 
> > After all ongoing file transfers are finished, save a list of the
> > file
> > transfer tasks that had errors and display the list of failed files
> > to
> > the user so that they know that a failure occurred and can
> > potentially
> > retry the transfer. Previously, we just failed silently so the user
> > may not have even been aware that the transfer failed.
> > ---
> 
> As the list is now saved, can we present the "Retry" option for those
> files?
> 
> > 
> > 
> > Undoubtedly there are many improvements that could be made here.
> > And there are
> > many alternate aproaches that could be taken.
> > 
> > I could possibly have displayed the error message in the same
> > dialog that shows
> > the transfer progress, but that complicates things slightly,
> > because we'd have
> > to keep the dialog open so that the user can read the message, and
> > change the
> > button from 'cancel' to 'close' or 'ok', in addition to other
> > things. A
> > separate dedicated dialog seemed better than trying to shoehorn it
> > into the
> > progress dialog.
> 
> Indeed.
> 
> > 
> > 
> > Another question is: should the VirtViewerFileTransferDialog have
> > the
> > responsibility for handling file transfer errors at all? Or should
> > that be
> > handled at the VirtViewerSessionSpice level? If
> > VirtViewerSessionSpice handles
> > the errors and displays an error dialog, we could possibly add a
> > "Retry" button
> > since the VirtViewerSessionSpice object holds a reference to the
> > SpiceMainChannel. On the other hand, VirtViewerSessionSpice doesn't
> > currently
> > know the status of all ongoing file transfers, so it's not as easy
> > to wait
> > until the end of a batch of file transfers to display a single
> > error message
> > for all failures. And I don't think popping up a separate dialog
> > for each of 10
> > file transfer failures would be desirable.
> 
> Hmmm. Here you answered my question.
> 
> I'd say that, at this point, a "Retry" button isn't something we
> would
> like to have. It's a good thing for the future, though, in case we
> decide to improve things either here and in spice-gtk.
> I'd keep the approach as simple as possible for now and re-work this
> after having spice-gtk in a better shape (as I said in some mail
> thread before, depending basically on how much effort you guys want
> to
> spend in the file-transfer approach).

Right, it would be a nice feature in theory, but I think this is a
reasonable first step.

> 
> > 
> > 
> > There are probably other non-dialog approaches we could take as
> > well, but I
> > thought I'd put this out there for discussion, since I think it's
> > important to
> > communicate *some* feedback to the user in case of failure.
> > 
> > 
> >  src/virt-viewer-file-transfer-dialog.c | 37
> > +++++++++++++++++++++++++++++++++-
> >  1 file changed, 36 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/virt-viewer-file-transfer-dialog.c b/src/virt-
> > viewer-file-transfer-dialog.c
> > index 3339ba4..626a26a 100644
> > --- a/src/virt-viewer-file-transfer-dialog.c
> > +++ b/src/virt-viewer-file-transfer-dialog.c
> > @@ -26,6 +26,7 @@
> >  struct _VirtViewerFileTransferDialogPrivate
> >  {
> >      GSList *file_transfers;
> > +    GSList *failed;
> >      guint timer_show_src;
> >      guint timer_hide_src;
> >      GtkWidget *transfer_summary;
> > @@ -157,6 +158,14 @@ static void task_progress_notify(GObject
> > *object G_GNUC_UNUSED,
> >      update_global_progress(self);
> >  }
> > 
> > +static void
> > +error_dialog_response(GtkDialog *dialog,
> > +                      gint response_id G_GNUC_UNUSED,
> > +                      gpointer user_data G_GNUC_UNUSED)
> > +{
> > +    gtk_widget_destroy(GTK_WIDGET(dialog));
> > +}
> > +
> >  static gboolean hide_transfer_dialog(gpointer data)
> >  {
> >      VirtViewerFileTransferDialog *self = data;
> > @@ -165,6 +174,30 @@ static gboolean hide_transfer_dialog(gpointer
> > data)
> >                                        GTK_RESPONSE_CANCEL, FALSE);
> >      self->priv->timer_hide_src = 0;
> > 
> > +    /* When all ongoing file transfers are finished, show errors
> > */
> > +    if (self->priv->failed) {
> > +        GSList *sl;
> > +        GString *msg = g_string_new("");
> > +
> > +        for (sl = self->priv->failed; sl != NULL; sl =
> > g_slist_next(sl)) {
> > +            SpiceFileTransferTask *failed_task = sl->data;
> > +            gchar *filename =
> > spice_file_transfer_task_get_filename(failed_task);
> > +
> > +            g_string_append_printf(msg, "\n%s", filename);
> > +            g_free(filename);
> > +        }
> > +        g_slist_free_full(self->priv->failed, g_object_unref);
> > +        self->priv->failed = NULL;
> > +
> > +        GtkWidget *dialog =
> > gtk_message_dialog_new(GTK_WINDOW(self), 0, GTK_MESSAGE_ERROR,
> > +                                                   GTK_BUTTONS_OK,
> > +                                                   _("An error
> > caused following file transfers to fail:\n%s"),
> > +                                                   msg->str);
> 
> Hmm. Thinking about the use where I most used file transfer that was
> copying .dlls for debugging the windows builds ... I was transferring
> 40~50 files each time, in case an error occurs and the most part of
> those files are not transferred, this message would be quite
> unreadable, no?

Good point. And that use case (transferring lots of files at once) was
a weakness of the old file transfer dialog as well, so I should have
considered it. One possibility:

- When there are only a couple failures (perhaps < 2 or 3), we could
display the list of files as done above

- For cases where a lot of files fail (> 2 or 3) we could just display
the number of files that failed: "An error caused N file transfers to
fail"


> 
> > 
> > +        g_string_free(msg, TRUE);
> > +        g_signal_connect(dialog, "response",
> > G_CALLBACK(error_dialog_response), NULL);
> > +        gtk_widget_show(dialog);
> > +    }
> > +
> >      return G_SOURCE_REMOVE;
> >  }
> > 
> > @@ -174,8 +207,10 @@ static void
> > task_finished(SpiceFileTransferTask *task,
> >  {
> >      VirtViewerFileTransferDialog *self =
> > VIRT_VIEWER_FILE_TRANSFER_DIALOG(user_data);
> > 
> > -    if (error && !g_error_matches(error, G_IO_ERROR,
> > G_IO_ERROR_CANCELLED))
> > +    if (error && !g_error_matches(error, G_IO_ERROR,
> > G_IO_ERROR_CANCELLED)) {
> > +        self->priv->failed = g_slist_prepend(self->priv->failed,
> > g_object_ref(task));
> >          g_warning("File transfer task %p failed: %s", task, error-
> > >message);
> > +    }
> > 
> >      self->priv->file_transfers = g_slist_remove(self->priv-
> > >file_transfers, task);
> >      g_object_unref(task);
> > --
> > 2.7.4
> > 
> > _______________________________________________
> > virt-tools-list mailing list
> > virt-tools-list at redhat.com
> > https://www.redhat.com/mailman/listinfo/virt-tools-list
> 
> I'm wondering whether would be useful to show the list of failures in
> some log message instead of doing it in the UI.
> What do you think? Maybe do it in both ways?

I think spice-gtk already logs some details about failed file transfers
in spice_file_transfer_task_completed(). I'm not sure if we need
anything additional in virt-viewer. 

Jonathon




More information about the virt-tools-list mailing list