neo-go/pkg/connmgr
Roman Khimov 9a30f2fbcc connmgr: correctly pass binding error to the server
And make the node fail gracefully if it's unable to bind. Before this commit:
-----
Server is starting up
Connection manager started
Error connecting to outbound  listen tcp 127.0.0.1:20332: bind: address already in use
We have connected successfully to:  127.0.0.1:20334
panic: runtime error: invalid memory address or nil pointer dereference
        panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x6bbfa2]

goroutine 12 [running]:
github.com/CityOfZion/neo-go/pkg/connmgr.New.func1.1(0x0, 0x0)
        /home/rik/dev/neo-go/pkg/connmgr/connmgr.go:47 +0x22
panic(0x718980, 0xa22f70)
        /usr/lib64/go/1.12/src/runtime/panic.go:522 +0x1b5
github.com/CityOfZion/neo-go/pkg/connmgr.New.func1(0xc000013430, 0xc000013450, 0xc000013440, 0xc0005265f0, 0xf, 0x0)
        /home/rik/dev/neo-go/pkg/connmgr/connmgr.go:52 +0x15e
created by github.com/CityOfZion/neo-go/pkg/connmgr.New
        /home/rik/dev/neo-go/pkg/connmgr/connmgr.go:38 +0xfe
exit status 2
-----

After this commit:
-----
listen tcp 127.0.0.1:20332: bind: address already in use
-----
2019-08-19 15:31:22 +03:00
..
config.go [connmgr] Refactor Connmgr (#205) 2019-03-21 23:18:02 +00:00
connmgr.go connmgr: correctly pass binding error to the server 2019-08-19 15:31:22 +03:00
connmgr_test.go [connmgr] Refactor Connmgr (#205) 2019-03-21 23:18:02 +00:00
readme.md [connmgr] Refactor Connmgr (#205) 2019-03-21 23:18:02 +00:00
request.go [connmgr] Refactor Connmgr (#205) 2019-03-21 23:18:02 +00:00

Package - Connection Manager

Responsibility

  • Manages the active, failed and pending connections for the node.

Features

  • Takes an Request, dials it and logs information based on the connectivity.

  • Retry failed connections.

  • Removable address source. The connection manager does not manage addresses, only connections.

Usage

The following methods are exposed from the Connection manager:

  • Connect(r *Request) : This takes a Request object and connects to it. It follow the same logic as NewRequest() however instead of getting the address from the datasource given upon initialisation, you directly feed the address you want to connect to.

  • Disconnect(addrport string) : Given an address:port, this will disconnect it, close the connection and remove it from the connected and pending list, if it was there.