Giter Club home page Giter Club logo

goromdb's Introduction

Build Status Go Report Card

GOROMDB

Yet another single process KVS server implemented over file-based database.

GOROMDB is a datastore that:

  • accepts read-only access
  • talks multiple protocols like memcached and others
  • handles multiple database backends like JSON, BerkeleyDB, BoltDB, and others

STRUCTURE

                     .---------.
                     | watcher |
                     '----+----'
                          |
        .--------.   .----+----.   .---------.
TCP --> | server +---+ handler +---+ storage |-.
        '----+---'   '----+----'   '---------' | <-- Replacable database
             |            |          '---------'
       .-----+----.   .---+----.
       | protocol |   | loader |
       '----------'   '--------'

HOW TO USE

GOROMDB can be used as an executable binary, or a collection of simple libraries.

Executable Binary

Just do:

go install github.com/yowcow/goromdb

An example of booting GOROMDB with BerkeleyDB database is:

goromdb -addr :11211 -storage bdb -file path/to/bdb-data.db -basedir path/to/store

Note that default compilation of the binary only covers basic features of GOROMDB. If full capability, like namespaced database, and/or multiple database file deployment, is required, craft libraries and build GOROMDB for your own.

GOROMDB does not daemonize itself. Look of other tools to daemonize GOROMDB.

Libraries

Just do:

go get github.com/yowcow/goromdb

and import whatever package into your source code.

BENCHMARK AND PERFORMANCE

GOROMDB should serve fast but maybe not quite as fast as pure memcached. Detailed benchmark is comming up.

DIRECTORY STRUCTURE

When -basedir of /tmp/path/to/dir is specified at boot, GOROMDB creates subdirectories data00 and data01 under /tmp/path/to/dir:

/tmp/path/to/dir
├── db00
└── db01

When -file of /tmp/path/to/dir/data.db is specified at boot, GOROMDB will watch for database file /tmp/path/to/dir/data.db and its MD5 sum file /tmp/path/to/dir/data.db.md5.

When database and MD5 files are placed in directory /tmp/path/to/dir, GOROMDB will verify MD5 sum.

/tmp/path/to/dir
├── data00
├── data01
├── data.db
└── data.db.md5

Once MD5 sum verification succeeds, GOROMDB will move data file into subdirectory either data00 or data01, and load the database into running server.

/tmp/path/to/dir
├── data00
│   └── data.db
└── data01

Placing database and MD5 sum files again will load database into next subdirectory data01 vice versa.

goromdb's People

Contributors

ajiyoshi-vg avatar yowcow avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

goromdb's Issues

make test failed: data files not found

-> % make test
go test ./...
ok      github.com/yowcow/goromdb       0.012s [no tests to run]
?       github.com/yowcow/goromdb/cmd/sample-data/bdb   [no test files]
?       github.com/yowcow/goromdb/cmd/sample-data/memcachedb-bdb        [no test files]
?       github.com/yowcow/goromdb/handler       [no test files]
--- FAIL: TestLoadAndGet (0.00s)
        Error Trace:    radixhandler_test.go:36
        Error:          Expected nil, but got: &os.PathError{Op:"open", Path:"../../data/store/sample-data.json", Err:0x2}
    --- FAIL: TestLoadAndGet/exact_match_on_key_succeeds (0.00s)
        Error Trace:    radixhandler_test.go:72
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    radixhandler_test.go:73
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=4) {
                        - 00000000  68 6f 67 65                                       |hoge|
                        -}
                        +([]uint8) <nil>

        Error Trace:    radixhandler_test.go:74
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

    --- FAIL: TestLoadAndGet/prefix_match_on_key_succeeds (0.00s)
        Error Trace:    radixhandler_test.go:72
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    radixhandler_test.go:73
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=4) {
                        - 00000000  68 6f 67 65                                       |hoge|
                        -}
                        +([]uint8) <nil>

        Error Trace:    radixhandler_test.go:74
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

--- FAIL: TestStart (0.00s)
panic: open ../../data/store/sample-data.json: no such file or directory [recovered]
        panic: open ../../data/store/sample-data.json: no such file or directory

goroutine 10 [running]:
testing.tRunner.func1(0xc42010e960)
        /Users/ke-suzuki/src/github.com/golang/go/src/testing/testing.go:739 +0x291
panic(0x1297180, 0xc4201602d0)
        /Users/ke-suzuki/src/github.com/golang/go/src/runtime/panic.go:502 +0x229
github.com/yowcow/goromdb/testutil.CopyFile(0xc4200194f0, 0x50, 0x12f2eb7, 0x21)
        /Users/ke-suzuki/src/github.com/yowcow/goromdb/testutil/testutil.go:28 +0x178
github.com/yowcow/goromdb/handler/radixhandler.TestStart(0xc42010e960)
        /Users/ke-suzuki/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler_test.go:95 +0x2c3
testing.tRunner(0xc42010e960, 0x12fe388)
        /Users/ke-suzuki/src/github.com/golang/go/src/testing/testing.go:774 +0xc4
created by testing.(*T).Run
        /Users/ke-suzuki/src/github.com/golang/go/src/testing/testing.go:821 +0x2ca
FAIL    github.com/yowcow/goromdb/handler/radixhandler  0.046s
ok      github.com/yowcow/goromdb/handler/simplehandler (cached)
ok      github.com/yowcow/goromdb/loader        (cached)
ok      github.com/yowcow/goromdb/protocol      (cached)
ok      github.com/yowcow/goromdb/protocol/memcachedprotocol    (cached)
ok      github.com/yowcow/goromdb/server        (cached)
?       github.com/yowcow/goromdb/storage       [no test files]
BDB0134 read: 0x7fff5fbfeda0, 512: Is a directory
./: Is a directory
--- FAIL: TestLoad (0.00s)
    --- FAIL: TestLoad/loading_valid_file_succeeds (0.00s)
        Error Trace:    bdbstorage_test.go:43
        Error:          Not equal:
                        expected: false
                        received: true
--- FAIL: TestGet (0.00s)
    --- FAIL: TestGet/existing_key_returns_expected_val (0.00s)
        Error Trace:    bdbstorage_test.go:88
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    bdbstorage_test.go:89
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

    --- FAIL: TestGet/existing_key_again_returns_expected_val (0.00s)
        Error Trace:    bdbstorage_test.go:88
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    bdbstorage_test.go:89
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

FAIL
FAIL    github.com/yowcow/goromdb/storage/bdbstorage    0.016s
ok      github.com/yowcow/goromdb/storage/jsonstorage   (cached)
BDB0134 read: 0x7fff5fbfeda0, 512: Is a directory
./: Is a directory
--- FAIL: TestLoad (0.00s)
    --- FAIL: TestLoad/loading_existing_file_succeeds (0.00s)
        Error Trace:    memcdstorage_test.go:46
        Error:          Not equal:
                        expected: false
                        received: true
--- FAIL: TestGet (0.00s)
    --- FAIL: TestGet/existing_key_succeeds (0.00s)
        Error Trace:    memcdstorage_test.go:92
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    memcdstorage_test.go:93
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

    --- FAIL: TestGet/existing_key_again_succeeds (0.00s)
        Error Trace:    memcdstorage_test.go:92
        Error:          Not equal:
                        expected: false
                        received: true
        Error Trace:    memcdstorage_test.go:93
        Error:          Not equal:
                        expected: []byte{0x68, 0x6f, 0x67, 0x65, 0x21}
                        received: []byte(nil)

                        Diff:
                        --- Expected
                        +++ Actual
                        @@ -1,4 +1,2 @@
                        -([]uint8) (len=5) {
                        - 00000000  68 6f 67 65 21                                    |hoge!|
                        -}
                        +([]uint8) <nil>

