@@ -156,13 +156,11 @@ def __init__(self, logger, config, connect_creator, ip_manager, check_local_netw
156
156
157
157
self .thread_num_lock = threading .Lock ()
158
158
self .timeout = 4
159
- self .max_timeout = 60
160
159
self .thread_num = 0
161
160
self .running = True
162
- self .connect_counter = 0
163
161
164
- self .get_num_lock = threading .Lock ()
165
- self .https_get_num = 0
162
+ self ._waiting_num_lock = threading .Lock ()
163
+ self ._connection_waiting_num = 0
166
164
self .no_ip_lock = threading .Lock ()
167
165
168
166
# after new created ssl_sock timeout(50 seconds)
@@ -185,8 +183,6 @@ def __init__(self, logger, config, connect_creator, ip_manager, check_local_netw
185
183
else :
186
184
self .keep_conn_th = None
187
185
188
- self .create_more_connection ()
189
-
190
186
def stop (self ):
191
187
self .running = False
192
188
@@ -219,71 +215,68 @@ def keep_connection_daemon(self):
219
215
time .sleep (5 )
220
216
continue
221
217
222
- self .connect_process ()
218
+ self ._connect_process ()
223
219
224
220
def _need_more_ip (self ):
225
- if self .https_get_num :
221
+ if self ._connection_waiting_num :
226
222
return True
227
223
else :
228
224
return False
229
225
230
- def create_more_connection (self ):
226
+ def _create_more_connection (self ):
231
227
if not self .connecting_more_thread :
232
228
with self .thread_num_lock :
233
- self .connecting_more_thread = threading .Thread (target = self .create_more_connection_worker )
229
+ self .connecting_more_thread = threading .Thread (target = self ._create_more_connection_worker )
234
230
self .connecting_more_thread .start ()
235
231
236
- def create_more_connection_worker (self ):
237
- while self .thread_num < self .config .https_max_connect_thread and \
238
- self ._need_more_ip ():
232
+ def _create_more_connection_worker (self ):
233
+ while self .thread_num < self .config .https_max_connect_thread and self ._need_more_ip ():
239
234
240
235
self .thread_num_lock .acquire ()
241
236
self .thread_num += 1
242
237
self .thread_num_lock .release ()
243
- p = threading .Thread (target = self .connect_thread )
238
+ p = threading .Thread (target = self ._connect_thread )
244
239
p .start ()
245
- time .sleep (0.5 )
240
+ time .sleep (self . config . connect_create_interval )
246
241
247
242
with self .thread_num_lock :
248
243
self .connecting_more_thread = None
249
244
250
- def connect_thread (self , sleep_time = 0 ):
245
+ def _connect_thread (self , sleep_time = 0 ):
251
246
time .sleep (sleep_time )
252
247
try :
253
248
while self .running and self ._need_more_ip ():
254
249
if self .new_conn_pool .qsize () > self .config .https_connection_pool_max :
255
250
break
256
251
257
- self .connect_process ()
252
+ self ._connect_process ()
258
253
finally :
259
254
self .thread_num_lock .acquire ()
260
255
self .thread_num -= 1
261
256
self .thread_num_lock .release ()
262
257
263
- def connect_process (self ):
258
+ def _connect_process (self ):
264
259
try :
265
260
ip_str , sni , host = self .ip_manager .get_ip_sni_host ()
266
261
if not ip_str :
267
262
with self .no_ip_lock :
268
263
# self.logger.warning("not enough ip")
269
264
time .sleep (10 )
270
- return
265
+ return None
271
266
272
267
# self.logger.debug("create ssl conn %s", ip_str)
273
268
ssl_sock = self ._create_ssl_connection (ip_str , sni , host )
274
269
if not ssl_sock :
275
270
time .sleep (1 )
276
- return
271
+ return None
277
272
278
273
self .new_conn_pool .put ((ssl_sock .handshake_time , ssl_sock ))
279
- self .connect_counter += 1
280
274
281
275
if self .config .connect_create_interval > 0 :
282
- if self .connect_counter >= 2 :
283
- sleep = random .randint (self .config .connect_create_interval , self .config .connect_create_interval * 2 )
284
- time .sleep (sleep )
285
- else :
286
- time .sleep (1 )
276
+ sleep = random .uniform (self .config .connect_create_interval , self .config .connect_create_interval * 2 )
277
+ time .sleep (sleep )
278
+
279
+ return ssl_sock
287
280
except Exception as e :
288
281
self .logger .exception ("connect_process except:%r" , e )
289
282
@@ -303,8 +296,8 @@ def _create_ssl_connection(self, ip_str, sni, host):
303
296
self .logger .debug ("connect %s network fail, %r" , ip_str , e )
304
297
time .sleep (1 )
305
298
else :
306
- self .logger .debug ("connect %s network fail:%r" , ip_str , e )
307
- self .ip_manager .report_connect_fail (ip_str , sni , str (e ))
299
+ self .logger .debug ("connect %s fail:%r" , ip_str , e )
300
+ self .ip_manager .report_connect_fail (ip_str , sni , str (e ))
308
301
except NoRescourceException as e :
309
302
self .logger .warning ("create ssl for %s except:%r" , ip_str , e )
310
303
self .ip_manager .report_connect_fail (ip_str , sni , str (e ))
@@ -318,12 +311,11 @@ def _create_ssl_connection(self, ip_str, sni, host):
318
311
self .logger .exception ("connect %s fail:%r" , ip_str , e )
319
312
time .sleep (1 )
320
313
321
- def get_ssl_connection (self ):
322
- with self .get_num_lock :
323
- self .https_get_num += 1
314
+ def get_ssl_connection (self , timeout = 30 ):
315
+ with self ._waiting_num_lock :
316
+ self ._connection_waiting_num += 1
324
317
325
- start_time = time .time ()
326
- self .create_more_connection ()
318
+ end_time = time .time () + timeout
327
319
try :
328
320
while self .running :
329
321
ret = self .new_conn_pool .get (block = True , timeout = 1 )
@@ -336,11 +328,12 @@ def get_ssl_connection(self):
336
328
# self.logger.debug("new_conn_pool.get:%s handshake:%d timeout.", ssl_sock.ip, handshake_time)
337
329
self .ip_manager .report_connect_closed (ssl_sock .ip_str , ssl_sock .sni , "get_timeout" )
338
330
ssl_sock .close ()
339
- continue
340
331
else :
341
- if time .time () - start_time > self . max_timeout :
342
- self .logger .debug ("create ssl timeout fail. " )
332
+ if time .time () > end_time :
333
+ self .logger .debug ("get_ssl_connection timeout" )
343
334
return None
335
+
336
+ self ._create_more_connection ()
344
337
finally :
345
- with self .get_num_lock :
346
- self .https_get_num -= 1
338
+ with self ._waiting_num_lock :
339
+ self ._connection_waiting_num -= 1
0 commit comments