from __future__ import annotations import time from fixtures.neon_fixtures import NeonEnvBuilder, flush_ep_to_pageserver def test_layer_map(neon_env_builder: NeonEnvBuilder, zenbenchmark): """Benchmark searching the layer map, when there are a lot of small layer files.""" env = neon_env_builder.init_configs() n_iters = 10 n_records = 100000 env.start() # We want to have a lot of lot of layer files to exercise the layer map. Disable # GC, and make checkpoint_distance very small, so that we get a lot of small layer # files. tenant, timeline = env.create_tenant( conf={ "gc_period": "0s", "checkpoint_distance": "16384", "compaction_period": "1 s", "compaction_threshold": "1", "compaction_target_size": "16384", } ) endpoint = env.endpoints.create_start("main", tenant_id=tenant) cur = endpoint.connect().cursor() cur.execute("create table t(x integer)") for _ in range(n_iters): cur.execute(f"insert into t values (generate_series(1,{n_records}))") time.sleep(1) cur.execute("vacuum t") with zenbenchmark.record_duration("test_query"): cur.execute("SELECT count(*) from t") assert cur.fetchone() == (n_iters * n_records,) flush_ep_to_pageserver(env, endpoint, tenant, timeline) env.pageserver.http_client().timeline_checkpoint( tenant, timeline, compact=False, wait_until_uploaded=True )