add: use SO_REUSEPORT on platform supporting it
This commit is contained in:
committed by
Steve Chavez
parent
de19b04fe4
commit
c297d051dc
@@ -38,6 +38,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -38,6 +38,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -38,6 +38,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -38,6 +38,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -40,6 +40,7 @@ openapi-server-proxy-uri = "https://otherexample.org/api"
|
||||
server-cors-allowed-origins = "http://otherorigin.com"
|
||||
server-host = "0.0.0.0"
|
||||
server-port = 80
|
||||
server-reuseport = true
|
||||
server-timing-enabled = true
|
||||
server-trace-header = "traceparent"
|
||||
server-unix-socket = "/tmp/pgrst_io_test.sock"
|
||||
|
||||
@@ -40,6 +40,7 @@ openapi-server-proxy-uri = "https://example.org/api"
|
||||
server-cors-allowed-origins = "http://origin.com"
|
||||
server-host = "0.0.0.0"
|
||||
server-port = 80
|
||||
server-reuseport = true
|
||||
server-timing-enabled = false
|
||||
server-trace-header = "CF-Ray"
|
||||
server-unix-socket = "/tmp/pgrst_io_test.sock"
|
||||
|
||||
@@ -40,6 +40,7 @@ openapi-server-proxy-uri = "https://postgrest.org"
|
||||
server-cors-allowed-origins = "http://example.com"
|
||||
server-host = "0.0.0.0"
|
||||
server-port = 80
|
||||
server-reuseport = true
|
||||
server-timing-enabled = true
|
||||
server-trace-header = "X-Request-Id"
|
||||
server-unix-socket = "/tmp/pgrst_io_test.sock"
|
||||
|
||||
@@ -39,6 +39,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -38,6 +38,7 @@ openapi-server-proxy-uri = ""
|
||||
server-cors-allowed-origins = ""
|
||||
server-host = "!4"
|
||||
server-port = 3000
|
||||
server-reuseport = false
|
||||
server-timing-enabled = false
|
||||
server-trace-header = ""
|
||||
server-unix-socket = ""
|
||||
|
||||
@@ -37,6 +37,7 @@ PGRST_OPENAPI_SERVER_PROXY_URI: 'https://postgrest.org'
|
||||
PGRST_SERVER_CORS_ALLOWED_ORIGINS: "http://example.com"
|
||||
PGRST_SERVER_HOST: 0.0.0.0
|
||||
PGRST_SERVER_PORT: 80
|
||||
PGRST_SERVER_REUSEPORT: true
|
||||
PGRST_SERVER_TRACE_HEADER: X-Request-Id
|
||||
PGRST_SERVER_TIMING_ENABLED: true
|
||||
PGRST_SERVER_UNIX_SOCKET: /tmp/pgrst_io_test.sock
|
||||
|
||||
@@ -34,6 +34,7 @@ openapi-server-proxy-uri = "https://postgrest.org"
|
||||
server-cors-allowed-origins = "http://example.com"
|
||||
server-host = "0.0.0.0"
|
||||
server-port = 80
|
||||
server-reuseport = true
|
||||
server-trace-header = "X-Request-Id"
|
||||
server-timing-enabled = true
|
||||
server-unix-socket = "/tmp/pgrst_io_test.sock"
|
||||
|
||||
@@ -266,7 +266,7 @@ def wait_until_status_code(url, max_seconds, status_code):
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
if response:
|
||||
if response is not None:
|
||||
raise PostgrestTimedOut(f"{response.status_code}: {response.text}")
|
||||
else:
|
||||
raise PostgrestTimedOut()
|
||||
|
||||
+29
-4
@@ -19,6 +19,7 @@ from util import (
|
||||
)
|
||||
from postgrest import (
|
||||
Admin,
|
||||
PostgrestTimedOut,
|
||||
freeport,
|
||||
is_ipv6,
|
||||
reset_statement_timeout,
|
||||
@@ -176,7 +177,6 @@ def test_random_port_bound(defaultenv):
|
||||
assert True # liveness check is done by run(), so we just need to check that it doesn't fail
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="PostgREST should not start on a used port", strict=True)
|
||||
def test_so_reuseport_zero_downtime_handover(defaultenv):
|
||||
"A second PostgREST instance should take over on the same main/admin ports without request failures."
|
||||
|
||||
@@ -204,7 +204,7 @@ def test_so_reuseport_zero_downtime_handover(defaultenv):
|
||||
# 6. Stop second PostgREST instance
|
||||
# 7. Verify client did not get any errors
|
||||
with run(
|
||||
env={**defaultenv},
|
||||
env={**defaultenv, "PGRST_SERVER_REUSEPORT": "true"},
|
||||
port=port,
|
||||
host=host,
|
||||
admin_port=admin_port,
|
||||
@@ -226,10 +226,11 @@ def test_so_reuseport_zero_downtime_handover(defaultenv):
|
||||
try:
|
||||
time.sleep(1)
|
||||
with run(
|
||||
env={**defaultenv},
|
||||
env={**defaultenv, "PGRST_SERVER_REUSEPORT": "true"},
|
||||
port=port,
|
||||
host=host,
|
||||
admin_port=admin_port,
|
||||
# we do not set SO_REUSEPORT on admin socket
|
||||
admin_port=freeport(used_ports=[port, admin_port]),
|
||||
):
|
||||
time.sleep(1)
|
||||
first.process.terminate()
|
||||
@@ -243,6 +244,30 @@ def test_so_reuseport_zero_downtime_handover(defaultenv):
|
||||
assert failures == []
|
||||
|
||||
|
||||
def test_so_reuseport_defaults_to_false(defaultenv):
|
||||
"A second PostgREST instance should not bind to the same port by default."
|
||||
|
||||
host = "0.0.0.0"
|
||||
port = freeport()
|
||||
admin_port = freeport(used_ports=[port])
|
||||
|
||||
with run(
|
||||
env={**defaultenv},
|
||||
port=port,
|
||||
host=host,
|
||||
admin_port=admin_port,
|
||||
):
|
||||
with pytest.raises(PostgrestTimedOut):
|
||||
with run(
|
||||
env={**defaultenv},
|
||||
port=port,
|
||||
host=host,
|
||||
admin_port=freeport(used_ports=[port, admin_port]),
|
||||
wait_max_seconds=1,
|
||||
):
|
||||
pass
|
||||
|
||||
|
||||
def test_app_settings_reload(tmp_path, defaultenv):
|
||||
"App settings should be reloaded from file when PostgREST is sent SIGUSR2."
|
||||
config = (CONFIGSDIR / "sigusr2-settings.config").read_text()
|
||||
|
||||
@@ -108,6 +108,7 @@ baseCfg = let secret = encodeUtf8 "reallyreallyreallyreallyverysafe" in
|
||||
, configServerCorsAllowedOrigins = []
|
||||
, configServerHost = "localhost"
|
||||
, configServerPort = 3000
|
||||
, configServerReusePort = False
|
||||
, configServerTraceHeader = Nothing
|
||||
, configServerUnixSocket = Nothing
|
||||
, configServerUnixSocketMode = 432
|
||||
|
||||
@@ -172,6 +172,7 @@ baseCfg = let secret = encodeUtf8 "reallyreallyreallyreallyverysafe" in
|
||||
, configServerCorsAllowedOrigins = []
|
||||
, configServerHost = "localhost"
|
||||
, configServerPort = 3000
|
||||
, configServerReusePort = False
|
||||
, configServerTraceHeader = Nothing
|
||||
, configServerUnixSocket = Nothing
|
||||
, configServerUnixSocketMode = 432
|
||||
|
||||
Reference in New Issue
Block a user