5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-26 14:11:37 +00:00

reduce allocations in switch

This commit is contained in:
Arceliar 2019-05-16 18:10:47 -05:00
parent 522ed147b1
commit 9c01947b1c

View File

@ -577,23 +577,28 @@ func (t *switchTable) start() error {
return nil return nil
} }
type closerInfo struct {
port switchPort
dist int
}
// Return a map of ports onto distance, keeping only ports closer to the destination than this node // Return a map of ports onto distance, keeping only ports closer to the destination than this node
// If the map is empty (or nil), then no peer is closer // If the map is empty (or nil), then no peer is closer
func (t *switchTable) getCloser(dest []byte) map[switchPort]int { func (t *switchTable) getCloser(dest []byte) []closerInfo {
table := t.getTable() table := t.getTable()
myDist := table.self.dist(dest) myDist := table.self.dist(dest)
if myDist == 0 { if myDist == 0 {
// Skip the iteration step if it's impossible to be closer // Skip the iteration step if it's impossible to be closer
return nil return nil
} }
closer := make(map[switchPort]int, len(table.elems)) t.queues.closer = t.queues.closer[:0]
for _, info := range table.elems { for _, info := range table.elems {
dist := info.locator.dist(dest) dist := info.locator.dist(dest)
if dist < myDist { if dist < myDist {
closer[info.port] = dist t.queues.closer = append(t.queues.closer, closerInfo{info.port, dist})
} }
} }
return closer return t.queues.closer
} }
// Returns true if the peer is closer to the destination than ourself // Returns true if the peer is closer to the destination than ourself
@ -656,9 +661,9 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
var bestDist int var bestDist int
var bestTime time.Time var bestTime time.Time
ports := t.core.peers.getPorts() ports := t.core.peers.getPorts()
for port, dist := range closer { for _, cinfo := range closer {
to := ports[port] to := ports[cinfo.port]
thisTime, isIdle := idle[port] thisTime, isIdle := idle[cinfo.port]
var update bool var update bool
switch { switch {
case to == nil: case to == nil:
@ -667,9 +672,9 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
//nothing //nothing
case best == nil: case best == nil:
update = true update = true
case dist < bestDist: case cinfo.dist < bestDist:
update = true update = true
case dist > bestDist: case cinfo.dist > bestDist:
//nothing //nothing
case thisTime.Before(bestTime): case thisTime.Before(bestTime):
update = true update = true
@ -678,7 +683,7 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
} }
if update { if update {
best = to best = to
bestDist = dist bestDist = cinfo.dist
bestTime = thisTime bestTime = thisTime
} }
} }
@ -711,6 +716,7 @@ type switch_buffers struct {
size uint64 // Total size of all buffers, in bytes size uint64 // Total size of all buffers, in bytes
maxbufs int maxbufs int
maxsize uint64 maxsize uint64
closer []closerInfo // Scratch space
} }
func (b *switch_buffers) cleanup(t *switchTable) { func (b *switch_buffers) cleanup(t *switchTable) {