-
Notifications
You must be signed in to change notification settings - Fork 643
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #381 from ahrtr/loadfreepage_20230111
add PreLoadFreelist to support loading free pages in readonly mode
- Loading branch information
Showing
6 changed files
with
189 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
package bbolt | ||
|
||
import ( | ||
"path/filepath" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestOpenWithPreLoadFreelist(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
readonly bool | ||
preLoadFreePage bool | ||
expectedFreePagesLoaded bool | ||
}{ | ||
{ | ||
name: "write mode always load free pages", | ||
readonly: false, | ||
preLoadFreePage: false, | ||
expectedFreePagesLoaded: true, | ||
}, | ||
{ | ||
name: "readonly mode load free pages when flag set", | ||
readonly: true, | ||
preLoadFreePage: true, | ||
expectedFreePagesLoaded: true, | ||
}, | ||
{ | ||
name: "readonly mode doesn't load free pages when flag not set", | ||
readonly: true, | ||
preLoadFreePage: false, | ||
expectedFreePagesLoaded: false, | ||
}, | ||
} | ||
|
||
fileName, err := prepareData(t) | ||
require.NoError(t, err) | ||
|
||
for _, tc := range testCases { | ||
t.Run(tc.name, func(t *testing.T) { | ||
db, err := Open(fileName, 0666, &Options{ | ||
ReadOnly: tc.readonly, | ||
PreLoadFreelist: tc.preLoadFreePage, | ||
}) | ||
require.NoError(t, err) | ||
|
||
assert.Equal(t, tc.expectedFreePagesLoaded, db.freelist != nil) | ||
|
||
assert.NoError(t, db.Close()) | ||
}) | ||
} | ||
} | ||
|
||
func TestMethodPage(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
readonly bool | ||
preLoadFreePage bool | ||
expectedError error | ||
}{ | ||
{ | ||
name: "write mode", | ||
readonly: false, | ||
preLoadFreePage: false, | ||
expectedError: nil, | ||
}, | ||
{ | ||
name: "readonly mode with preloading free pages", | ||
readonly: true, | ||
preLoadFreePage: true, | ||
expectedError: nil, | ||
}, | ||
{ | ||
name: "readonly mode without preloading free pages", | ||
readonly: true, | ||
preLoadFreePage: false, | ||
expectedError: ErrFreePagesNotLoaded, | ||
}, | ||
} | ||
|
||
fileName, err := prepareData(t) | ||
require.NoError(t, err) | ||
|
||
for _, tc := range testCases { | ||
tc := tc | ||
t.Run(tc.name, func(t *testing.T) { | ||
db, err := Open(fileName, 0666, &Options{ | ||
ReadOnly: tc.readonly, | ||
PreLoadFreelist: tc.preLoadFreePage, | ||
}) | ||
require.NoError(t, err) | ||
defer db.Close() | ||
|
||
tx, err := db.Begin(!tc.readonly) | ||
require.NoError(t, err) | ||
|
||
_, err = tx.Page(0) | ||
require.Equal(t, tc.expectedError, err) | ||
|
||
if tc.readonly { | ||
require.NoError(t, tx.Rollback()) | ||
} else { | ||
require.NoError(t, tx.Commit()) | ||
} | ||
|
||
require.NoError(t, db.Close()) | ||
}) | ||
} | ||
} | ||
|
||
func prepareData(t *testing.T) (string, error) { | ||
fileName := filepath.Join(t.TempDir(), "db") | ||
db, err := Open(fileName, 0666, nil) | ||
if err != nil { | ||
return "", err | ||
} | ||
if err := db.Close(); err != nil { | ||
return "", err | ||
} | ||
|
||
return fileName, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters