mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-23 06:35:07 +01:00
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package batch
|
|
|
|
import (
|
|
"errors"
|
|
"path/filepath"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/btcsuite/btcwallet/walletdb"
|
|
"github.com/lightningnetwork/lnd/kvdb"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRetry(t *testing.T) {
|
|
dbDir := t.TempDir()
|
|
|
|
dbName := filepath.Join(dbDir, "weks.db")
|
|
db, err := walletdb.Create(
|
|
"bdb", dbName, true, kvdb.DefaultDBTimeout,
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("unable to create walletdb: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
db.Close()
|
|
})
|
|
|
|
var (
|
|
mu sync.Mutex
|
|
called int
|
|
)
|
|
sched := NewTimeScheduler(db, &mu, time.Second)
|
|
|
|
// First, we construct a request that should retry individually and
|
|
// execute it non-lazily. It should still return the error the second
|
|
// time.
|
|
req := &Request{
|
|
Update: func(tx kvdb.RwTx) error {
|
|
called++
|
|
|
|
return errors.New("test")
|
|
},
|
|
}
|
|
err = sched.Execute(req)
|
|
|
|
// Check and reset the called counter.
|
|
mu.Lock()
|
|
require.Equal(t, 2, called)
|
|
called = 0
|
|
mu.Unlock()
|
|
|
|
require.ErrorContains(t, err, "test")
|
|
|
|
// Now, we construct a request that should NOT retry because it returns
|
|
// a serialization error, which should cause the underlying postgres
|
|
// transaction to retry. Since we aren't using postgres, this will
|
|
// cause the transaction to not be retried at all.
|
|
req = &Request{
|
|
Update: func(tx kvdb.RwTx) error {
|
|
called++
|
|
|
|
return errors.New("could not serialize access")
|
|
},
|
|
}
|
|
err = sched.Execute(req)
|
|
|
|
// Check the called counter.
|
|
mu.Lock()
|
|
require.Equal(t, 1, called)
|
|
mu.Unlock()
|
|
|
|
require.ErrorContains(t, err, "could not serialize access")
|
|
}
|