From 5dd0f454c197ccbce369ee88d47d5be8cd5e8265 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Mon, 24 Feb 2020 20:18:31 +0100 Subject: [PATCH] lib/msgstore: debounce directoryUpdateRequests Apparently sending an event for every incoming messageInfo slows down the application significantly. Therefore this slows down the emmision rate, on the cost of being out of date in some cases. --- lib/msgstore.go | 20 +++++++++++++++++--- worker/imap/worker.go | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/msgstore.go b/lib/msgstore.go index ae58aaf..b1785c1 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -42,6 +42,9 @@ type MessageStore struct { triggerNewEmail func(*models.MessageInfo) triggerDirectoryChange func() + + dirInfoUpdateDebounce *time.Timer + dirInfoUpdateDelay time.Duration } func NewMessageStore(worker *types.Worker, @@ -50,6 +53,8 @@ func NewMessageStore(worker *types.Worker, triggerNewEmail func(*models.MessageInfo), triggerDirectoryChange func()) *MessageStore { + dirInfoUpdateDelay := 5 * time.Second + return &MessageStore{ Deleted: make(map[uint32]interface{}), DirInfo: *dirInfo, @@ -68,6 +73,9 @@ func NewMessageStore(worker *types.Worker, triggerNewEmail: triggerNewEmail, triggerDirectoryChange: triggerDirectoryChange, + + dirInfoUpdateDelay: dirInfoUpdateDelay, + dirInfoUpdateDebounce: time.NewTimer(dirInfoUpdateDelay), } } @@ -267,9 +275,15 @@ func (store *MessageStore) Update(msg types.WorkerMessage) { } if requestDirInfo { - store.worker.PostAction(&types.DirectoryInfoUpdateRequest{ - Name: store.DirInfo.Name, - }, nil) + select { + case <-store.dirInfoUpdateDebounce.C: + store.worker.PostAction(&types.DirectoryInfoUpdateRequest{ + Name: store.DirInfo.Name, + }, nil) + store.dirInfoUpdateDebounce.Reset(store.dirInfoUpdateDelay) + default: + // do nothing + } } } diff --git a/worker/imap/worker.go b/worker/imap/worker.go index ddd95b6..1037f81 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -181,6 +181,8 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { w.handleAppendMessage(msg) case *types.SearchDirectory: w.handleSearchDirectory(msg) + case *types.DirectoryInfoUpdateRequest: + // not implemented default: reterr = errUnsupported }