From ea64936a673d187a43608620f6b3353d166ab8c7 Mon Sep 17 00:00:00 2001 From: Mechiel Lukkien Date: Sat, 1 Mar 2025 11:07:05 +0100 Subject: [PATCH] Cleanup message file when DeliverMailbox fails. Part of larger changes. --- store/account.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/store/account.go b/store/account.go index 22286b8..5f08add 100644 --- a/store/account.go +++ b/store/account.go @@ -2264,8 +2264,18 @@ func (a *Account) DeliverDestination(log mlog.Log, dest config.Destination, m *M // Caller must hold account wlock (mailbox may be created). // Message delivery, possible mailbox creation, and updated mailbox counts are // broadcasted. -func (a *Account) DeliverMailbox(log mlog.Log, mailbox string, m *Message, msgFile *os.File) error { +func (a *Account) DeliverMailbox(log mlog.Log, mailbox string, m *Message, msgFile *os.File) (rerr error) { var changes []Change + + var commit bool + defer func() { + if !commit && m.ID != 0 { + p := a.MessagePath(m.ID) + err := os.Remove(p) + log.Check(err, "remove delivered message file", slog.String("path", p)) + } + }() + err := a.DB.Write(context.TODO(), func(tx *bstore.Tx) error { if ok, _, err := a.CanAddMessageSize(tx, m.Size); err != nil { return err @@ -2300,11 +2310,10 @@ func (a *Account) DeliverMailbox(log mlog.Log, mailbox string, m *Message, msgFi changes = append(changes, m.ChangeAddUID(), mb.ChangeCounts()) return nil }) - // todo: if rename succeeded but transaction failed, we should remove the file. if err != nil { return err } - + commit = true BroadcastChanges(a, changes) return nil }