diff options
author | Koni Marti <koni.marti@gmail.com> | 2024-01-20 11:31:03 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-01-25 21:55:17 +0100 |
commit | 1980744f7bf9e147abf649d37a2fa7dddd4e7254 (patch) | |
tree | dba9967e81d4c65c287dd5c9c1e26c5f269891b7 /worker/middleware | |
parent | 3452c9233f623c4049098b66911ae82fc14e119c (diff) | |
download | aerc-1980744f7bf9e147abf649d37a2fa7dddd4e7254.tar.gz |
idler: improve the imap idler
Rewrite the imap idler to make it more fault tolerant and prevent hangs
(and possibly short writes).
Fixes: https://todo.sr.ht/~rjarry/aerc/208
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Tested-by: Karel Balej <balejk@matfyz.cz>
Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'worker/middleware')
-rw-r--r-- | worker/middleware/gmailworker.go | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/worker/middleware/gmailworker.go b/worker/middleware/gmailworker.go index 807f7bff..f9924732 100644 --- a/worker/middleware/gmailworker.go +++ b/worker/middleware/gmailworker.go @@ -8,20 +8,14 @@ import ( "github.com/emersion/go-imap/client" ) -type idler interface { - Start() - Stop() error -} - type gmailWorker struct { types.WorkerInteractor mu sync.Mutex client *client.Client - idler idler } // NewGmailWorker returns an IMAP middleware for the X-GM-EXT-1 extension -func NewGmailWorker(base types.WorkerInteractor, c *client.Client, i idler, +func NewGmailWorker(base types.WorkerInteractor, c *client.Client, ) types.WorkerInteractor { base.Infof("loading worker middleware: X-GM-EXT-1") @@ -29,37 +23,30 @@ func NewGmailWorker(base types.WorkerInteractor, c *client.Client, i idler, for iter := base; iter != nil; iter = iter.Unwrap() { if g, ok := iter.(*gmailWorker); ok { base.Infof("already loaded; resetting") - err := g.reset(c, i) + err := g.reset(c) if err != nil { base.Errorf("reset failed: %v", err) } return base } } - return &gmailWorker{WorkerInteractor: base, client: c, idler: i} + return &gmailWorker{WorkerInteractor: base, client: c} } func (g *gmailWorker) Unwrap() types.WorkerInteractor { return g.WorkerInteractor } -func (g *gmailWorker) reset(c *client.Client, i idler) error { +func (g *gmailWorker) reset(c *client.Client) error { g.mu.Lock() defer g.mu.Unlock() g.client = c - g.idler = i return nil } func (g *gmailWorker) ProcessAction(msg types.WorkerMessage) types.WorkerMessage { - switch msg := msg.(type) { - case *types.FetchMessageHeaders: + if msg, ok := msg.(*types.FetchMessageHeaders); ok && len(msg.Uids) > 0 { g.mu.Lock() - err := g.idler.Stop() - if err != nil { - g.Errorf("idler reported an error: %v", err) - break - } handler := xgmext.NewHandler(g.client) uids, err := handler.FetchEntireThreads(msg.Uids) @@ -71,7 +58,6 @@ func (g *gmailWorker) ProcessAction(msg types.WorkerMessage) types.WorkerMessage msg.Uids = uids } - g.idler.Start() g.mu.Unlock() } return g.WorkerInteractor.ProcessAction(msg) |