From 139795aef25b88df98f54c938580beece23e21f5 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 3 May 2019 19:32:34 +0200 Subject: ui: fix thundering herd problem in importing/deleting Signed-off-by: Jason A. Donenfeld --- ui/tunnelspage.go | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'ui/tunnelspage.go') diff --git a/ui/tunnelspage.go b/ui/tunnelspage.go index 8207099f..18e9e255 100644 --- a/ui/tunnelspage.go +++ b/ui/tunnelspage.go @@ -261,6 +261,7 @@ func (tp *TunnelsPage) importFiles(paths []string) { } configCount := 0 + tp.listView.SetSuspendTunnelsUpdate(true) for _, unparsedConfig := range unparsedConfigs { if existingLowerTunnels[strings.ToLower(unparsedConfig.Name)] { lastErr = fmt.Errorf("Another tunnel already exists with the name ā€˜%sā€™", unparsedConfig.Name) @@ -278,7 +279,7 @@ func (tp *TunnelsPage) importFiles(paths []string) { } configCount++ } - tp.listView.Load(true) + tp.listView.SetSuspendTunnelsUpdate(false) m, n := configCount, len(unparsedConfigs) switch { @@ -326,13 +327,6 @@ func (tp *TunnelsPage) addTunnel(config *conf.Config) { } -func (tp *TunnelsPage) deleteTunnel(tunnel *service.Tunnel) { - err := tunnel.Delete() - if err != nil { - walk.MsgBox(tp.Form(), "Unable to delete tunnel", err.Error(), walk.MsgBoxIconError) - } -} - // Handlers func (tp *TunnelsPage) onTunnelsViewItemActivated() { @@ -417,13 +411,35 @@ func (tp *TunnelsPage) onDelete() { } selectTunnelAfter = tp.listView.model.tunnels[max].Name } - - for _, i := range indices { - tp.deleteTunnel(&tp.listView.model.tunnels[i]) - } if len(selectTunnelAfter) > 0 { tp.listView.selectTunnel(selectTunnelAfter) } + + tunnelsToDelete := make([]service.Tunnel, len(indices)) + for i, j := range indices { + tunnelsToDelete[i] = tp.listView.model.tunnels[j] + + } + go func() { + tp.listView.SetSuspendTunnelsUpdate(true) + var errors []error + for _, tunnel := range tunnelsToDelete { + err := tunnel.Delete() + if err != nil && (len(errors) == 0 || errors[len(errors)-1].Error() != err.Error()) { + errors = append(errors, err) + } + } + tp.listView.SetSuspendTunnelsUpdate(false) + if len(errors) > 0 { + tp.listView.Synchronize(func() { + if len(errors) == 1 { + walk.MsgBox(tp.Form(), "Unable to delete tunnel", fmt.Sprintf("A tunnel was unable to be removed: %s", errors[0].Error()), walk.MsgBoxIconError) + } else { + walk.MsgBox(tp.Form(), "Unable to delete tunnels", fmt.Sprintf("%d tunnels were unable to be removed.", len(errors)), walk.MsgBoxIconError) + } + }) + } + }() } func (tp *TunnelsPage) onImport() { -- cgit v1.2.3-59-g8ed1b