* Calculation of hint message when requested relation is not present in schema cache requires creation of a FuzzySet (to use fuzzy search to find candidate tables). For schemas with many tables it is costly.
This patch introduces dbTablesFuzzyIndex in SchemaCache to memoize the FuzzySet creation.
* Additionally, because of FuzzySet large memory requirements, this patch introduces a limit of 500 relations per schema, above which FuzzySet is not created and hint calculation disabled.
(cherry picked from commit e592d568c6)
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
"IO tests for PostgREST started on the big schema."
|
|
|
|
import re
|
|
|
|
import pytest
|
|
|
|
from postgrest import run
|
|
|
|
|
|
def test_schema_cache_load_max_duration(defaultenv):
|
|
"schema cache load should not surpass a max_duration of elapsed milliseconds"
|
|
|
|
max_duration = 500.0
|
|
|
|
env = {
|
|
**defaultenv,
|
|
"PGRST_DB_SCHEMAS": "apflora",
|
|
"PGRST_DB_POOL": "2",
|
|
"PGRST_DB_ANON_ROLE": "postgrest_test_anonymous",
|
|
}
|
|
|
|
with run(env=env, wait_max_seconds=30, no_startup_stdout=False) as postgrest:
|
|
log_lines = postgrest.read_stdout(nlines=50)
|
|
schema_cache_lines = [
|
|
line for line in log_lines if "Schema cache loaded in" in line
|
|
]
|
|
|
|
match = re.search(
|
|
r"Schema cache loaded in ([0-9]+(?:\.[0-9])?) milliseconds",
|
|
schema_cache_lines[-1],
|
|
)
|
|
|
|
assert match, f"unexpected log format: {schema_cache_lines[-1]}"
|
|
duration_ms = float(match.group(1))
|
|
|
|
assert duration_ms < max_duration
|
|
|
|
|
|
# TODO: This test fails now because of https://github.com/PostgREST/postgrest/pull/2122
|
|
# The stack size of 1K(-with-rtsopts=-K1K) is not enough and this fails with "stack overflow"
|
|
# A stack size of 200K seems to be enough for succeess
|
|
@pytest.mark.skip
|
|
def test_openapi_in_big_schema(defaultenv):
|
|
"Should get a successful response from openapi on a big schema"
|
|
|
|
env = {
|
|
**defaultenv,
|
|
"PGRST_DB_SCHEMAS": "apflora",
|
|
"PGRST_OPENAPI_MODE": "ignore-privileges",
|
|
}
|
|
|
|
with run(env=env) as postgrest:
|
|
response = postgrest.session.get("/")
|
|
assert response.status_code == 200
|
|
|
|
|
|
# See: https://github.com/PostgREST/postgrest/issues/3329
|
|
def test_should_not_fail_with_stack_overflow(defaultenv):
|
|
"requesting a non-existent relationship should not fail with stack overflow due to fuzzy search of candidates"
|
|
|
|
env = {
|
|
**defaultenv,
|
|
"PGRST_DB_SCHEMAS": "apflora",
|
|
"PGRST_DB_POOL": "2",
|
|
"PGRST_DB_ANON_ROLE": "postgrest_test_anonymous",
|
|
}
|
|
|
|
with run(env=env, wait_max_seconds=30) as postgrest:
|
|
response = postgrest.session.get("/unknown-table?select=unknown-rel(*)")
|
|
assert response.status_code == 404
|
|
data = response.json()
|
|
assert data["code"] == "PGRST205"
|
|
|
|
|
|
def test_second_request_for_non_existent_table_should_be_quick(defaultenv):
|
|
"requesting a non-existent relationship should be quick after the fuzzy search index is loaded (2nd request)"
|
|
|
|
env = {
|
|
**defaultenv,
|
|
"PGRST_DB_SCHEMAS": "fuzzysearch",
|
|
"PGRST_DB_POOL": "2",
|
|
"PGRST_DB_ANON_ROLE": "postgrest_test_anonymous",
|
|
}
|
|
|
|
with run(env=env, wait_max_seconds=30) as postgrest:
|
|
response = postgrest.session.get("/unknown-table")
|
|
assert response.status_code == 404
|
|
data = response.json()
|
|
assert data["code"] == "PGRST205"
|
|
first_duration = response.elapsed.total_seconds()
|
|
response = postgrest.session.get("/unknown-table")
|
|
assert response.elapsed.total_seconds() < first_duration / 10
|