Skip to content

Commit 95acc50

Browse files
committed
Backport add test cases to simulate mlock failure.
Signed-off-by: James Blair <[email protected]>
1 parent 7a13798 commit 95acc50

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

tests/failpoint/db_failpoint_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package failpoint
22

33
import (
4+
"fmt"
45
"path/filepath"
56
"testing"
67
"time"
78

89
"github.com/stretchr/testify/require"
910

1011
bolt "go.etcd.io/bbolt"
12+
"go.etcd.io/bbolt/internal/btesting"
1113
gofail "go.etcd.io/gofail/runtime"
1214
)
1315

@@ -46,3 +48,49 @@ func TestFailpoint_UnmapFail_DbClose(t *testing.T) {
4648
err = db.Close()
4749
require.NoError(t, err)
4850
}
51+
52+
func TestFailpoint_mLockFail(t *testing.T) {
53+
err := gofail.Enable("mlockError", `return("mlock somehow failed")`)
54+
require.NoError(t, err)
55+
56+
f := filepath.Join(t.TempDir(), "db")
57+
_, err = bolt.Open(f, 0666, &bolt.Options{Mlock: true})
58+
require.Error(t, err)
59+
require.ErrorContains(t, err, "mlock somehow failed")
60+
61+
// It should work after disabling the failpoint.
62+
err = gofail.Disable("mlockError")
63+
require.NoError(t, err)
64+
65+
_, err = bolt.Open(f, 0666, &bolt.Options{Mlock: true})
66+
require.NoError(t, err)
67+
}
68+
69+
func TestFailpoint_mLockFail_When_remap(t *testing.T) {
70+
db := btesting.MustCreateDB(t)
71+
db.Mlock = true
72+
73+
err := gofail.Enable("mlockError", `return("mlock somehow failed in allocate")`)
74+
require.NoError(t, err)
75+
76+
err = db.Fill([]byte("data"), 1, 10000,
77+
func(tx int, k int) []byte { return []byte(fmt.Sprintf("%04d", k)) },
78+
func(tx int, k int) []byte { return make([]byte, 100) },
79+
)
80+
81+
require.Error(t, err)
82+
require.ErrorContains(t, err, "mlock somehow failed in allocate")
83+
84+
// It should work after disabling the failpoint.
85+
err = gofail.Disable("mlockError")
86+
require.NoError(t, err)
87+
db.MustClose()
88+
db.MustReopen()
89+
90+
err = db.Fill([]byte("data"), 1, 10000,
91+
func(tx int, k int) []byte { return []byte(fmt.Sprintf("%04d", k)) },
92+
func(tx int, k int) []byte { return make([]byte, 100) },
93+
)
94+
95+
require.NoError(t, err)
96+
}

0 commit comments

Comments
 (0)