Skip to content

Commit af40445

Browse files
committed
fix: 增加上线失败,延长重试时间
1 parent f0ac067 commit af40445

File tree

4 files changed

+148
-17
lines changed

4 files changed

+148
-17
lines changed

assets/js/index.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
class Utils {
2+
static uuid(len, radix) {
3+
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
4+
var uuid = [], i;
5+
radix = radix || chars.length;
6+
7+
if (len) {
8+
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
9+
} else {
10+
var r;
11+
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
12+
uuid[14] = '4';
13+
for (i = 0; i < 36; i++) {
14+
if (!uuid[i]) {
15+
r = 0 | Math.random()*16;
16+
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
17+
}
18+
}
19+
}
20+
return uuid.join('');
21+
}
22+
}
23+
24+
class Socket {
25+
constructor(baseurl) {
26+
this._baseurl = baseurl;
27+
this._ws = null;
28+
this._wsReconnectTask = null;
29+
this._wsConnect()
30+
window.addEventListener("beforeinput", () => {
31+
this._ws?.close()
32+
})
33+
}
34+
async _sendByFetch(event, data) {
35+
var resp = await fetch({
36+
"url": this._baseurl,
37+
"body": JSON.stringify(
38+
{
39+
"event": event,
40+
"data": data,
41+
"echo_id": Utils.uuid()
42+
}
43+
)
44+
})
45+
return await resp.json()
46+
}
47+
_wsConnect() {
48+
clearTimeout(this._wsReconnectTask)
49+
this._ws?.close()
50+
this._ws = new WebSocket(
51+
this._baseurl
52+
)
53+
this._ws.addEventListener("close", () => {
54+
console.warn("The websocket has disconnected. After 5s to reconnect.")
55+
setTimeout(() => {
56+
this._wsConnect()
57+
}, 5000)
58+
})
59+
this._ws.addEventListener("message", (event) => {
60+
var raw_data = JSON.parse(event.data);
61+
})
62+
}
63+
async _sendByWs(event, data) {
64+
if (this._ws?.state != WebSocket.OPEN) return;
65+
var echo_id = Utils.uuid();
66+
this._ws.send({
67+
"event": event,
68+
"data": data,
69+
echo_id
70+
})
71+
var promise = new Promise((resolve, reject) => {
72+
73+
});
74+
return promise;
75+
}
76+
async send(event, data) {
77+
if (this._ws != null && this._ws.state == WebSocket.OPEN) {
78+
return this._sendByWs(event, data)
79+
} else {
80+
return this._sendByFetch(event, data)
81+
}
82+
}
83+
84+
}
85+
86+
const $socket = new Socket(window.location.origin + "/api")

core/cluster.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,8 @@ def __init__(self, id: str, secret: str):
504504
self.socket_io = ClusterSocketIO(self)
505505
self.want_enable: bool = False
506506
self.enabled = False
507+
self.banned = False
508+
self.enable_count: int = 0
507509
self.keepalive_task: Optional[int] = None
508510
self.delay_enable_task: Optional[int] = None
509511
self.counter = ClusterCounter()
@@ -572,29 +574,37 @@ async def request_cert(self):
572574
async def enable(self):
573575
cert = await clusters.get_certificate()
574576
scheduler.cancel(self.delay_enable_task)
575-
if self.want_enable:
577+
if self.want_enable or self.banned:
576578
return
577579
self.want_enable = True
580+
self.enable_count += 1
578581
logger.tinfo("cluster.info.want_enable", cluster=self.id)
579-
result = await self.socket_io.emit(
580-
"enable", {
581-
"host": cert.host,
582-
"port": config.const.public_port,
583-
"byoc": True,
584-
"version": API_VERSION,
585-
"noFastEnable": True,
586-
"flavor": {
587-
"storage": "local",
588-
"runtime": "python"
582+
try:
583+
result = await self.socket_io.emit(
584+
"enable", {
585+
"host": cert.host,
586+
"port": config.const.public_port,
587+
"byoc": True,
588+
"version": API_VERSION,
589+
"noFastEnable": True,
590+
"flavor": {
591+
"storage": "local",
592+
"runtime": "python"
593+
}
589594
}
590-
}
591-
)
592-
self.want_enable = False
595+
, 120)
596+
except:
597+
logger.terror("cluster.error.cluster.banned", cluster=self.id)
598+
self.banned = True
599+
return
600+
finally:
601+
self.want_enable = False
593602
if result.err:
594603
self.socketio_error("enable", result)
595604
self.retry()
596605
return
597606
self.enabled = True
607+
self.enable_count = 0
598608
scheduler.cancel(self.keepalive_task)
599609
self.keepalive_task = scheduler.run_repeat_later(self.keepalive, 1, interval=60)
600610
logger.tsuccess("cluster.success.enabled", cluster=self.id)
@@ -640,8 +650,9 @@ async def disable(self, exit: bool = False):
640650
self.retry()
641651

642652
def retry(self):
643-
self.delay_enable_task = scheduler.run_later(self.enable, 60)
644-
logger.tinfo("cluster.info.cluster.retry_enable", delay=units.format_count_datetime(60))
653+
delay = ((self.enable_count + 1) ** 2) * 60
654+
self.delay_enable_task = scheduler.run_later(self.enable, delay)
655+
logger.tinfo("cluster.info.cluster.retry_enable", delay=units.format_count_datetime(delay))
645656

646657

647658
@property
@@ -695,6 +706,12 @@ async def _(message: Any):
695706
message = message["message"]
696707
logger.tinfo("cluster.info.socketio.message", cluster=self.cluster.id, message=message)
697708

709+
@self.sio.on("exception") # type: ignore
710+
async def _(message: Any):
711+
if isinstance(message, dict) and "message" in message:
712+
message = message["message"]
713+
logger.terror("cluster.error.socketio.message", cluster=self.cluster.id, message=message)
714+
698715
async def disconnect(self):
699716
await self.sio.disconnect()
700717

core/dashboard.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from collections import deque
22
from dataclasses import dataclass
3+
import json
34
import os
45
import socket
56

@@ -105,6 +106,32 @@ async def _(request: web.Request):
105106
return web.json_response(
106107
await resp.json(),
107108
)
109+
110+
@route.get("/api")
111+
async def _(request: web.Request):
112+
if request.headers.get("Connection", "").lower() == "upgrade" and request.headers.get("Upgrade", "").lower() == "websocket":
113+
ws = web.WebSocketResponse()
114+
ws.can_prepare(request)
115+
await ws.prepare(request)
116+
await ws.send_json({
117+
"event": "echo",
118+
"data": "hello world",
119+
"echo_id": None
120+
})
121+
while not ws.closed:
122+
try:
123+
raw_data = await ws.receive()
124+
try:
125+
print(raw_data)
126+
except:
127+
...
128+
except:
129+
break
130+
return ws
131+
else:
132+
return web.json_response({
133+
})
134+
108135

109136
route.static("/assets", "./assets")
110137

i18n/zh_cn.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,6 @@
3131
"cluster.success.cluster.disable": "节点 [${cluster}] 已正常下线",
3232
"cluster.info.want_enable": "节点 [${cluster}] 正在启用中……",
3333
"cluster.info.cluster.retry_enable": "节点 [${cluster}] 将在 [${delay}] 后重新启用",
34-
"cluster.success.enabled": "节点 [${cluster}] 已正常上线"
34+
"cluster.success.enabled": "节点 [${cluster}] 已正常上线",
35+
"cluster.error.socketio.message": "节点 [${cluster}] 收到错误消息,原因 [${message}]"
3536
}

0 commit comments

Comments
 (0)