FAIL
FAIL    github.com/yowcow/goromdb/storage/memcdstorage  0.020s
ok      github.com/yowcow/goromdb/testutil      (cached)
ok      github.com/yowcow/goromdb/watcher       (cached)
make: *** [test] Error 1

bdb: segmentation fault at db_close

2017/12/08 08:15:01 radixhandler.go:47: radixhandler got a new file to load at './tmp/data.db'
2017/12/08 08:15:01 radixhandler.go:54: radixhandler loading data from 'tmp/data00/data.db'
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x7f85ace0a5a1]

runtime stack:
runtime.throw(0x599e58, 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(0x5307f0, 0xc420039c70, 0x599af2)
        /usr/local/go-1.9.2/src/runtime/cgocall.go:132 +0xe4 fp=0xc420039c30 sp=0xc420039bf0 pc=0x4035c4
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb._Cfunc_db_close(0x12ec090, 0x0, 0x0)
        github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/_obj/_cgo_gotypes.go:984 +0x4d fp=0xc420039c70 sp=0xc420039c30 pc=0x5035bd
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.(*BerkeleyDB).Close.func1(0x12ec090, 0x0, 0xc420039ce0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:172 +0x68 fp=0xc420039ca8 sp=0xc420039c70 pc=0x505218
github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb.(*BerkeleyDB).Close(0xc42000e068, 0x0, 0xc420014160, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/vendor/github.com/ajiyoshi-vg/goberkeleydb/bdb/berkeleydb_c.go:172 +0x3a fp=0xc420039ce0 sp=0xc420039ca8 pc=0x50435a
github.com/yowcow/goromdb/storage/bdbstorage.(*Storage).LoadAndIterate(0xc42000e030, 0xc437f02d00, 0x12, 0xc43d686000, 0xc420014160, 0x0, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/storage/bdbstorage/bdbstorage.go:48 +0x129 fp=0xc420039d20 sp=0xc420039ce0 pc=0x506d39
github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Load(0xc42005e570, 0xc437f02d00, 0x12, 0x0, 0x0)
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:77 +0xec fp=0xc420039da0 sp=0xc420039d20 pc=0x4c3f3c
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=0x4c3a0f
runtime.goexit()
        /usr/local/go-1.9.2/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc420039fc8 sp=0xc420039fc0 pc=0x4588a1
created by github.com/yowcow/goromdb/handler/radixhandler.(*Handler).Start
        /home/vagrant/go/src/github.com/yowcow/goromdb/handler/radixhandler/radixhandler.go:31 +0x7f

Store should keep currently active data

Drop-in replacement data file should be validated first, then be placed and loaded into active data store.
Otherwise file validation is useless.

There should be a directory where new data file and checksum file are placed, and another directory where active data file is kept.

Test fails on Go 1.11


/tmp/goromdb-test856754182/data00/test.data
/tmp/goromdb-test086669741/data01/test.data
--- FAIL: TestFindAny (0.00s)
    --- FAIL: TestFindAny/pre-existing_file_in_data01 (0.00s)
        Error Trace:    loader_test.go:127
        Error:          Not equal: 0 (expected)
                        != 1 (actual)

FAIL
FAIL    github.com/yowcow/goromdb/loader        0.224s

documentation

  • Update readme
  • golint golint ./... | grep -v '^vendor'

Release binaries

For each release version, build binaries and upload from Travis to GitHub

Test sometimes fails

--- FAIL: TestGet_on_existing_key (0.01s)
        Error Trace:    jsonstore_test.go:80
        Error:          Expected nil, but got: &errors.errorString{s:"key 'hoge' not found"}

        Error Trace:    jsonstore_test.go:81
        Error:          Not equal: "hoge!" (expected)
                                != "" (actual)

FAIL
FAIL

Improve README

Describe:

  • project goal and progress
  • how to use
  • help wanted

bdb: double free or corruption

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

Centralize logging

Logging is disppersed. Unify and centralize *log.Logger into 1 instance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.