aboutsummaryrefslogtreecommitdiffstats
path: root/worker
diff options
context:
space:
mode:
authorJason Cox <me@jasoncarloscox.com>2024-08-07 16:55:22 -0400
committerRobin Jarry <robin@jarry.cc>2024-08-20 09:29:22 +0200
commitb03750473db672578256cd95b07ba1732e18b06f (patch)
treee0b01d2ff37d6eec80e58d1eb909f4c4d72017fc /worker
parentfff69046b02f3d9ea0218ff071ba5e4d5b3a3c12 (diff)
downloadaerc-b03750473db672578256cd95b07ba1732e18b06f.tar.gz
notmuch: reload all changed messages on DB change
This reverts commit c56649fe5291b725f14b45550a68cc7d0dc16ff7. As discussed in the aerc-devel thread for the reverted patch, the performance improvement comes with an issue: changes to message tags are no longer immediately reflected in the UI. This issue occurs whether the tags are modified from within aerc or externally with the notmuch CLI. The message list also flickers any time tag changes are made. Further, commit c36ed72e4a59 ("notmuch: speed up lastmod query") dramatically reduces the number of messages which are re-indexed when the database changes, likely eliminating the need for the reverted performance improvement anyway. Fixes: c56649fe5291 ("notmuch: don't reload all message on change") Link: https://lists.sr.ht/~rjarry/aerc-devel/patches/53729 Link: https://lists.sr.ht/~rjarry/aerc-devel/patches/54028 Reported-by: Robin Dapp <rdapp@modk.org> Reported-by: Ryan Winograd <ryan@thewinograds.com> Signed-off-by: Jason Cox <me@jasoncarloscox.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'worker')
-rw-r--r--worker/notmuch/eventhandlers.go15
-rw-r--r--worker/notmuch/worker.go49
2 files changed, 41 insertions, 23 deletions
diff --git a/worker/notmuch/eventhandlers.go b/worker/notmuch/eventhandlers.go
index e4c2536e..fb454e08 100644
--- a/worker/notmuch/eventhandlers.go
+++ b/worker/notmuch/eventhandlers.go
@@ -9,6 +9,7 @@ import (
"path/filepath"
"strconv"
+ "git.sr.ht/~rjarry/aerc/lib/log"
"git.sr.ht/~rjarry/aerc/worker/types"
)
@@ -75,9 +76,17 @@ func (w *worker) updateChangedMessages() error {
if err != nil {
return fmt.Errorf("Couldn't get updates messages: %w", err)
}
- w.w.PostMessage(&types.DirectoryContents{
- Uids: uids,
- }, nil)
+ for _, uid := range uids {
+ m, err := w.msgFromUid(uid)
+ if err != nil {
+ log.Errorf("%s", err)
+ continue
+ }
+ err = w.emitMessageInfo(m, nil)
+ if err != nil {
+ log.Errorf("%s", err)
+ }
+ }
w.state = newState
return nil
}
diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go
index 249347ce..c6a81050 100644
--- a/worker/notmuch/worker.go
+++ b/worker/notmuch/worker.go
@@ -433,30 +433,12 @@ func (w *worker) handleFetchMessageHeaders(
w.emitMessageInfoError(msg, uid, err)
continue
}
- info, err := m.MessageInfo()
+ err = w.emitMessageInfo(m, msg)
if err != nil {
+ w.w.Errorf("could not emit message info: %v", err)
w.emitMessageInfoError(msg, uid, err)
continue
}
- switch {
- case len(w.headersExclude) > 0:
- info.RFC822Headers = lib.LimitHeaders(info.RFC822Headers, w.headersExclude, true)
- case len(w.headers) > 0:
- info.RFC822Headers = lib.LimitHeaders(info.RFC822Headers, w.headers, false)
- }
-
- switch msg {
- case nil:
- w.w.PostMessage(&types.MessageInfo{
- Info: info,
- }, nil)
- default:
- w.w.PostMessage(&types.MessageInfo{
- Message: types.RespondTo(msg),
- Info: info,
- }, nil)
- }
-
}
w.done(msg)
return nil
@@ -698,6 +680,33 @@ func (w *worker) emitMessageInfoError(msg types.WorkerMessage, uid uint32, err e
}, nil)
}
+func (w *worker) emitMessageInfo(m *Message,
+ parent types.WorkerMessage,
+) error {
+ info, err := m.MessageInfo()
+ if err != nil {
+ return fmt.Errorf("could not get MessageInfo: %w", err)
+ }
+ switch {
+ case len(w.headersExclude) > 0:
+ info.RFC822Headers = lib.LimitHeaders(info.RFC822Headers, w.headersExclude, true)
+ case len(w.headers) > 0:
+ info.RFC822Headers = lib.LimitHeaders(info.RFC822Headers, w.headers, false)
+ }
+ switch parent {
+ case nil:
+ w.w.PostMessage(&types.MessageInfo{
+ Info: info,
+ }, nil)
+ default:
+ w.w.PostMessage(&types.MessageInfo{
+ Message: types.RespondTo(parent),
+ Info: info,
+ }, nil)
+ }
+ return nil
+}
+
func (w *worker) emitLabelList() {
tags := w.db.ListTags()
w.w.PostMessage(&types.LabelList{Labels: tags}, nil)