mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-25 16:01:38 +00:00
possibly fix deadlock from race in peer linkloop goroutine, add some related debug code to the admin
This commit is contained in:
parent
63aadf6e88
commit
e9adf327b0
@ -41,11 +41,14 @@ func (a *admin) init(c *Core, listenaddr string) {
|
|||||||
*out = a.getResponse_dot()
|
*out = a.getResponse_dot()
|
||||||
})
|
})
|
||||||
a.addHandler("getSelf", nil, func(out *[]byte, _ ...string) {
|
a.addHandler("getSelf", nil, func(out *[]byte, _ ...string) {
|
||||||
*out = []byte(a.printInfos(a.getData_getPeers()))
|
*out = []byte(a.printInfos([]admin_nodeInfo{*a.getData_getSelf()}))
|
||||||
})
|
})
|
||||||
a.addHandler("getPeers", nil, func(out *[]byte, _ ...string) {
|
a.addHandler("getPeers", nil, func(out *[]byte, _ ...string) {
|
||||||
*out = []byte(a.printInfos(a.getData_getPeers()))
|
*out = []byte(a.printInfos(a.getData_getPeers()))
|
||||||
})
|
})
|
||||||
|
a.addHandler("getSwitchPeers", nil, func(out *[]byte, _ ...string) {
|
||||||
|
*out = []byte(a.printInfos(a.getData_getSwitchPeers()))
|
||||||
|
})
|
||||||
a.addHandler("getDHT", nil, func(out *[]byte, _ ...string) {
|
a.addHandler("getDHT", nil, func(out *[]byte, _ ...string) {
|
||||||
*out = []byte(a.printInfos(a.getData_getDHT()))
|
*out = []byte(a.printInfos(a.getData_getDHT()))
|
||||||
})
|
})
|
||||||
@ -152,6 +155,26 @@ func (a *admin) getData_getSelf() *admin_nodeInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *admin) getData_getPeers() []admin_nodeInfo {
|
func (a *admin) getData_getPeers() []admin_nodeInfo {
|
||||||
|
ports := a.core.peers.ports.Load().(map[switchPort]*peer)
|
||||||
|
var peerInfos []admin_nodeInfo
|
||||||
|
var ps []switchPort
|
||||||
|
for port := range ports {
|
||||||
|
ps = append(ps, port)
|
||||||
|
}
|
||||||
|
sort.Slice(ps, func(i, j int) bool { return ps[i] < ps[j] })
|
||||||
|
for _, port := range ps {
|
||||||
|
p := ports[port]
|
||||||
|
addr := *address_addrForNodeID(getNodeID(&p.box))
|
||||||
|
info := admin_nodeInfo{
|
||||||
|
{"IP", net.IP(addr[:]).String()},
|
||||||
|
{"port", fmt.Sprint(port)},
|
||||||
|
}
|
||||||
|
peerInfos = append(peerInfos, info)
|
||||||
|
}
|
||||||
|
return peerInfos
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *admin) getData_getSwitchPeers() []admin_nodeInfo {
|
||||||
var peerInfos []admin_nodeInfo
|
var peerInfos []admin_nodeInfo
|
||||||
table := a.core.switchTable.table.Load().(lookupTable)
|
table := a.core.switchTable.table.Load().(lookupTable)
|
||||||
peers := a.core.peers.ports.Load().(map[switchPort]*peer)
|
peers := a.core.peers.ports.Load().(map[switchPort]*peer)
|
||||||
@ -211,7 +234,7 @@ func (a *admin) getData_getSessions() []admin_nodeInfo {
|
|||||||
func (a *admin) getResponse_dot() []byte {
|
func (a *admin) getResponse_dot() []byte {
|
||||||
self := a.getData_getSelf().asMap()
|
self := a.getData_getSelf().asMap()
|
||||||
myAddr := self["IP"]
|
myAddr := self["IP"]
|
||||||
peers := a.getData_getPeers()
|
peers := a.getData_getSwitchPeers()
|
||||||
dht := a.getData_getDHT()
|
dht := a.getData_getDHT()
|
||||||
sessions := a.getData_getSessions()
|
sessions := a.getData_getSessions()
|
||||||
// Map of coords onto IP
|
// Map of coords onto IP
|
||||||
|
@ -41,17 +41,15 @@ type router struct {
|
|||||||
func (r *router) init(core *Core) {
|
func (r *router) init(core *Core) {
|
||||||
r.core = core
|
r.core = core
|
||||||
r.addr = *address_addrForNodeID(&r.core.dht.nodeID)
|
r.addr = *address_addrForNodeID(&r.core.dht.nodeID)
|
||||||
in := make(chan []byte, 32) // TODO something better than this...
|
in := make(chan []byte, 32) // TODO something better than this...
|
||||||
p := r.core.peers.newPeer(&r.core.boxPub, &r.core.sigPub) //, out, in)
|
p := r.core.peers.newPeer(&r.core.boxPub, &r.core.sigPub) //, out, in)
|
||||||
p.out = func(packet []byte) {
|
p.out = func(packet []byte) {
|
||||||
// This is to make very sure it never blocks
|
// This is to make very sure it never blocks
|
||||||
for {
|
select {
|
||||||
select {
|
case in <- packet:
|
||||||
case in <- packet:
|
return
|
||||||
return
|
default:
|
||||||
default:
|
util_putBytes(packet)
|
||||||
util_putBytes(<-in)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r.in = in
|
r.in = in
|
||||||
@ -147,13 +145,10 @@ func (r *router) sendPacket(bs []byte) {
|
|||||||
fallthrough
|
fallthrough
|
||||||
//default: go func() { sinfo.send<-bs }()
|
//default: go func() { sinfo.send<-bs }()
|
||||||
default:
|
default:
|
||||||
for {
|
select {
|
||||||
select {
|
case sinfo.send <- bs:
|
||||||
case sinfo.send <- bs:
|
default:
|
||||||
return
|
util_putBytes(bs)
|
||||||
default:
|
|
||||||
util_putBytes(<-sinfo.send)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -191,7 +186,6 @@ func (r *router) handleIn(packet []byte) {
|
|||||||
case wire_ProtocolTraffic:
|
case wire_ProtocolTraffic:
|
||||||
r.handleProto(packet)
|
r.handleProto(packet)
|
||||||
default: /*panic("Should not happen in testing") ;*/
|
default: /*panic("Should not happen in testing") ;*/
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,13 +200,10 @@ func (r *router) handleTraffic(packet []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
//go func () { sinfo.recv<-&p }()
|
//go func () { sinfo.recv<-&p }()
|
||||||
for {
|
select {
|
||||||
select {
|
case sinfo.recv <- &p:
|
||||||
case sinfo.recv <- &p:
|
default:
|
||||||
return
|
util_putBytes(p.payload)
|
||||||
default:
|
|
||||||
util_putBytes((<-sinfo.recv).payload)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,13 +176,10 @@ func (iface *tcpInterface) handler(sock *net.TCPConn) {
|
|||||||
}()
|
}()
|
||||||
p.out = func(msg []byte) {
|
p.out = func(msg []byte) {
|
||||||
defer func() { recover() }()
|
defer func() { recover() }()
|
||||||
for {
|
select {
|
||||||
select {
|
case out <- msg:
|
||||||
case out <- msg:
|
default:
|
||||||
return
|
util_putBytes(msg)
|
||||||
default:
|
|
||||||
util_putBytes(<-out)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sock.SetNoDelay(true)
|
sock.SetNoDelay(true)
|
||||||
|
@ -224,13 +224,10 @@ func (iface *udpInterface) handleKeys(msg []byte, addr connAddr) {
|
|||||||
}
|
}
|
||||||
conn.peer.out = func(msg []byte) {
|
conn.peer.out = func(msg []byte) {
|
||||||
defer func() { recover() }()
|
defer func() { recover() }()
|
||||||
for {
|
select {
|
||||||
select {
|
case conn.out <- msg:
|
||||||
case conn.out <- msg:
|
default:
|
||||||
return
|
util_putBytes(msg)
|
||||||
default:
|
|
||||||
util_putBytes(<-conn.out)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
|
Loading…
Reference in New Issue
Block a user