phoreproject / graphene

Phore Synapse working repository
MIT License
13 stars 6 forks source link

Listen for interrupt signal and close database cleanly #48

Closed meyer9 closed 5 years ago

meyer9 commented 5 years ago

Synapse should close the database cleanly when CTRL-C is run.

wqking commented 5 years ago

Isn't this already implemented?

beacon/app/app.go

func (app BeaconApp) listenForInterrupt() {
    signalHandler := make(chan os.Signal, 1)
    signal.Notify(signalHandler, os.Interrupt)
    <-signalHandler

    app.exitChan <- struct{}{}
}

func (app BeaconApp) waitForExit() {
    <-app.exitChan

    app.exit()

    logger.Info("exiting")
}

func (app BeaconApp) exit() {
    err := app.database.Close()
    if err != nil {
        panic(err)
    }
}
meyer9 commented 5 years ago

Well, I'll try to run it and ctrl-c a few times, but I don't think it's working.

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0xb6d317]

goroutine 149 [running]:
github.com/dgraph-io/badger/skl.(*Skiplist).IncrRef(...)
    /home/meyer9/go/src/github.com/dgraph-io/badger/skl/skl.go:86
github.com/dgraph-io/badger.(*DB).getMemTables(0xc0000f4c00, 0x0, 0x0, 0x0, 0x0)
    /home/meyer9/go/src/github.com/dgraph-io/badger/db.go:459 +0xd7
github.com/dgraph-io/badger.(*DB).get(0xc0000f4c00, 0xc0099153e0, 0x2d, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    /home/meyer9/go/src/github.com/dgraph-io/badger/db.go:491 +0x66
github.com/dgraph-io/badger.(*Txn).Get(0xc00991a580, 0xc0099153b0, 0x25, 0x30, 0x25, 0xc0099153b0, 0x5)
    /home/meyer9/go/src/github.com/dgraph-io/badger/txn.go:459 +0xe7
github.com/phoreproject/synapse/beacon/db.(*BadgerDB).GetBlockForHash(0xc00019c860, 0x2a0abcd72d14a037, 0x6233628c5f638bb7, 0xdde4a32f9bc5fd74, 0x9dedafce23b12fec, 0x0, 0x0, 0x0)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/db/badger.go:71 +0x112
github.com/phoreproject/synapse/beacon.(*Blockchain).GetBlockByHash(...)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/blockchain.go:352
github.com/phoreproject/synapse/beacon.(*ChainView).GetStateBySlot(0xc009a68420, 0x135, 0x1, 0x1, 0xc00ae6a840)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/blockchain.go:566 +0x110
github.com/phoreproject/synapse/primitives.(*State).ProcessBlock(0xc011b46780, 0xc011826d80, 0x16bdd40, 0x1068400, 0xc009a68420, 0x0, 0x0, 0xc009a72000)
    /home/meyer9/go/src/github.com/phoreproject/synapse/primitives/state.go:1969 +0xfbc
github.com/phoreproject/synapse/beacon.(*StateManager).AddBlockToStateMap(0xc0094f2000, 0xc011826d80, 0x6233628c5f638b00, 0xdde4a32f9bc5fd74, 0x9dedafce23b12fec, 0xc011b46300)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/statemanager.go:194 +0x232
github.com/phoreproject/synapse/beacon.(*Blockchain).AddBlockToStateMap(...)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/state.go:28
github.com/phoreproject/synapse/beacon.(*Blockchain).ProcessBlock(0xc00939a9f0, 0xc011826d80, 0x6233628c5f630001, 0xdde4a32f9bc5fd74, 0x9dedafce23b12fec)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/state.go:75 +0x447
github.com/phoreproject/synapse/beacon.SyncManager.handleReceivedBlock(0xc0000b8140, 0x12a05f200, 0x0, 0xc00939a9f0, 0xc011826d80, 0xc009430980, 0xc00a7f9400, 0x0, 0x0)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/syncmanager.go:313 +0x413
github.com/phoreproject/synapse/beacon.SyncManager.onMessageBlock(0xc0000b8140, 0x12a05f200, 0xc000187300, 0xc00939a9f0, 0xc009430980, 0x1063880, 0xc0114a0a00, 0xc0000c8160, 0xd99260)
    /home/meyer9/go/src/github.com/phoreproject/synapse/beacon/syncmanager.go:270 +0x1401
github.com/phoreproject/synapse/p2p.(*HostNode).handleMessage(0xc0000b8140, 0xc009430980, 0x1063880, 0xc0114a0a00, 0x34001, 0xc0094db000)
    /home/meyer9/go/src/github.com/phoreproject/synapse/p2p/hostnode.go:151 +0x3ea
github.com/phoreproject/synapse/p2p.(*HostNode).setupPeerNode.func5.1(0x1063880, 0xc0114a0a00, 0x1063880, 0xc0114a0a00)
    /home/meyer9/go/src/github.com/phoreproject/synapse/p2p/hostnode.go:281 +0x47
github.com/phoreproject/synapse/p2p.processMessages(0xc0000330e0, 0xc00ae6df88, 0xc000050f70, 0xc000050f00)
    /home/meyer9/go/src/github.com/phoreproject/synapse/p2p/messagehandler.go:126 +0x24a
github.com/phoreproject/synapse/p2p.(*HostNode).setupPeerNode.func5(0xc0000818d0, 0xc0000b8140, 0xc009430980, 0xc000033320, 0x4, 0x4)
    /home/meyer9/go/src/github.com/phoreproject/synapse/p2p/hostnode.go:280 +0x96
created by github.com/phoreproject/synapse/p2p.(*HostNode).setupPeerNode
    /home/meyer9/go/src/github.com/phoreproject/synapse/p2p/hostnode.go:279 +0x758
exit status 2
^C

Could be a problem with Goroutines not being cleaned up properly. Maybe we should use the context API?

Also, if you want to test it on your own machine, the command I'm using is:

go run cmd/beacon/synapsebeacon.go -genesistime 1557336342 -connect "/ip4/134.209.58.178/tcp/11781/ipfs/12D3KooWDW6ZvQYxhgu3i6ys6pqbwoP2YAkXJNYdcyis7nsfSSG9"