mirror of
https://github.com/mjl-/mox.git
synced 2025-03-31 09:19:59 +03:00
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:
parent
89a9a8bc97
commit
d74610c345
3 changed files with 15 additions and 11 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue