yowcow / goromdb

Yet another single process KVS server implemented over file-based database
The Unlicense
12 stars 5 forks source link

bdb: double free or corruption #57

Closed yowcow closed 6 years ago

yowcow commented 6 years ago
2017/12/06 08:56:34 radixhandler.go:47: radixhandler got a new file to load at './tmp/data.db'
2017/12/06 08:56:34 radixhandler.go:54: radixhandler loading data from 'tmp/data01/data.db'
*** Error in `./goromdb': double free or corruption (out): 0x00007f86dc005ed0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f86eaa817e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f86eaa8a37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f86eaa8e53c]
/usr/lib/x86_64-linux-gnu/libdb-5.3.so(+0x2b28a)[0x7f86eb01c28a]
/usr/lib/x86_64-linux-gnu/libdb-5.3.so(__dbc_destroy+0x8f)[0x7f86eb0d3f8f]
/usr/lib/x86_64-linux-gnu/libdb-5.3.so(__db_refresh+0x2c5)[0x7f86eb0ceb25]
/usr/lib/x86_64-linux-gnu/libdb-5.3.so(__db_close+0x36)[0x7f86eb0cf516]
/usr/lib/x86_64-linux-gnu/libdb-5.3.so(__db_close_pp+0x10f)[0x7f86eb0e120f]
./goromdb(_cgo_cfdcba16413c_Cfunc_db_close+0x1e)[0x524fce]
./goromdb[0x456fd0]
======= Memory map: ========
00400000-00638000 r-xp 00000000 fc:00 3933859                            /home/vagrant/go/src/github.com/yowcow/goromdb/goromdb
00838000-00839000 r--p 00238000 fc:00 3933859                            /home/vagrant/go/src/github.com/yowcow/goromdb/goromdb
00839000-00851000 rw-p 00239000 fc:00 3933859                            /home/vagrant/go/src/github.com/yowcow/goromdb/goromdb
00851000-00873000 rw-p 00000000 00:00 0
01aee000-01b0f000 rw-p 00000000 00:00 0                                  [heap]
c000000000-c000082000 rw-p 00000000 00:00 0
c41efc0000-c440800000 rw-p 00000000 00:00 0
7f86d0000000-7f86d0046000 rw-p 00000000 00:00 0
7f86d0046000-7f86d4000000 ---p 00000000 00:00 0
7f86d4000000-7f86d404a000 rw-p 00000000 00:00 0
7f86d404a000-7f86d8000000 ---p 00000000 00:00 0
7f86dae98000-7f86daeae000 r-xp 00000000 fc:00 1049111                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f86daeae000-7f86db0ad000 ---p 00016000 fc:00 1049111                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f86db0ad000-7f86db0ae000 rw-p 00015000 fc:00 1049111                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f86db0ae000-7f86db1be000 rw-p 00000000 00:00 0
7f86db1be000-7f86db1bf000 ---p 00000000 00:00 0
7f86db1bf000-7f86dbf06000 rw-p 00000000 00:00 0
7f86dbf10000-7f86dc000000 rw-p 00000000 00:00 0
7f86dc000000-7f86dc049000 rw-p 00000000 00:00 0
7f86dc049000-7f86e0000000 ---p 00000000 00:00 0
7f86e0000000-7f86e0021000 rw-p 00000000 00:00 0
7f86e0021000-7f86e4000000 ---p 00000000 00:00 0
7f86e4000000-7f86e4021000 rw-p 00000000 00:00 0
7f86e4021000-7f86e8000000 ---p 00000000 00:00 0
7f86e8003000-7f86e82b3000 rw-p 00000000 00:00 0
7f86e82b4000-7f86e8494000 rw-p 00000000 00:00 0
7f86e8494000-7f86e8495000 ---p 00000000 00:00 0
7f86e8495000-7f86e8d55000 rw-p 00000000 00:00 0
7f86e8d5b000-7f86e8edb000 rw-p 00000000 00:00 0
7f86e8edf000-7f86e8fff000 rw-p 00000000 00:00 0
7f86e8edf000-7f86e8fff000 rw-p 00000000 00:00 0
7f86e9007000-7f86e9207000 rw-p 00000000 00:00 0
7f86e9207000-7f86e9208000 ---p 00000000 00:00 0
7f86e9208000-7f86e9a08000 rw-p 00000000 00:00 0
7f86e9a08000-7f86e9a09000 ---p 00000000 00:00 0
7f86e9a09000-7f86ea209000 rw-p 00000000 00:00 0
7f86ea209000-7f86ea20a000 ---p 00000000 00:00 0
7f86ea20a000-7f86eaa0a000 rw-p 00000000 00:00 0
7f86eaa0a000-7f86eabca000 r-xp 00000000 fc:00 1066554                    /lib/x86_64-linux-gnu/libc-2.23.so
7f86eabca000-7f86eadca000 ---p 001c0000 fc:00 1066554                    /lib/x86_64-linux-gnu/libc-2.23.so
7f86eadca000-7f86eadce000 r--p 001c0000 fc:00 1066554                    /lib/x86_64-linux-gnu/libc-2.23.so
7f86eadce000-7f86eadd0000 rw-p 001c4000 fc:00 1066554                    /lib/x86_64-linux-gnu/libc-2.23.so
7f86eadd0000-7f86eadd4000 rw-p 00000000 00:00 0
7f86eadd4000-7f86eadec000 r-xp 00000000 fc:00 1066537                    /lib/x86_64-linux-gnu/libpthread-2.23.so
7f86eadec000-7f86eafeb000 ---p 00018000 fc:00 1066537                    /lib/x86_64-linux-gnu/libpthread-2.23.so
7f86eafeb000-7f86eafec000 r--p 00017000 fc:00 1066537                    /lib/x86_64-linux-gnu/libpthread-2.23.so
7f86eafec000-7f86eafed000 rw-p 00018000 fc:00 1066537                    /lib/x86_64-linux-gnu/libpthread-2.23.so
7f86eafed000-7f86eaff1000 rw-p 00000000 00:00 0
7f86eaff1000-7f86eb197000 r-xp 00000000 fc:00 2238356                    /usr/lib/x86_64-linux-gnu/libdb-5.3.so
7f86eb197000-7f86eb396000 ---p 001a6000 fc:00 2238356                    /usr/lib/x86_64-linux-gnu/libdb-5.3.so
7f86eb396000-7f86eb39d000 r--p 001a5000 fc:00 2238356                    /usr/lib/x86_64-linux-gnu/libdb-5.3.so
7f86eb39d000-7f86eb39e000 rw-p 001ac000 fc:00 2238356                    /usr/lib/x86_64-linux-gnu/libdb-5.3.so
7f86eb39e000-7f86eb3c4000 r-xp 00000000 fc:00 1066532                    /lib/x86_64-linux-gnu/ld-2.23.so
7f86eb3c5000-7f86eb5b9000 rw-p 00000000 00:00 0
7f86eb5c0000-7f86eb5c3000 rw-p 00000000 00:00 0
7f86eb5c3000-7f86eb5c4000 r--p 00025000 fc:00 1066532                    /lib/x86_64-linux-gnu/ld-2.23.so
7f86eb5c4000-7f86eb5c5000 rw-p 00026000 fc:00 1066532                    /lib/x86_64-linux-gnu/ld-2.23.so
7f86eb5c5000-7f86eb5c6000 rw-p 00000000 00:00 0
7fff1f28f000-7fff1f2b0000 rw-p 00000000 00:00 0                          [stack]
7fff1f3f7000-7fff1f3f9000 r--p 00000000 00:00 0                          [vvar]
7fff1f3f9000-7fff1f3fb000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
SIGABRT: abort
PC=0x7f86eaa3f428 m=6 sigcode=18446744073709551610
signal arrived during cgo execution

goroutine 6 [syscall, locked to thread]:
runtime.cgocall(0x524fb0, 0xc420039ca0, 0x58881f)
        /usr/local/go-1.9.2/src/runtime/cgocall.go:132 +0xe4 fp=0xc420039c60 sp=0xc420039c20 pc=0x4035c4
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb._Cfunc_db_close(0x7f86d40016e0, 0x7f8600000000, 0x0)
        github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/_obj/_cgo_gotypes.go:984 +0x4d fp=0xc420039ca0 sp=0xc420039c60 pc=0x5011ad
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.BerkeleyDB.Close.func1(0x7f86d40016e0, 0x0, 0xc420039d10)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:176 +0x68 fp=0xc420039cd8 sp=0xc420039ca0 pc=0x502d18
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.BerkeleyDB.Close(0x7f86d40016e0, 0x0, 0xc420014160, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:176 +0x40 fp=0xc420039d10 sp=0xc420039cd8 pc=0x501f50
github.com/yowcow/goromdb/storage/bdbstorage.(*Storage).Load(0xc42000e030, 0xc43d387480, 0x12, 0xc420014160, 0x0, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/storage/bdbstorage/bdbstorage.go:31 +0xf1 fp=0xc420039d58 sp=0xc420039d10 pc=0x504821
github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Load(0xc42005e570, 0xc43d387480, 0x12, 0x0, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:69 +0x67 fp=0xc420039da0 sp=0xc420039d58 pc=0x4c19d7
github.com/yowcow/goromdb/handler/radixhandler.(*Handler).start(0xc42005e570, 0xc42005c120, 0xc4200641e0, 0xc42005c180)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:55 +0x4cf fp=0xc420039fc0 sp=0xc420039da0 pc=0x4c152f
runtime.goexit()
        /usr/local/go-1.9.2/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc420039fc8 sp=0xc420039fc0 pc=0x458361
created by github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Start
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:31 +0x7f

goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x7f86eb519f70, 0x72, 0xffffffffffffffff)
        /usr/local/go-1.9.2/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc420084098, 0x72, 0xc42004ba00, 0x0, 0x0)
        /usr/local/go-1.9.2/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc420084098, 0xffffffffffffff00, 0x0, 0x0)
        /usr/local/go-1.9.2/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Accept(0xc420084080, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/local/go-1.9.2/src/internal/poll/fd_unix.go:335 +0x1e2
net.(*netFD).accept(0xc420084080, 0xc42000e038, 0x0, 0x0)
        /usr/local/go-1.9.2/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc42000e040, 0x500527, 0x454e20, 0xc42004bc50)
        /usr/local/go-1.9.2/src/net/tcpsock_posix.go:136 +0x2e
net.(*TCPListener).Accept(0xc42000e040, 0x58a5b0, 0x581127, 0x3, 0x7fff1f2afb3c)
        /usr/local/go-1.9.2/src/net/tcpsock.go:247 +0x49
github.com/yowcow/goromdb/server.Server.Start(0x581127, 0x3, 0x7fff1f2afb3c, 0x6, 0x841fa0, 0x8701d0, 0x841f20, 0xc42005e570, 0xc420064190, 0x0, ...)
        /home/vagrant/go/src/github.com/yowcow/goromdb/server/server.go:40 +0xa4
main.main()
        /home/vagrant/go/src/github.com/yowcow/goromdb/main.go:91 +0xa93

goroutine 5 [select]:
github.com/yowcow/goromdb/watcher.Watcher.watch(0x7fff1f2afb58, 0xd, 0xc420014140, 0x11, 0x1388, 0xc420064190, 0x8425e0, 0xc42004e340, 0xc42005c120)
        /home/vagrant/go/src/github.com/yowcow/goromdb/watcher/watcher.go:41 +0x207
created by github.com/yowcow/goromdb/watcher.Watcher.Start
        /home/vagrant/go/src/github.com/yowcow/goromdb/watcher/watcher.go:27 +0x98

goroutine 47 [semacquire]:
sync.runtime_Semacquire(0xc42001416c)
        /usr/local/go-1.9.2/src/runtime/sema.go:56 +0x39
sync.(*RWMutex).RLock(0xc420014160)
        /usr/local/go-1.9.2/src/sync/rwmutex.go:50 +0x49
github.com/yowcow/goromdb/handler/radixhandler.Handler.Get(0xc43d47d400, 0x841fe0, 0xc42000e030, 0xc420014160, 0xc420064190, 0xc43e7a0004, 0x37, 0xffc, 0x0, 0x0, ...)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:104 +0xa0
github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Get(0xc42005e570, 0xc43e7a0004, 0x37, 0xffc, 0xc43a992738, 0x1, 0x1, 0x0, 0x0, 0xb, ...)
        <autogenerated>:1 +0x9c
github.com/yowcow/goromdb/server.Server.HandleConn(0x581127, 0x3, 0x7fff1f2afb3c, 0x6, 0x841fa0, 0x8701d0, 0x841f20, 0xc42005e570, 0xc420064190, 0x843260, ...)
        /home/vagrant/go/src/github.com/yowcow/goromdb/server/server.go:70 +0x38f
created by github.com/yowcow/goromdb/server.Server.Start
        /home/vagrant/go/src/github.com/yowcow/goromdb/server/server.go:44 +0x1c7

rax    0x0
rbx    0x52
rcx    0x7f86eaa3f428
rdx    0x6
rdi    0x1d89
rsi    0x1eb1
rbp    0x7f86db9bdbf0
rsp    0x7f86db9bd858
r8     0x9
r9     0x0
r10    0x8
r11    0x202
r12    0x52
r13    0x7f86db9bda08
r14    0x7f86db9bda08
r15    0x2
rip    0x7f86eaa3f428
rflags 0x202
cs     0x33
fs     0x0
gs     0x0
yowcow commented 6 years ago
2017/12/07 02:45:52 radixhandler.go:47: radixhandler got a new file to load at './tmp/data.db'
2017/12/07 02:45:52 radixhandler.go:54: radixhandler loading data from 'tmp/data01/data.db'
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x19 pc=0x7f622bf002a6]

runtime stack:
runtime.throw(0x588b7b, 0x2a)
        /usr/local/go-1.9.2/src/runtime/panic.go:605 +0x95
runtime.sigpanic()
        /usr/local/go-1.9.2/src/runtime/signal_unix.go:351 +0x2b8

goroutine 6 [syscall, locked to thread]:
runtime.cgocall(0x5250d0, 0xc420039ae8, 0x58883f)
        /usr/local/go-1.9.2/src/runtime/cgocall.go:132 +0xe4 fp=0xc420039aa8 sp=0xc420039a68 pc=0x4035c4
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb._Cfunc_db_cursor_get(0x7f62240432c0, 0xc436077530, 0xc4360775c0, 0x10, 0x0)
        github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/_obj/_cgo_gotypes.go:1042 +0x4d fp=0xc420039ae8 sp=0xc420039aa8 pc=0x50151d
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.Cursor.CursorGetRaw.func1(0x7f62240432c0, 0xc436077530, 0xc4360775c0, 0x10, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:246 +0x16e fp=0xc420039b30 sp=0xc420039ae8 pc=0x50321e
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.Cursor.CursorGetRaw(0x7f62240432c0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:246 +0x192 fp=0xc420039b98 sp=0xc420039b30 pc=0x5026b2
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.Cursor.Next(0x7f62240432c0, 0xc432d264be, 0x1, 0x1, 0x7f6228bf8000, 0x1, 0xb, 0xc42002a700, 0xc439c659fe)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:235 +0x37 fp=0xc420039bf8 sp=0xc420039b98 pc=0x5024a7
github.com/yowcow/goromdb/storage/bdbstorage.Cursor.Next(0xc42000e050, 0xc43209a780, 0x1f, 0xc420039c98, 0x445049, 0xc439c659e0, 0xc439c659c0, 0x1f, 0xc439c659e0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/storage/bdbstorage/bdbstorage.go:69 +0x32 fp=0xc420039c50 sp=0xc420039bf8 pc=0x504cb2
github.com/yowcow/goromdb/storage/bdbstorage.(*Cursor).Next(0xc42000e058, 0xc439c659e0, 0x1f, 0x542400, 0x844b01, 0x542400, 0x844b01, 0x1, 0x0)
        <autogenerated>:1 +0x44 fp=0xc420039ca8 sp=0xc420039c50 pc=0x504e44
github.com/yowcow/goromdb/handler/radixhandler.Handler.buildTree(0xc4367de900, 0x841fe0, 0xc42000e030, 0xc420014160, 0xc420064190, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:95 +0x11f fp=0xc420039d58 sp=0xc420039ca8 pc=0x4c1c3f
github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Load(0xc42005e570, 0xc428a1fa00, 0x12, 0xc420039eb0, 0x1)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:74 +0xa7 fp=0xc420039da0 sp=0xc420039d58 pc=0x4c1a67
yowcow commented 6 years ago

https://github.com/yowcow/goromdb/issues/57#issuecomment-349846536

This happens when db gets closed while a cursor is in iteration.

yowcow commented 6 years ago
    db, err := bdb.OpenBDB(bdb.NoEnv, bdb.NoTxn, file, nil, bdb.BTree, bdb.DbReadOnly, 0)
    if err != nil {
        panic(err)
    }

    c, err := db.NewCursor(bdb.NoTxn, 0)
    if err != nil {
        panic(err)
    }

    db.Close(0)

    c.First()

and I get

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x7f919bb94de3]

runtime stack:
runtime.throw(0x4b506d, 0x2a)
        /usr/local/go-1.9.2/src/runtime/panic.go:605 +0x95
runtime.sigpanic()
        /usr/local/go-1.9.2/src/runtime/signal_unix.go:351 +0x2b8

goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x4797d0, 0xc42004bdf8, 0x4b4e2a)
        /usr/local/go-1.9.2/src/runtime/cgocall.go:132 +0xe4 fp=0xc42004bdb8 sp=0xc42004bd78 pc=0x4032a4
github.com/ajiyoshi-vg/goberkeleydb/bdb._Cfunc_db_cursor_get(0x1e55d10, 0xc42005e150, 0xc42005e180, 0x7, 0x0)
        github.com/ajiyoshi-vg/goberkeleydb/bdb/_obj/_cgo_gotypes.go:1042 +0x4d fp=0xc42004bdf8 sp=0xc42004bdb8 pc=0x4768fd
github.com/ajiyoshi-vg/goberkeleydb/bdb.(*Cursor).CursorGetRaw.func1(0x1e55d10, 0xc42005e150, 0xc42005e180, 0x7, 0xc42004be98)
        /home/vagrant/go/src/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:242 +0x16e fp=0xc42004be40 sp=0xc42004bdf8 pc=0x47808e
github.com/ajiyoshi-vg/goberkeleydb/bdb.(*Cursor).CursorGetRaw(0xc42000e030, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/vagrant/go/src/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:242 +0x195 fp=0xc42004bea8 sp=0xc42004be40 pc=0x477675
yowcow commented 6 years ago

should have been resolved with #61