aboutsummaryrefslogtreecommitdiff
path: root/db_test.go
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2014-07-23 15:08:59 -0600
committerBen Johnson <benbjohnson@yahoo.com>2014-07-23 15:08:59 -0600
commitaa66291b9b1e91773afc9c7d2081e570de742521 (patch)
treed9a6eb8f34baf289c8cb931620bb4e8d32b704a0 /db_test.go
parentFix double spill. (diff)
downloaddedo-aa66291b9b1e91773afc9c7d2081e570de742521.tar.gz
dedo-aa66291b9b1e91773afc9c7d2081e570de742521.tar.xz
Fix root split on very large append.
This commit fixes a bug where a root split on a very large insert would cause an overflow of the root node. The problem was that the new root was not split when it was created so a new root with more than 64K child nodes would overflow the page.count (uint16).
Diffstat (limited to 'db_test.go')
-rw-r--r--db_test.go37
1 files changed, 29 insertions, 8 deletions
diff --git a/db_test.go b/db_test.go
index 0809bcb..2063249 100644
--- a/db_test.go
+++ b/db_test.go
@@ -608,15 +608,36 @@ func withOpenDB(fn func(*DB, string)) {
// mustCheck runs a consistency check on the database and panics if any errors are found.
func mustCheck(db *DB) {
- err := db.View(func(tx *Tx) error {
- return <-tx.Check()
+ db.View(func(tx *Tx) error {
+ // Collect all the errors.
+ var errors []error
+ for err := range tx.Check() {
+ errors = append(errors, err)
+ if len(errors) > 10 {
+ break
+ }
+ }
+
+ // If errors occurred, copy the DB and print the errors.
+ if len(errors) > 0 {
+ var path = tempfile()
+ tx.CopyFile(path, 0600)
+
+ // Print errors.
+ fmt.Print("\n\n")
+ fmt.Printf("consistency check failed (%d errors)\n", len(errors))
+ for _, err := range errors {
+ fmt.Println(err)
+ }
+ fmt.Println("")
+ fmt.Println("db saved to:")
+ fmt.Println(path)
+ fmt.Print("\n\n")
+ os.Exit(-1)
+ }
+
+ return nil
})
- if err != nil {
- // Copy db off first.
- var path = tempfile()
- db.View(func(tx *Tx) error { return tx.CopyFile(path, 0600) })
- panic("check failure: " + err.Error() + ": " + path)
- }
}
// mustContainKeys checks that a bucket contains a given set of keys.