mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-07 21:42:56 +00:00
test: figure out the relative eviction order assertions (#6375)
I just failed to see this earlier on #6136. layer counts are used as an abstraction, and each of the two tenants lose proportionally about the same amount of layers. sadly there is no difference in between `relative_spare` and `relative_equal` as both of these end up evicting the exact same amount of layers, but I'll try to add later another test for those. Cc: #5304
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import enum
|
||||
import time
|
||||
from collections import Counter
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Dict, Tuple
|
||||
|
||||
@@ -119,6 +120,19 @@ class EvictionEnv:
|
||||
for tid, tlid in self.timelines
|
||||
}
|
||||
|
||||
def count_layers_per_tenant(self, pageserver: NeonPageserver) -> Dict[TenantId, int]:
|
||||
ret: Counter[TenantId] = Counter()
|
||||
|
||||
for tenant_id, timeline_id in self.timelines:
|
||||
timeline_dir = pageserver.timeline_dir(tenant_id, timeline_id)
|
||||
assert timeline_dir.exists()
|
||||
for file in timeline_dir.iterdir():
|
||||
if "__" not in file.name:
|
||||
continue
|
||||
ret[tenant_id] += 1
|
||||
|
||||
return dict(ret)
|
||||
|
||||
def warm_up_tenant(self, tenant_id: TenantId):
|
||||
"""
|
||||
Start a read-only compute at the LSN after pgbench -i, and run pgbench -S against it.
|
||||
@@ -503,6 +517,7 @@ def test_partial_evict_tenant(eviction_env: EvictionEnv, order: EvictionOrder):
|
||||
|
||||
(total_on_disk, _, _) = env.timelines_du(env.pageserver)
|
||||
du_by_timeline = env.du_by_timeline(env.pageserver)
|
||||
tenant_layers = env.count_layers_per_tenant(env.pageserver)
|
||||
|
||||
# pick smaller or greater (iteration order is insertion order of scale=4 and scale=6)
|
||||
[warm, cold] = list(du_by_timeline.keys())
|
||||
@@ -556,8 +571,31 @@ def test_partial_evict_tenant(eviction_env: EvictionEnv, order: EvictionOrder):
|
||||
cold_size < cold_upper
|
||||
), "the cold tenant should be evicted to its min_resident_size, i.e., max layer file size"
|
||||
else:
|
||||
# just go with the space was freed, find proper limits later
|
||||
pass
|
||||
# with relative order what matters is the amount of layers, with a
|
||||
# fudge factor of whether the eviction bothers tenants with highest
|
||||
# layer count the most. last accessed times between tenants does not
|
||||
# matter.
|
||||
layers_now = env.count_layers_per_tenant(env.pageserver)
|
||||
|
||||
expected_ratio = later_total_on_disk / total_on_disk
|
||||
log.info(
|
||||
f"freed up {100 * expected_ratio}%, expecting the layer counts to decrease in similar ratio"
|
||||
)
|
||||
|
||||
for tenant_id, original_count in tenant_layers.items():
|
||||
count_now = layers_now[tenant_id]
|
||||
ratio = count_now / original_count
|
||||
abs_diff = abs(ratio - expected_ratio)
|
||||
assert original_count > count_now
|
||||
log.info(
|
||||
f"tenant {tenant_id} layer count {original_count} -> {count_now}, ratio: {ratio}, expecting {abs_diff} < 0.1"
|
||||
)
|
||||
|
||||
# in this test case both relative_spare and relative_equal produce
|
||||
# the same outcomes; this must be a quantization effect of similar
|
||||
# sizes (-s4 and -s6) and small (5MB) layer size.
|
||||
# for pg15 and pg16 the absdiff is < 0.01, for pg14 it is closer to 0.02
|
||||
assert abs_diff < 0.05
|
||||
|
||||
|
||||
def poor_mans_du(
|
||||
|
||||
Reference in New Issue
Block a user