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 { if err != nil {
return fmt.Errorf("open account: %w", err) 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 { err = acc.DB.Write(ctx, func(tx *bstore.Tx) error {
// First delete any existing record. // First delete any existing record.
if err := tx.Delete(&store.RecipientDomainTLS{Domain: rdt.Domain}); err != nil && err != bstore.ErrAbsent { 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()) { func setup(t *testing.T) (*store.Account, func()) {
// Prepare config so email can be delivered to mjl@mox.example. // 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") os.RemoveAll("../testdata/queue/data")
keepAccount = true
} else {
os.RemoveAll("../testdata/queue/data/queue")
}
log := mlog.New("queue", nil) log := mlog.New("queue", nil)
mox.Context = ctxbg mox.Context = ctxbg
mox.ConfigStaticPath = filepath.FromSlash("../testdata/queue/mox.conf") 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) mox.Shutdown, mox.ShutdownCancel = context.WithCancel(ctxbg)
return acc, func() { return acc, func() {
acc.Close() acc.Close()
acc.CheckClosed()
mox.ShutdownCancel() mox.ShutdownCancel()
mox.Shutdown, mox.ShutdownCancel = context.WithCancel(ctxbg) mox.Shutdown, mox.ShutdownCancel = context.WithCancel(ctxbg)
Shutdown() 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 // Close reduces the reference count, and closes the database connection when
// it was the last user. // it was the last user.
func (a *Account) Close() error { func (a *Account) Close() error {