Skip to content

Instantly share code, notes, and snippets.

@cespare
Last active August 29, 2015 13:56
Show Gist options
  • Save cespare/9623b31999bbc0e5266a to your computer and use it in GitHub Desktop.
Save cespare/9623b31999bbc0e5266a to your computer and use it in GitHub Desktop.
BoltDB crash issue
package main
import (
"fmt"
"log"
"math/rand"
"strconv"
"strings"
"github.com/boltdb/bolt"
)
const (
path = "/tmp/bolt-dbg.db"
bucketName = "testbucket"
numDocs = 1000
wordsPerDoc = 20
)
func main() {
// Open the database
db, err := bolt.Open(path, 0666)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Print the buckets
buckets, err := db.Buckets() // <-- crash occurs here
if err != nil {
log.Fatal(err)
}
for _, bucket := range buckets {
fmt.Println("Found bucket:", bucket.Name())
}
// Create the bucket
if err := db.CreateBucketIfNotExists(bucketName); err != nil {
log.Fatal(err)
}
// Insert a bunch of documents
for i := 0; i < numDocs; i++ {
doc := generateDoc()
id := []byte(strconv.Itoa(i))
if err := db.Put(bucketName, id, doc); err != nil {
log.Fatal(err)
}
}
fmt.Printf("Successfully wrote %d documents\n", numDocs)
}
// Boring fake message generation stuff ******************
var (
fakeWords []string
punctuationReplacer = strings.NewReplacer(
",", "",
".", "",
)
)
func init() {
for _, line := range strings.Split(loremIpsum, "\n") {
for _, f := range strings.Fields(line) {
word := strings.ToLower(f)
word = punctuationReplacer.Replace(word)
fakeWords = append(fakeWords, word)
}
}
}
func generateDoc() []byte {
var doc []string
for i := 0; i < wordsPerDoc; i++ {
doc = append(doc, fakeWords[rand.Intn(len(fakeWords))])
}
return []byte(strings.Join(doc, " "))
}
const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pellentesque leo sit amet lobortis sollicitudin. Ut risus lacus, tempor vitae mi id, placerat condimentum leo. Nunc condimentum mauris sapien, in euismod tellus tincidunt non. Aenean placerat facilisis justo, eu cursus nunc accumsan quis. Nulla facilisi. Fusce a dolor dui. Quisque a semper felis, et condimentum leo. Ut euismod bibendum elit id facilisis. Aenean neque nisl, congue ut fermentum non, porttitor in nulla. In hac habitasse platea dictumst. Aenean ligula nibh, pulvinar id mauris eu, rutrum porta tellus. Curabitur porta molestie vehicula. Mauris eu euismod nisi. Nam at pretium tortor. Morbi non lorem id urna gravida posuere. Phasellus eu nibh dignissim, vehicula mi imperdiet, tristique metus.
Suspendisse potenti. Suspendisse a nunc nisl. Quisque placerat turpis a aliquam euismod. Duis vel velit ut enim aliquam pulvinar in vitae justo. Donec luctus, lorem nec fringilla blandit, justo risus aliquam lacus, vel auctor lorem nisl vitae neque. Donec aliquet lacus id volutpat viverra. Nulla facilisi. In rhoncus luctus purus et semper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam diam lectus, iaculis a congue quis, tincidunt et sapien. Nam felis nisi, egestas eget accumsan nec, pretium at mauris. Suspendisse metus dolor, faucibus vel urna condimentum, rutrum gravida tellus. Donec gravida porttitor mauris. Aenean a nibh tincidunt, adipiscing neque a, fringilla felis. Nullam pharetra vestibulum sapien quis varius. Vestibulum malesuada magna posuere dolor facilisis convallis.
Etiam ac lorem est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut in fringilla tellus. Quisque lorem massa, egestas ac augue in, varius imperdiet nunc. Morbi ultricies dictum gravida. Phasellus at tristique nisi. Phasellus et tempus urna. Nunc non velit a erat congue feugiat dictum vel elit. Morbi a sapien quis metus tincidunt cursus sit amet at odio. Pellentesque condimentum nisi sed ullamcorper adipiscing. In risus tortor, faucibus et tincidunt et, sollicitudin sed sapien. Praesent non scelerisque libero. In hac habitasse platea dictumst. Suspendisse potenti. Nunc vestibulum vestibulum nunc. Vestibulum sit amet viverra augue.
Duis ac faucibus nibh, sit amet accumsan lacus. Aliquam id nisi augue. Nulla porta laoreet neque, id fringilla ligula convallis ut. Vestibulum id luctus elit, nec bibendum mauris. Curabitur eget dui non odio gravida pretium ac in sem. Nam in aliquam libero. Proin varius posuere semper. Aliquam elit lorem, ornare nec arcu sit amet, venenatis euismod dolor. Nunc aliquam neque diam, sed placerat nibh facilisis eget. Pellentesque risus lacus, lacinia sit amet nulla a, varius rhoncus odio. Cras turpis purus, laoreet non vulputate eu, rhoncus et risus. Morbi non lorem vel nisl auctor egestas. Nam consequat sollicitudin placerat.
Cras placerat felis ut eros tempor, egestas scelerisque nisl scelerisque. Donec lorem est, laoreet id pulvinar ut, adipiscing eget eros. Vivamus ullamcorper tincidunt ante, lobortis bibendum risus eleifend quis. Donec pretium neque massa, eget ornare nisi interdum eget. Mauris aliquet tortor sed luctus accumsan. Nullam porta rhoncus ultricies. Sed gravida ligula ut nisi volutpat placerat.
Phasellus at arcu luctus, feugiat diam nec, consectetur magna. Morbi cursus egestas enim sit amet elementum. Vivamus faucibus arcu a velit scelerisque tincidunt in at risus. Vivamus quam nunc, rutrum id purus quis, iaculis rutrum dui. Pellentesque ac eleifend ligula. Phasellus ut nibh eleifend, euismod mi a, vestibulum nisi. Vivamus sit amet neque nec nisi feugiat fermentum. Ut accumsan auctor diam, a ultricies arcu vestibulum nec. Nam fermentum sit amet dui ut faucibus. Quisque quam leo, pharetra non pulvinar non, commodo imperdiet sem. Integer eu nunc nec ligula hendrerit interdum ac sed turpis. Sed lacinia nibh ac orci faucibus convallis. Proin blandit, tellus vel aliquet pellentesque, dolor lectus posuere lacus, eu tristique elit magna at justo. Etiam porttitor quis mauris adipiscing pellentesque. Donec et libero vitae turpis porta lacinia a vel velit. Duis vitae nisl hendrerit, mollis nisl at, gravida diam.
Nam sit amet consequat risus. Ut sit amet leo sollicitudin, cursus libero vitae, sagittis odio. In hac habitasse platea dictumst. Maecenas massa mi, posuere non erat vitae, tempor fringilla nulla. Phasellus ultricies bibendum dolor ac dictum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque pretium tristique dui, id egestas elit imperdiet in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sollicitudin gravida sapien in venenatis. Sed tempor vulputate viverra.
Nulla rutrum sit amet dolor sit amet pulvinar. Pellentesque eleifend ultrices erat vel malesuada. Nullam sed mi eget nibh fermentum sollicitudin. Vestibulum at aliquam tellus. Aenean ultricies augue libero, a molestie nisl euismod id. Sed ultricies posuere odio, vel ornare nunc auctor at. Quisque feugiat libero in nulla ultrices aliquam. Curabitur imperdiet, eros eu viverra feugiat, lectus metus scelerisque orci, non posuere nisi velit non magna. Cras sed orci tincidunt, rhoncus orci id, porta dolor. Phasellus pharetra interdum justo ac mattis. Praesent bibendum a augue sit amet lacinia. Ut leo enim, porttitor et gravida ut, pellentesque quis urna.
Sed ut orci sit amet massa ullamcorper commodo. Suspendisse potenti. Donec sit amet ante ante. Pellentesque a tempor risus. Sed laoreet orci vitae egestas lobortis. Sed luctus rhoncus erat, at accumsan neque volutpat a. Aliquam id augue semper, faucibus lacus id, blandit velit. Duis tempus lorem massa, ac eleifend lacus facilisis lobortis. Sed a nisl risus. Aenean elementum tristique leo ut commodo. Phasellus quis augue tortor. Nunc a lacus vel orci viverra gravida. Donec faucibus euismod fringilla. Mauris ut sollicitudin ante. Suspendisse viverra adipiscing sapien, in auctor metus hendrerit ut. Vestibulum orci velit, pretium in sodales quis, placerat quis risus.
Suspendisse gravida, erat ac fermentum posuere, nisi massa scelerisque urna, id sodales mi purus ac lorem. Praesent condimentum velit non dolor tristique porttitor. Morbi sollicitudin congue nisi, at auctor nisi commodo elementum. Morbi eu orci eget quam feugiat rutrum. Cras in semper elit, sit amet tincidunt orci. Aenean ac nisi eu purus vulputate blandit id eu dui. Aliquam a diam gravida, auctor ante non, ullamcorper eros. Duis adipiscing arcu sit amet mi viverra congue. Praesent at massa in lacus iaculis faucibus. Donec quis faucibus lectus. Nulla ullamcorper malesuada diam, vitae blandit nisi eleifend at.`
$ rm -f /tmp/bolt-dbg.db
$ go run main.go
Successfully wrote 1000 documents
$ go run main.go
panic: runtime error: index out of range
goroutine 1 [running]:
runtime.panic(0x4c7e00, 0x5e8d97)
/home/caleb/apps/go/src/pkg/runtime/panic.c:266 +0xb6
github.com/boltdb/bolt.(*Transaction).page(0xc21001f330, 0x438, 0x0)
/home/caleb/projects/go/src/github.com/boltdb/bolt/transaction.go:95 +0xa6
github.com/boltdb/bolt.(*Transaction).init(0xc21001f330, 0xc2100482a0)
/home/caleb/projects/go/src/github.com/boltdb/bolt/transaction.go:32 +0xd3
github.com/boltdb/bolt.(*DB).Transaction(0xc2100482a0, 0x0, 0x0, 0x0)
/home/caleb/projects/go/src/github.com/boltdb/bolt/db.go:282 +0x15d
github.com/boltdb/bolt.(*DB).Buckets(0xc2100482a0, 0x0, 0x0, 0x0, 0x0, ...)
/home/caleb/projects/go/src/github.com/boltdb/bolt/db.go:400 +0x54
main.main()
/home/caleb/projects/augustine/bug_repro/main.go:29 +0x139
exit status 2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment