mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-20 13:52:24 +02:00
test: serve browser assets without head-of-line blocking
The shared static server handled one connection at a time. Chromium can open a speculative connection and never send a request, so every queued request waited behind it. Under parallel load a computed-style capture's navigation stalled for 30s and failed. Under CPU saturation, 4 of 12 captures stalled for about 29s each. Serve each connection on a daemon thread. The existing serve-this-worktree test now holds a silent connection open while it fetches, and times out against the serial server. The configuration reference's recorded source lines are unchanged.
This commit is contained in:
+4
-2
@@ -195,8 +195,8 @@ def _serve_test_static():
|
|||||||
return "text/css"
|
return "text/css"
|
||||||
return super().guess_type(path)
|
return super().guess_type(path)
|
||||||
|
|
||||||
class _Server(socketserver.TCPServer):
|
class _Server(socketserver.ThreadingTCPServer):
|
||||||
allow_reuse_address = True
|
allow_reuse_address = daemon_threads = True
|
||||||
|
|
||||||
requested = int(os.environ.get("ODYSSEUS_TEST_STATIC_PORT") or 0)
|
requested = int(os.environ.get("ODYSSEUS_TEST_STATIC_PORT") or 0)
|
||||||
if not 0 <= requested <= 65535:
|
if not 0 <= requested <= 65535:
|
||||||
@@ -214,6 +214,8 @@ def _serve_test_static():
|
|||||||
previous_origin = os.environ.get("ODYSSEUS_TEST_STATIC_ORIGIN")
|
previous_origin = os.environ.get("ODYSSEUS_TEST_STATIC_ORIGIN")
|
||||||
os.environ["ODYSSEUS_TEST_STATIC_ORIGIN"] = origin
|
os.environ["ODYSSEUS_TEST_STATIC_ORIGIN"] = origin
|
||||||
|
|
||||||
|
# One thread per connection: Chromium can hold a speculative connection
|
||||||
|
# open without a request, which stalled serial service for ~30s.
|
||||||
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
||||||
thread.start()
|
thread.start()
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ running its own suite took the whole session down with it.
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import socket
|
||||||
import urllib.request
|
import urllib.request
|
||||||
|
from urllib.parse import urlsplit
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
@@ -31,8 +33,12 @@ def test_static_origin_does_not_reuse_the_application_port() -> None:
|
|||||||
|
|
||||||
def test_static_server_serves_this_worktree() -> None:
|
def test_static_server_serves_this_worktree() -> None:
|
||||||
origin = os.environ["ODYSSEUS_TEST_STATIC_ORIGIN"]
|
origin = os.environ["ODYSSEUS_TEST_STATIC_ORIGIN"]
|
||||||
|
address = urlsplit(origin)
|
||||||
|
|
||||||
with urllib.request.urlopen(f"{origin}/static/js/documentStats.js", timeout=5) as r:
|
# Chromium may open a speculative connection and never send a request;
|
||||||
|
# that must not stall the requests queued behind it.
|
||||||
|
with socket.create_connection((address.hostname, address.port), timeout=5), \
|
||||||
|
urllib.request.urlopen(f"{origin}/static/js/documentStats.js", timeout=5) as r:
|
||||||
assert r.status == 200
|
assert r.status == 200
|
||||||
assert r.headers.get_content_type() == "application/javascript"
|
assert r.headers.get_content_type() == "application/javascript"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user