mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2024-11-25 11:05:26 +00:00
update admin dot to better handle missing nodes and to direct links towards parent, based on neilalexander's work
This commit is contained in:
parent
625b97c511
commit
87a4af7841
@ -377,6 +377,14 @@ func dumpDHTSize(store map[[32]byte]*Node) {
|
|||||||
fmt.Printf("DHT min %d / avg %f / max %d\n", min, avg, max)
|
fmt.Printf("DHT min %d / avg %f / max %d\n", min, avg, max)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *Node) startUDP(listen string) {
|
||||||
|
n.core.DEBUG_setupAndStartGlobalUDPInterface(listen)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Node) connectUDP(remoteAddr string) {
|
||||||
|
n.core.DEBUG_maybeSendUDPKeys(remoteAddr)
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
|
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
|
||||||
@ -416,6 +424,22 @@ func main() {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
startNetwork(kstore)
|
startNetwork(kstore)
|
||||||
|
if true {
|
||||||
|
for _, node := range kstore {
|
||||||
|
node.startUDP("localhost:0")
|
||||||
|
node.connectUDP("localhost:12345")
|
||||||
|
break // just 1
|
||||||
|
}
|
||||||
|
for _, node := range kstore {
|
||||||
|
go func() {
|
||||||
|
// Just dump any packets sent to this node
|
||||||
|
for range node.recv {
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
var block chan struct{}
|
||||||
|
<-block
|
||||||
|
}
|
||||||
//time.Sleep(10*time.Second)
|
//time.Sleep(10*time.Second)
|
||||||
// Note that testPaths only works if pressure is turend off
|
// Note that testPaths only works if pressure is turend off
|
||||||
// Otherwise congestion can lead to routing loops?
|
// Otherwise congestion can lead to routing loops?
|
||||||
|
@ -111,24 +111,60 @@ func (a *admin) handleRequest(conn net.Conn) {
|
|||||||
}
|
}
|
||||||
a.core.router.doAdmin(getSessions)
|
a.core.router.doAdmin(getSessions)
|
||||||
|
|
||||||
// Now print it all out
|
// Start building a tree from all known nodes
|
||||||
conn.Write([]byte(fmt.Sprintf("graph {\n")))
|
type nodeInfo struct {
|
||||||
for k := range m {
|
name string
|
||||||
var mask [mDepth]switchPort
|
key [mDepth]switchPort
|
||||||
copy(mask[:mDepth], k[:])
|
parent [mDepth]switchPort
|
||||||
for mk := range mask {
|
}
|
||||||
mask[len(mask)-1-mk] = 0
|
infos := make(map[[mDepth]switchPort]nodeInfo)
|
||||||
if len(m[k]) == 0 {
|
// First fill the tree with all known nodes, no parents
|
||||||
m[k] = fmt.Sprintf("%+v (missing)", k)
|
for k, n := range m {
|
||||||
|
infos[k] = nodeInfo{
|
||||||
|
name: n,
|
||||||
|
key: k,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Now go through and create placeholders for any missing nodes
|
||||||
|
for _, info := range infos {
|
||||||
|
for idx, port := range info.key {
|
||||||
|
if port == 0 {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
if len(m[mask]) == 0 {
|
var key [mDepth]switchPort
|
||||||
m[mask] = fmt.Sprintf("%+v (missing)", mask)
|
copy(key[:idx], info.key[:])
|
||||||
|
newInfo, isIn := infos[key]
|
||||||
|
if isIn {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if len(m[mask]) > 0 && m[mask] != m[k] {
|
newInfo.name = "missing"
|
||||||
conn.Write([]byte(fmt.Sprintf(" \"%+v\" -- \"%+v\";\n", m[k], m[mask])))
|
newInfo.key = key
|
||||||
|
infos[key] = newInfo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Now go through and attach parents
|
||||||
|
for _, info := range infos {
|
||||||
|
info.parent = info.key
|
||||||
|
for idx := len(info.parent) - 1; idx >= 0; idx-- {
|
||||||
|
if info.parent[idx] != 0 {
|
||||||
|
info.parent[idx] = 0
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
infos[info.key] = info
|
||||||
|
}
|
||||||
|
// Now print it all out
|
||||||
|
conn.Write([]byte(fmt.Sprintf("digraph {\n")))
|
||||||
|
// First set the labels
|
||||||
|
for _, info := range infos {
|
||||||
|
conn.Write([]byte(fmt.Sprintf("\"%v\" [ label = \"%v\" ];\n", info.key, info.name)))
|
||||||
|
}
|
||||||
|
// Then print the tree structure
|
||||||
|
for _, info := range infos {
|
||||||
|
if info.key == info.parent {
|
||||||
|
continue
|
||||||
|
} // happens for the root, skip it
|
||||||
|
conn.Write([]byte(fmt.Sprintf(" \"%+v\" -> \"%+v\";\n", info.key, info.parent)))
|
||||||
}
|
}
|
||||||
conn.Write([]byte(fmt.Sprintf("}\n")))
|
conn.Write([]byte(fmt.Sprintf("}\n")))
|
||||||
break
|
break
|
||||||
|
Loading…
Reference in New Issue
Block a user