Skip to content

Commit 5f62f2b

Browse files
committed
5.7.7 avoid too many threads on creating connection.
1 parent 8c004b3 commit 5f62f2b

File tree

6 files changed

+32
-7
lines changed

6 files changed

+32
-7
lines changed

code/default/launcher/web_control.py

+21
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
module_menus = {}
6262

6363

64+
class FakeHttpHandler(simple_http_server.HttpServerHandler):
65+
def handle_one_request(self):
66+
# This function will replace simple_http_server HttpHandler.handle_one_request to hold all http requests.
67+
# Doing this is to simulate bug.
68+
self.close_connection = 0
69+
70+
6471
class Http_Handler(simple_http_server.HttpServerHandler):
6572
deploy_proc = None
6673

@@ -244,6 +251,10 @@ def do_GET(self):
244251
return self.req_log_handler()
245252
elif url_path == "/keep_log":
246253
return self.req_keep_log_handler()
254+
elif url_path == "/suck_threads":
255+
return self.req_suck_threads()
256+
elif url_path == "/hold_8085":
257+
return self.req_hold_8085()
247258
elif url_path == '/update':
248259
self.req_update_handler()
249260
elif url_path == '/config_proxy':
@@ -797,6 +808,16 @@ def req_keep_log_handler(self):
797808
mimetype = 'text/plain'
798809
self.send_response(mimetype, data)
799810

811+
def req_suck_threads(self):
812+
self.send_response('text/plain', "Start suck threads")
813+
while True:
814+
threading.Thread(target=time.sleep, args=(1000,)).start()
815+
816+
def req_hold_8085(self):
817+
global server
818+
self.send_response('text/plain', "Hold 8085")
819+
server.handler = FakeHttpHandler
820+
800821
def req_log_handler(self):
801822
req = urlparse(self.path).query
802823
reqs = self.unpack_reqs(parse_qs(req, keep_blank_values=True))

code/default/lib/noarch/front_base/connect_manager.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ def __init__(self, logger, config, connect_creator, ip_manager, check_local_netw
165165
self._waiting_num_lock = threading.Lock()
166166
self._connection_waiting_num = 0
167167
self.no_ip_lock = threading.Lock()
168+
self.no_ip_time = 0
168169

169170
# after new created ssl_sock timeout(50 seconds)
170171
# call the callback.
@@ -259,7 +260,7 @@ def _connect_thread(self, sleep_time=0):
259260
time.sleep(sleep_time)
260261

261262
try:
262-
while self.running and self._need_more_ip():
263+
while self.running and self._need_more_ip() and time.time() - self.no_ip_time > 10:
263264
if self.new_conn_pool.qsize() > self.config.https_connection_pool_max:
264265
break
265266

@@ -275,6 +276,7 @@ def _connect_process(self):
275276
try:
276277
ip_str, sni, host = self.ip_manager.get_ip_sni_host()
277278
if not ip_str:
279+
self.no_ip_time = time.time()
278280
with self.no_ip_lock:
279281
# self.logger.warning("not enough ip")
280282
time.sleep(10)

code/default/lib/noarch/simple_http_server.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ def check_listen_port_or_reset(self):
658658
if res:
659659
return
660660

661-
self.logger.warn("Listen %s:%d check failed", ip, port)
661+
self.logger.warn("Listen %s:%d check failed, try restart listening", ip, port)
662662
self.shutdown()
663663
time.sleep(3)
664664
self.start()

code/default/smart_router/local/smart_route.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def do_socks(sock, host, port, client_address, left_buf=b""):
239239
raise XTunnelNotRunning()
240240

241241
try:
242-
conn_id = g.x_tunnel.proxy_session.create_conn(sock, host, port)
242+
conn_id = g.x_tunnel.proxy_session.create_conn(sock, host, port, True)
243243
except Exception as e:
244244
xlog.warn("do_sock to %s:%d, x_tunnel fail:%r", host, port, e)
245245
raise XTunnelNotRunning()

code/default/version.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.7.6
1+
5.7.7

code/default/x_tunnel/local/proxy_session.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ def login_session(self):
431431

432432
return False
433433

434-
def create_conn(self, sock, host, port):
434+
def create_conn(self, sock, host, port, log=False):
435435
if not self.running:
436436
xlog.debug("session not running, try to connect")
437437
time.sleep(1)
@@ -457,6 +457,8 @@ def create_conn(self, sock, host, port):
457457
min(g.config.concurent_thread_num - g.config.min_on_road, self.target_on_roads + 5)
458458
self.trigger_more()
459459

460+
if log:
461+
xlog.info("Connect to %s:%d conn:%d", host, port, conn_id)
460462
return conn_id
461463

462464
# Called by stop
@@ -1143,7 +1145,7 @@ def login_process():
11431145
return True
11441146

11451147

1146-
def create_conn(sock, host, port):
1148+
def create_conn(sock, host, port, log=False):
11471149
if not (g.config.login_account and g.config.login_password):
11481150
time.sleep(1)
11491151
return False
@@ -1154,7 +1156,7 @@ def create_conn(sock, host, port):
11541156
else:
11551157
time.sleep(1)
11561158

1157-
return g.session.create_conn(sock, host, port)
1159+
return g.session.create_conn(sock, host, port, log)
11581160

11591161

11601162
def update_quota_loop():

0 commit comments

Comments
 (0)