mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-15 01:12:56 +00:00
We use the term "endpoint" in for compute Postgres nodes in the web UI
and user-facing documentation now. Adjust the nomenclature in the code.
This changes the name of the "neon_local pg" command to "neon_local
endpoint". Also adjust names of classes, variables etc. in the python
tests accordingly.
This also changes the directory structure so that endpoints are now
stored in:
.neon/endpoints/<endpoint id>
instead of:
.neon/pgdatadirs/tenants/<tenant_id>/<endpoint (node) name>
The tenant ID is no longer part of the path. That means that you
cannot have two endpoints with the same name/ID in two different
tenants anymore. That's consistent with how we treat endpoints in the
real control plane and proxy: the endpoint ID must be globally unique.
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
import time
|
|
|
|
from fixtures.neon_fixtures import NeonEnvBuilder
|
|
|
|
|
|
#
|
|
# Test truncation of FSM and VM forks of a relation
|
|
#
|
|
def test_truncate(neon_env_builder: NeonEnvBuilder, zenbenchmark):
|
|
env = neon_env_builder.init_start()
|
|
n_records = 10000
|
|
n_iter = 10
|
|
|
|
# Problems with FSM/VM forks truncation are most frequently detected during page reconstruction triggered
|
|
# by image layer generation. So adjust default parameters to make it happen more frequently.
|
|
tenant, _ = env.neon_cli.create_tenant(
|
|
conf={
|
|
# disable automatic GC
|
|
"gc_period": "0s",
|
|
# Compact and create images aggressively
|
|
"checkpoint_distance": "1000000",
|
|
"compaction_period": "1 s",
|
|
"compaction_threshold": "3",
|
|
"image_creation_threshold": "1",
|
|
"compaction_target_size": "1000000",
|
|
}
|
|
)
|
|
|
|
env.neon_cli.create_timeline("test_truncate", tenant_id=tenant)
|
|
endpoint = env.endpoints.create_start("test_truncate", tenant_id=tenant)
|
|
cur = endpoint.connect().cursor()
|
|
cur.execute("create table t1(x integer)")
|
|
cur.execute(f"insert into t1 values (generate_series(1,{n_records}))")
|
|
cur.execute("vacuum t1")
|
|
for i in range(n_iter):
|
|
cur.execute(f"delete from t1 where x>{n_records//2}")
|
|
cur.execute("vacuum t1")
|
|
time.sleep(1) # let pageserver a chance to create image layers
|
|
cur.execute(f"insert into t1 values (generate_series({n_records//2+1}, {n_records}))")
|
|
cur.execute("vacuum t1")
|
|
time.sleep(1) # let pageserver a chance to create image layers
|
|
|
|
cur.execute("select count(*) from t1")
|
|
res = cur.fetchone()
|
|
assert res is not None
|
|
assert res[0] == n_records
|