syndtr / goleveldb

LevelDB key/value database in Go.
BSD 2-Clause "Simplified" License
6.13k stars 968 forks source link

SegFault and database corruption #301

Open jeremylowery opened 4 years ago

jeremylowery commented 4 years ago

I'm having some random database corruption problems. My long running server process will crash, and the program becomes unrunable until the leveldb directories are deleted from the file system. A sample fault:

goroutine 42 [running]:
github.com/syndtr/goleveldb/leveldb.(*DB).isClosed(...)
    /home/jeremy/.gvm/pkgsets/go1.11/global/pkg/mod/github.com/syndtr/goleveldb@v0.0.0-20181128100959-b001fa50d6b2/leveldb/db_state.go:230
github.com/syndtr/goleveldb/leveldb.(*DB).ok(...)
    /home/jeremy/.gvm/pkgsets/go1.11/global/pkg/mod/github.com/syndtr/goleveldb@v0.0.0-20181128100959-b001fa50d6b2/leveldb/db_state.go:235
github.com/syndtr/goleveldb/leveldb.(*DB).Get(0x0, 0xc0001f7c08, 0x1e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/jeremy/.gvm/pkgsets/go1.11/global/pkg/mod/github.com/syndtr/goleveldb@v0.0.0-20181128100959-b001fa50d6b2/leveldb/db.go:838 +0x56
main.inReplay(0xc0001c4000, 0x1e, 0xc0014aa166)
    /tmp/tmp.AOqNQB0ADe/src/feeder/go-feeder/replay.go:150 +0x8e
main.loadSingle(0xc0014aa160, 0x6, 0xc0014aa166, 0x151, 0x1)
    /tmp/tmp.AOqNQB0ADe/src/feeder/go-feeder/replay.go:222 +0x75
main.nextBatch(0x9c4160, 0xc0000b1740, 0xc0000ee320, 0x0)
    /tmp/tmp.AOqNQB0ADe/src/feeder/go-feeder/loader.go:142 +0x2b9
main.loader(0x9c4160, 0xc0000b1740, 0x8f36b8, 0x2, 0xc0000ee320, 0xc001478f90)
    /tmp/tmp.AOqNQB0ADe/src/feeder/go-feeder/loader.go:20 +0x2a7
created by main.main
    /tmp/tmp.AOqNQB0ADe/src/feeder/go-feeder/main.go:87 +0x6db
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x6cedf2]
kevburnsjr commented 4 years ago

SQLite often encounters database corruption when writing from a guest VM to a shared folder on the host (via NFS through vagrant or similar). I wonder if this is related.

jeremylowery commented 4 years ago

So the underlying platform here is a container running under LXC on ubuntu. The file systems are local block devices mounted under the container (ext4/drbd/lvm storage stack).