feat(cd): out_service/cd.py 支持任意 host:port, 去掉 IP 白名单
socket 槽位和 per-host 锁改为首次访问时懒注册, 用 double-checked locking 保证热路径无竞争。不再硬编码 4 个采集器地址。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
86a8110a5e
commit
7ef9763a50
|
|
@ -4,14 +4,21 @@ from urllib.parse import urlparse, parse_qs
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
sc_all = {
|
sc_all = {}
|
||||||
"192.168.1.220_6000": None,
|
sc_locks = {}
|
||||||
"192.168.1.235_6000": None,
|
registry_lock = threading.Lock()
|
||||||
"192.168.1.225_6000": None,
|
|
||||||
"192.168.1.230_6000": None,
|
|
||||||
}
|
|
||||||
|
|
||||||
sc_locks = {addr: threading.Lock() for addr in sc_all}
|
|
||||||
|
def get_lock(addr):
|
||||||
|
lock = sc_locks.get(addr)
|
||||||
|
if lock is None:
|
||||||
|
with registry_lock:
|
||||||
|
lock = sc_locks.get(addr)
|
||||||
|
if lock is None:
|
||||||
|
lock = threading.Lock()
|
||||||
|
sc_locks[addr] = lock
|
||||||
|
sc_all.setdefault(addr, None)
|
||||||
|
return lock
|
||||||
|
|
||||||
def get_checksum(body_msg):
|
def get_checksum(body_msg):
|
||||||
return sum(body_msg) & 0xFF
|
return sum(body_msg) & 0xFF
|
||||||
|
|
@ -106,13 +113,10 @@ class JSONRequestHandler(BaseHTTPRequestHandler):
|
||||||
host = query_params.get('host', ['127.0.0.1'])[0]
|
host = query_params.get('host', ['127.0.0.1'])[0]
|
||||||
port = query_params.get('port', ['6000'])[0]
|
port = query_params.get('port', ['6000'])[0]
|
||||||
addr = f'{host}_{port}'
|
addr = f'{host}_{port}'
|
||||||
|
lock = get_lock(addr)
|
||||||
if addr not in sc_all:
|
|
||||||
self.error(f'{addr} 未找到')
|
|
||||||
return
|
|
||||||
|
|
||||||
def request_once():
|
def request_once():
|
||||||
with sc_locks[addr]:
|
with lock:
|
||||||
sc = sc_all[addr]
|
sc = sc_all[addr]
|
||||||
try:
|
try:
|
||||||
if sc is None:
|
if sc is None:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue