Qabel / qabel-desktop

(B2C) :computer: Desktop frontend of Qabel
Other
11 stars 12 forks source link

Sync failure UI feedback #541

Open enkore opened 7 years ago

enkore commented 7 years ago

Currently it is hardly visible in the GUI that some sync failed. This should be communicated more clearly. The failures log dialog should be revamped as well to be more clear about what files failed etc.

mr-gosh commented 7 years ago

how does the failure dialog look like at the moment?

mr-gosh commented 7 years ago

perhaps this should be integrated to #525 too

enkore commented 7 years ago

There's a list window which looks similar to this one:

2016-10-17-173259_2560x1440_scrot

Most errors don't show up at all, though. They just print tracebacks to the console, like these:

2016-10-17 17:33:06.585 [TransactionManager] ERROR de.qabel.desktop.daemon.management.DefaultTransferManager - Transaction failed: no file named qabel-desktop-linux_amd64-dev.zip
java.lang.IllegalArgumentException: no file named qabel-desktop-linux_amd64-dev.zip
        at de.qabel.box.storage.AbstractNavigation.getFile(AbstractNavigation.kt:621) ~[box-0.25.5.jar:0.25.5]
        at de.qabel.desktop.storage.cache.CachedBoxNavigation.getFile(CachedBoxNavigation.java:213) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.daemon.management.DefaultTransferManager.executeUpload(DefaultTransferManager.java:241) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.daemon.management.DefaultTransferManager.upload(DefaultTransferManager.java:207) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.daemon.management.DefaultTransferManager.next(DefaultTransferManager.java:101) [qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.daemon.management.DefaultTransferManager.run(DefaultTransferManager.java:75) [qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.daemon.management.MonitoredTransferManager.run(MonitoredTransferManager.java:51) [qabel-desktop-dev.jar:dev]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_102]
2016-10-17 17:34:21.190 [JavaFX Application Thread] ERROR de.qabel.desktop.ui.sync.item.SyncItemController - null
java.lang.NullPointerException
        at de.qabel.desktop.ui.sync.item.SyncItemController.renderTransaction(SyncItemController.java:183) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.ui.sync.item.SyncItemController.lambda$null$8(SyncItemController.java:226) ~[qabel-desktop-dev.jar:dev]
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[?:1.8.0_102]
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:352) ~[?:1.8.0_102]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[?:1.8.0_102]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[?:1.8.0_102]
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[?:1.8.0_102]
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[?:1.8.0_102]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_102]
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[?:1.8.0_102]
        at de.qabel.desktop.ui.sync.item.SyncItemController.lambda$showHistory$9(SyncItemController.java:222) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.ui.AbstractController.tryOrAlert(AbstractController.java:30) ~[qabel-desktop-dev.jar:dev]
        at de.qabel.desktop.ui.sync.item.SyncItemController.showHistory(SyncItemController.java:214) ~[qabel-desktop-dev.jar:dev]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_102]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_102]
        at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) ~[?:1.8.0_102]
        at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_102]
        at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) ~[?:1.8.0_102]
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771) ~[jfxrt.jar:?]
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) ~[jfxrt.jar:?]
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) ~[jfxrt.jar:?]
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) ~[jfxrt.jar:?]
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[jfxrt.jar:?]
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[jfxrt.jar:?]
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) ~[jfxrt.jar:?]
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) ~[jfxrt.jar:?]
        at javafx.event.Event.fireEvent(Event.java:198) ~[jfxrt.jar:?]
        at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470) ~[jfxrt.jar:?]
        at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398) ~[jfxrt.jar:?]
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3766) ~[jfxrt.jar:?]
        at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) ~[jfxrt.jar:?]
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) ~[jfxrt.jar:?]
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) ~[jfxrt.jar:?]
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380) ~[jfxrt.jar:?]
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294) ~[jfxrt.jar:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_102]
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416) ~[jfxrt.jar:?]
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) ~[jfxrt.jar:?]
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415) ~[jfxrt.jar:?]
        at com.sun.glass.ui.View.handleMouseEvent(View.java:555) ~[jfxrt.jar:?]
        at com.sun.glass.ui.View.notifyMouse(View.java:937) ~[jfxrt.jar:?]
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) ~[jfxrt.jar:?]
        at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) ~[jfxrt.jar:?]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_102]
java.lang.NullPointerException
        at de.qabel.desktop.ui.sync.item.SyncItemController.renderTransaction(SyncItemController.java:183)
        at de.qabel.desktop.ui.sync.item.SyncItemController.lambda$null$8(SyncItemController.java:226)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:352)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
        at de.qabel.desktop.ui.sync.item.SyncItemController.lambda$showHistory$9(SyncItemController.java:222)
        at de.qabel.desktop.ui.AbstractController.tryOrAlert(AbstractController.java:30)
        at de.qabel.desktop.ui.sync.item.SyncItemController.showHistory(SyncItemController.java:214)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
        at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
        at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
        at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
        at com.sun.glass.ui.View.notifyMouse(View.java:937)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139)
        at java.lang.Thread.run(Thread.java:745)
julianseeger commented 7 years ago

Currently, the failures are only visible in the sync history which shows all events since the client started: image

This screenshot also shows that it's not anly a gui issue ... what happened here is: 1.) test was deleted. but that failed because it was deleted before it could be uploaded => failed 2.) New Text Document.txt was created which produces 2 events: create New Text Document.txt (skipped because another event [UPDATE] for that file arrived within the grace period) update New Text Documen.txt (skipped because another event [DELETE] for that file arrived within the grace period) 3.) New Text Document.txt was renamed to sdf.txt, which results in 2 events: CREATE sdf.txt (finished) DELETE New Text Document.txt (failed because it was never uploaded)

So we got two failures here that aren't a problem and shouldn't disturb the user. Before we can show those failures to the user, we would have to convert these failures to be skipped events if the target state is achieved (both files should have been deleted = none of them should exist => true => no failure).

thechauffeur commented 7 years ago

What @julianseeger said. The errors / logs / whatever $content must make sense prior to showing it to the user and prior clearly and more prominent. We maybe need mockups after that.