Skip to content

Commit 5d5f31d

Browse files
committedMar 15, 2021
Only apply uptime penalty on repeated restarts
1 parent a9ecf55 commit 5d5f31d

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed
 

Diff for: ‎server.py

+40-8
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,17 @@ def announce():
9191

9292
if action == "update" and not old:
9393
if app.config["ALLOW_UPDATE_WITHOUT_OLD"]:
94-
old = server
95-
old["start"] = time.time()
96-
old["clients_top"] = 0
97-
old["updates"] = 0
98-
old["total_clients"] = 0
94+
action = "start"
9995
else:
10096
return "Server to update not found."
10197

102-
server["update_time"] = time.time()
98+
server["update_time"] = int(time.time())
10399

104-
server["start"] = time.time() if action == "start" else old["start"]
100+
if action == "start":
101+
server["start"] = int(time.time())
102+
tracker.push("%s:%d" % (server["ip"], server["port"]), server["start"])
103+
else:
104+
server["start"] = old["start"]
105105

106106
if "clients_list" in server:
107107
server["clients"] = len(server["clients_list"])
@@ -301,6 +301,29 @@ def asyncFinishThread(server):
301301
serverList.update(server)
302302

303303

304+
class UptimeTracker:
305+
def __init__(self):
306+
self.d = {}
307+
self.cleanTime = 0
308+
self.lock = RLock()
309+
def push(self, id, ts):
310+
with self.lock:
311+
if time.time() >= self.cleanTime: # clear once in a while
312+
self.d.clear()
313+
self.cleanTime = time.time() + 48*60*60
314+
315+
if id in self.d:
316+
self.d[id] = self.d[id][-1:] + [ts]
317+
else:
318+
self.d[id] = [0, ts]
319+
# returns the before-last start time, in bulk
320+
def getStartTimes(self):
321+
ret = {}
322+
with self.lock:
323+
for k, v in self.d.items():
324+
ret[k] = v[0]
325+
return ret
326+
304327
class ServerList:
305328
def __init__(self):
306329
self.list = []
@@ -329,6 +352,8 @@ def remove(self, server):
329352
pass
330353

331354
def sort(self):
355+
start_times = tracker.getStartTimes()
356+
332357
def server_points(server):
333358
points = 0
334359

@@ -366,10 +391,13 @@ def server_points(server):
366391
points -= (server["ping"] - 0.4) * 8
367392

368393
# Up to -8 for less than an hour of uptime (penalty linearly decreasing)
394+
# only if the server has restarted before within the last 2 hours
369395
HOUR_SECS = 60 * 60
370396
uptime = server["uptime"]
371397
if uptime < HOUR_SECS:
372-
points -= ((HOUR_SECS - uptime) / HOUR_SECS) * 8
398+
start_time = start_times.get("%s:%d" % (server["ip"], server["port"]), 0)
399+
if start_time >= time.time() - 2 * HOUR_SECS:
400+
points -= ((HOUR_SECS - uptime) / HOUR_SECS) * 8
373401

374402
# reduction to 40% for servers that support both legacy (v4) and v5 clients
375403
if server["proto_min"] <= 32 and server["proto_max"] > 36:
@@ -446,6 +474,10 @@ def run(self):
446474
time.sleep(60)
447475
serverList.purgeOld()
448476

477+
# Globals / Startup
478+
479+
tracker = UptimeTracker()
480+
449481
serverList = ServerList()
450482

451483
PurgeThread().start()

0 commit comments

Comments
 (0)