From 6ad6d6dc50d8e78b54f1c80eeea1bed24170d6e8 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Sat, 12 Oct 2019 21:40:50 +0100 Subject: [PATCH] Fix channel allocation when relays are provisioned Fix a bug where the channel allocation algorithm failed due to necessary relays not having been provisioned yet. Passed the newly created relay numbers to the allocation function and assumed their CHANMAX would be the same as all other relays for the same network. --- modules/chankeep.py | 40 ++++++++++++++++++++++++++-------------- modules/provision.py | 3 +++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/modules/chankeep.py b/modules/chankeep.py index 2db206d..43a3d32 100644 --- a/modules/chankeep.py +++ b/modules/chankeep.py @@ -5,7 +5,6 @@ from copy import deepcopy from math import ceil from modules.provision import provisionMultipleRelays from twisted.internet.threads import deferToThread -from numpy import array_split def allRelaysActive(net): relayNum = len(main.network[net].relays.keys()) @@ -19,22 +18,35 @@ def allRelaysActive(net): return True return False -def getChanFree(net): +def getChanFree(net, new): chanfree = {} + chanlimits = set() for i in main.network[net].relays.keys(): + if i in new: + continue name = net+str(i) chanfree[i] = main.IRCPool[name].chanlimit-len(main.IRCPool[name].channels) - return chanfree + chanlimits.add(main.IRCPool[name].chanlimit) -def emptyChanAllocate(net, flist, relay): - chanfree = getChanFree(net) + if not len(chanlimits) == 1: + error("Network %s has servers with different CHANMAX values" % net) + return False + return (chanfree, chanlimits.pop()) + +def emptyChanAllocate(net, flist, relay, new): + chanfree = getChanFree(net, new) + if not chanfree: + return + for i in new: + chanfree[0][i] = chanfree[1] + print("chanfree", chanfree) allocated = {} toalloc = len(flist) - if toalloc > sum(chanfree.values()): + if toalloc > sum(chanfree[0].values()): error("Too many channels to allocate for %s - this is probably a bug" % net) return False - for i in chanfree.keys(): - for x in range(chanfree[i]): + for i in chanfree[0].keys(): + for x in range(chanfree[0][i]): if not len(flist): break if i in allocated.keys(): @@ -43,9 +55,9 @@ def emptyChanAllocate(net, flist, relay): allocated[i] = [flist.pop()] return allocated -def populateChans(net, clist, relay): +def populateChans(net, clist, relay, new): #divided = array_split(clist, relay) - allocated = emptyChanAllocate(net, clist, relay) + allocated = emptyChanAllocate(net, clist, relay, new) if not allocated: return for i in allocated.keys(): @@ -91,15 +103,15 @@ def keepChannels(net, listinfo, mean, sigrelay, relay): return if coverAll: needed = relay-len(main.network[net].relays.keys()) + newNums = provisionMultipleRelays(net, needed) flist = [i[0] for i in listinfo] - populateChans(net, flist, relay) + populateChans(net, flist, relay, newNums) else: needed = sigrelay-len(main.network[net].relays.keys()) + newNums = provisionMultipleRelays(net, needed) siglist = [i[0] for i in listinfo if int(i[1]) > mean] - populateChans(net, siglist, sigrelay) + populateChans(net, siglist, sigrelay, newNums) notifyJoin(net) - if needed > 0: - provisionMultipleRelays(net, needed) #print("coverall", coverAll) #print("needed", needed) diff --git a/modules/provision.py b/modules/provision.py index 3b99cfe..f15d4c6 100644 --- a/modules/provision.py +++ b/modules/provision.py @@ -63,8 +63,11 @@ def provisionRelay(num, network): return def provisionMultipleRelays(net, relaysNeeded): + numsProvisioned = [] for i in range(relaysNeeded): num, alias = main.network[net].add_relay() + numsProvisioned.append(num) provisionRelay(num, net) main.saveConf("network") + return numsProvisioned