bugfix: missing account close in queue direct send

found while writing new tests for upcoming functionality.
the test had an embarrassing workaround for the symptoms...
This commit is contained in:
Mechiel Lukkien 2024-04-08 20:22:07 +02:00
parent 89a9a8bc97
commit d74610c345
No known key found for this signature in database
3 changed files with 15 additions and 11 deletions

View file

@ -728,6 +728,10 @@ func updateRecipientDomainTLS(ctx context.Context, log mlog.Log, senderAccount s
if err != nil {
return fmt.Errorf("open account: %w", err)
}
defer func() {
err := acc.Close()
log.Check(err, "closing account")
}()
err = acc.DB.Write(ctx, func(tx *bstore.Tx) error {
// First delete any existing record.
if err := tx.Delete(&store.RecipientDomainTLS{Domain: rdt.Domain}); err != nil && err != bstore.ErrAbsent {

View file

@ -49,20 +49,10 @@ func tcompare(t *testing.T, got, exp any) {
}
}
var keepAccount bool
func setup(t *testing.T) (*store.Account, func()) {
// Prepare config so email can be delivered to mjl@mox.example.
// Don't trigger the account consistency checks. Only remove account files on first
// (of randomized) runs.
if !keepAccount {
os.RemoveAll("../testdata/queue/data")
keepAccount = true
} else {
os.RemoveAll("../testdata/queue/data/queue")
}
os.RemoveAll("../testdata/queue/data")
log := mlog.New("queue", nil)
mox.Context = ctxbg
mox.ConfigStaticPath = filepath.FromSlash("../testdata/queue/mox.conf")
@ -75,6 +65,7 @@ func setup(t *testing.T) (*store.Account, func()) {
mox.Shutdown, mox.ShutdownCancel = context.WithCancel(ctxbg)
return acc, func() {
acc.Close()
acc.CheckClosed()
mox.ShutdownCancel()
mox.Shutdown, mox.ShutdownCancel = context.WithCancel(ctxbg)
Shutdown()

View file

@ -1059,6 +1059,15 @@ func initAccount(db *bstore.DB) error {
})
}
// CheckClosed asserts that the account has a zero reference count. For use in tests.
func (a *Account) CheckClosed() {
openAccounts.Lock()
defer openAccounts.Unlock()
if a.nused != 0 {
panic(fmt.Sprintf("account still in use, %d refs", a.nused))
}
}
// Close reduces the reference count, and closes the database connection when
// it was the last user.
func (a *Account) Close() error {