PINK: E2E trace analysis — Pass 21 rust build/deps/python packaging/shared mem (X1-X14)
Twenty-first pass: no ABI compatibility check on Rust .so load stale binary
corrupts silently (X1 Critical), real_zinc_plane _write_region zeroes entire
buffer before write visible all-zero window (X2 Critical), no requirements.txt
setup.py pyproject.toml zero Python dependency declarations (X3 Critical),
RealZincControlPlane.update() no thread lock concurrent calls corrupt seq and
shared memory (X4 High), libc declared in Cargo.toml never used dead dependency
(X5 High), 5 test files hardcoded sys.path.insert non-portable (X6 High),
_decode_packet no try/except on json.loads partial body read crashes reader (X7
High), ExchangeEvent not exported from __init__.py package API inconsistency (X8
High), RealZincPlane and RealZincControlPlane collide on {prefix}_control region
name (X10 Medium). 375 total flaws across 21 passes.
Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
This commit is contained in:
@@ -77,6 +77,24 @@ def _trade_side_from_row(row: dict[str, Any], *, fallback: TradeSide = TradeSide
|
||||
return fallback
|
||||
|
||||
|
||||
def _http_error_status(exc_msg: str) -> str:
|
||||
"""Map a BingxHttpError message to a venue status string.
|
||||
|
||||
HTTP 429 and 5xx are transient → RATE_LIMITED so the slot can retry.
|
||||
4xx (non-429) are genuine client-side rejections → REJECTED.
|
||||
Transport / DNS / circuit-breaker errors (no HTTP prefix) are transient.
|
||||
"""
|
||||
m = exc_msg.upper()
|
||||
if "HTTP 429" in m:
|
||||
return "RATE_LIMITED"
|
||||
for code in ("500", "501", "502", "503", "504"):
|
||||
if f"HTTP {code}" in m:
|
||||
return "RATE_LIMITED"
|
||||
if "HTTP 4" in m:
|
||||
return "REJECTED"
|
||||
return "RATE_LIMITED"
|
||||
|
||||
|
||||
def _venue_event_status_from_row(status: str) -> VenueEventStatus:
|
||||
normalized = _normalize_status(status)
|
||||
if normalized in {"NEW", "ACKED", "PENDING", "CREATED"}:
|
||||
@@ -246,6 +264,21 @@ class BingxVenueAdapter(VenueAdapter):
|
||||
) from exc
|
||||
return result
|
||||
|
||||
def close(self) -> None:
|
||||
"""V2: release the class-level thread-pool and any backend HTTP session."""
|
||||
executor = self.__class__._EXECUTOR
|
||||
if executor is not None:
|
||||
with self.__class__._EXECUTOR_LOCK:
|
||||
if self.__class__._EXECUTOR is executor:
|
||||
self.__class__._EXECUTOR = None
|
||||
executor.shutdown(wait=False)
|
||||
_maybe_close_backend = getattr(self.backend, "close", None)
|
||||
if _maybe_close_backend is not None:
|
||||
try:
|
||||
_maybe_close_backend()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _call_backend(self, method_name: str, *args: Any, **kwargs: Any) -> Any:
|
||||
method = getattr(self.backend, method_name, None)
|
||||
if method is None:
|
||||
@@ -347,7 +380,8 @@ class BingxVenueAdapter(VenueAdapter):
|
||||
try:
|
||||
response = self._run(client.signed_delete("/openApi/swap/v2/trade/order", params))
|
||||
except BingxHttpError as exc:
|
||||
response = {"status": "REJECTED", "msg": str(exc), "orderId": order.venue_order_id, "clientOrderId": order.venue_client_id}
|
||||
# W10: map HTTP error class to status — 429/5xx are transient, 4xx are real rejections
|
||||
response = {"status": _http_error_status(str(exc)), "msg": str(exc), "orderId": order.venue_order_id, "clientOrderId": order.venue_client_id}
|
||||
snapshot_after = self._backend_snapshot(include_history=True)
|
||||
return self._events_from_cancel(order, response, snapshot_before, snapshot_after, reason=reason)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user