tecbot / gorocksdb

gorocksdb is a Go wrapper for RocksDB

Home Page:http://rocksdb.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SIGABRT in Get operation

vitalyisaev2 opened this issue · comments

In this particular case RocksDB is used as a storage for protobuf-serialized messages (they may contain '\0' in the middle of their bodies, if it makes sense for cgo). Transactions are not used because database is guarded by a higher level lock manager.

By the way, if a protobuf-serialized message is encoded to hex, SIGSEGV doesn't happen.

I believe this is my application issue rather than gorocksdb bug, but have no idea how to investigate it.
I would be very appreciated if anyone could give a tip on how to debug it.

RocksDB: 5.10.2
GCC: 7.3.1

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x7f5a472d1927]

runtime stack:
runtime.throw(0xf1d0f5, 0x2a)
	/usr/lib/golang/src/runtime/panic.go:605 +0x95
runtime.sigpanic()
	/usr/lib/golang/src/runtime/signal_unix.go:351 +0x2b8

goroutine 1793 [syscall, locked to thread]:
runtime.cgocall(0xc79f40, 0xc4201db7c8, 0xf1c187)
	/usr/lib/golang/src/runtime/cgocall.go:132 +0xe4 fp=0xc4201db788 sp=0xc4201db748 pc=0x40e774
github.com/tecbot/gorocksdb._Cfunc_rocksdb_get(0x7f5a18034830, 0x7f5a18033e60, 0xc420260080, 0x20, 0xc423a0dd50, 0xc4201ab918, 0x0)
	github.com/tecbot/gorocksdb/_obj/_cgo_gotypes.go:1260 +0x4e fp=0xc4201db7c8 sp=0xc4201db788 pc=0xa3a9ae
github.com/tecbot/gorocksdb.(*DB).Get.func1(0x7f5a18034830, 0x7f5a18033e60, 0xc420260080, 0x20, 0xc423a0dd50, 0xc4201ab918, 0xc4211f9b30)
	/home/vitaly/go/src/github.com/tecbot/gorocksdb/db.go:224 +0x144 fp=0xc4201db818 sp=0xc4201db7c8 pc=0xa4e784
github.com/tecbot/gorocksdb.(*DB).Get(0xc420217600, 0xc4202d6550, 0xc420260080, 0x20, 0x20, 0x0, 0x0, 0x0)
	/home/vitaly/go/src/github.com/tecbot/gorocksdb/db.go:224 +0xd2 fp=0xc4201db8a0 sp=0xc4201db818 pc=0xa442d2
(...private code...)

I've checked if the use of transaction database fixes this problem, but unfortunately it's still here

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x7fd6f8774927]

runtime stack:
runtime.throw(0xf13155, 0x2a)
	/usr/lib/golang/src/runtime/panic.go:605 +0x95
runtime.sigpanic()
	/usr/lib/golang/src/runtime/signal_unix.go:351 +0x2b8

goroutine 2312 [syscall, locked to thread]:
runtime.cgocall(0xc72e70, 0xc42046b118, 0xf121e7)
	/usr/lib/golang/src/runtime/cgocall.go:132 +0xe4 fp=0xc42046b0d8 sp=0xc42046b098 pc=0x40e774
github.com/tecbot/gorocksdb._Cfunc_rocksdb_transactiondb_get(0x7fd6bc073ce0, 0x7fd6bc079aa0, 0xc420012f20, 0x20, 0xc420018d98, 0xc420208078, 0x0)
	github.com/tecbot/gorocksdb/_obj/_cgo_gotypes.go:3769 +0x4e fp=0xc42046b118 sp=0xc42046b0d8 pc=0xa3f6de
github.com/tecbot/gorocksdb.(*TransactionDB).Get.func1(0x7fd6bc073ce0, 0x7fd6bc079aa0, 0xc420012f20, 0x20, 0xc420018d98, 0xc420208078, 0xc420206270)
	/home/vitaly/go/src/github.com/tecbot/gorocksdb/transactiondb.go:82 +0x144 fp=0xc42046b168 sp=0xc42046b118 pc=0xa50044
github.com/tecbot/gorocksdb.(*TransactionDB).Get(0xc42015d8f0, 0xc42000e5c8, 0xc420012f20, 0x20, 0x20, 0x0, 0x0, 0x0)
	/home/vitaly/go/src/github.com/tecbot/gorocksdb/transactiondb.go:82 +0xd2 fp=0xc42046b1f0 sp=0xc42046b168 pc=0xa48b72

Stacktrace of the last panic:

Program terminated with signal SIGABRT, Aborted.
#0  runtime.raise () at /usr/lib/golang/src/runtime/sys_linux_amd64.s:113
113		RET
[Current thread is 1 (Thread 0x7f68e5ffb700 (LWP 11616))]
Loading Go Runtime support.
Missing separate debuginfos, use: dnf debuginfo-install bzip2-libs-1.0.6-24.fc27.x86_64 glibc-2.26-24.fc27.x86_64 libgcc-7.3.1-2.fc27.x86_64 libstdc++-7.3.1-2.fc27.x86_64 libzstd-1.3.3-1.fc27.x86_64 lz4-libs-1.8.0-1.fc27.x86_64 snappy-1.1.4-5.fc27.x86_64 zlib-1.2.11-4.fc27.x86_64
(gdb) bt
#0  runtime.raise () at /usr/lib/golang/src/runtime/sys_linux_amd64.s:113
#1  0x000000000044fcfb in runtime.dieFromSignal (sig=6) at /usr/lib/golang/src/runtime/signal_unix.go:400
#2  0x000000000044fe89 in runtime.crash () at /usr/lib/golang/src/runtime/signal_unix.go:482
#3  0x00000000004396c2 in runtime.dopanic_m (gp=0xc420189980, pc=4427973, sp=140088512063968) at /usr/lib/golang/src/runtime/panic.go:732
#4  0x000000000046605c in runtime.dopanic.func1 () at /usr/lib/golang/src/runtime/panic.go:587
#5  0x000000000046751b in runtime.systemstack () at /usr/lib/golang/src/runtime/asm_amd64.s:360
#6  0x0000000000438fd8 in runtime.dopanic (unused=0) at /usr/lib/golang/src/runtime/panic.go:586
#7  0x00000000004390c5 in runtime.throw (s="unexpected signal during runtime execution") at /usr/lib/golang/src/runtime/panic.go:605
#8  0x000000000044fca8 in runtime.sigpanic () at /usr/lib/golang/src/runtime/signal_unix.go:351
#9  0x00007f690b565927 in malloc () from /lib64/libc.so.6
#10 0x00007f690c4491a6 in CopyString (
    str="\n\316\001\n\bU+cjFg==\022\301\001\n4\n\022\n\f\b\364\205\376\233\301\323\331\002\020\260T\020\001\030\n\022\036\n\034test_8732172474436002331.txt\022\210\001\nt\b\001\032$\n ʗ\201\022\312\033\275\312\372\302\061\263\232#\334M\247\206\357\370\024|Nr\271\200w\205\257\356H\273\020\001\032$\n n4\v\234\377\263z\230\234\245D\346\273x\n,x\220\035?\263\067\070v\205\021\243\006\027\257\240\035\020\001\032$\n m\220\373\254\300s\356\vLC\363\243)\034\354\332\063vOmf\321B$\255`\364q\362\310\063K\020\002\020\001\032\006\n\004\b\001\020"...) at db/c.cc:462
#11 0x00007f690c44ff00 in rocksdb_transactiondb_get (txn_db=<optimized out>, options=<optimized out>, key=<optimized out>, klen=<optimized out>, vlen=0x0, errptr=0x468d60 <runtime.cgocallback_gofunc>)
    at db/c.cc:3536
#12 0x0000000000c71b3b in _cgo_32f6082be52a_Cfunc_rocksdb_transactiondb_get (v=0xc420de3098) at cgo-gcc-prolog:128
#13 0x0000000000468cc0 in runtime.asmcgocall () at /usr/lib/golang/src/runtime/asm_amd64.s:624
#14 0x000000c420de3128 in ?? ()
#15 0x0000000000000002 in ?? ()
#16 0x0000000000000002 in ?? ()
#17 0x000000c420de3188 in ?? ()
#18 0x0000000000000002 in ?? ()
#19 0x0000000000000ff0 in ?? ()
#20 0x000000c420064600 in ?? ()
#21 0x00000000004674e9 in runtime.systemstack () at /usr/lib/golang/src/runtime/asm_amd64.s:344
#22 0x000000000043d8c0 in ?? () at /usr/lib/golang/src/runtime/proc.go:1070
#23 0x000000c420026600 in ?? ()
#24 0x00007f68e5ffabb0 in ?? ()
#25 0x000000c420189980 in ?? ()
#26 0x00007f68e5ffab98 in ?? ()
#27 0x000000000043d924 in runtime.mstart () at /usr/lib/golang/src/runtime/proc.go:1152
#28 0x0000000000c6f90c in crosscall_amd64 () at gcc_amd64.S:35
#29 0x00000000021da770 in ?? ()
#30 0x00007ffeefeb10d0 in ?? ()
#31 0x0000000000000000 in ?? ()
(gdb) f 10
#10 0x00007f690c4491a6 in CopyString (
    str="\n\316\001\n\bU+cjFg==\022\301\001\n4\n\022\n\f\b\364\205\376\233\301\323\331\002\020\260T\020\001\030\n\022\036\n\034test_8732172474436002331.txt\022\210\001\nt\b\001\032$\n ʗ\201\022\312\033\275\312\372\302\061\263\232#\334M\247\206\357\370\024|Nr\271\200w\205\257\356H\273\020\001\032$\n n4\v\234\377\263z\230\234\245D\346\273x\n,x\220\035?\263\067\070v\205\021\243\006\027\257\240\035\020\001\032$\n m\220\373\254\300s\356\vLC\363\243)\034\354\332\063vOmf\321B$\255`\364q\362\310\063K\020\002\020\001\032\006\n\004\b\001\020"...) at db/c.cc:462
462	  char* result = reinterpret_cast<char*>(malloc(sizeof(char) * str.size()));

@JelteF thank you for your reply. The problem was in application code, I should have worked more properly with my pool of protocol buffers.