Skip to main content

mz-limits-test

Add/modify/debug limits test. Trigger: "limits test", "Generator subclass", "many objects", "scaling test", or stress-test Materialize with many objects (tables, views, sources, indexes). Also edits in test/limits/mzcompose.py.

来源信息

仓库
MaterializeInc/materialize
最近来源活动
2026年8月13日 07:19
检测到的 SKILL.md 语言
英语
星标
6,391
Forks
516

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
mz-limits-test
description
Add/modify/debug limits test. Trigger: "limits test", "Generator subclass", "many objects", "scaling test", or stress-test Materialize with many objects (tables, views, sources, indexes). Also edits in test/limits/mzcompose.py.
# Limits Test Framework The limits test stresses Materialize with large numbers of objects, complex queries, and large ingestions. It catches regressions via fixpoint panics, stack overflows, CI timeouts (O(N^M) with N~1000), and OOM panics (2GB memory limit). ## Where It Lives - **Main file**: `test/limits/mzcompose.py` - All Generator subclasses live in that single file - **Auto-discovery**: Subclasses of `Generator` are found automatically via `all_subclasses(Generator)` from `materialize.util` - no registration needed ## Generator Base Class ```python class Generator: COUNT: int = 1000 # Number of objects to create (override per test) VERSION: str = "1.0.0" # Bump when test logic changes MAX_COUNT: int | None = None # Upper limit for --find-limit mode @classmethod def body(cls) -> None: """Override this. Print testdrive commands to stdout.""" raise NotImplementedError # Convenience iterators @classmethod def all(cls) -> range: # range(1, COUNT+1) @classmethod def no_first(cls) -> range: # range(2, COUNT+1) - skip first @classmethod def no_last(cls) -> range: # range(1, COUNT) - skip last @classmethod def store_explain_and_run(cls, query: str) -> str | None: """Records EXPLAIN query for timing and prints `> {query}`.""" ``` `header()` is inherited - it resets the `public` schema and grants privileges. `footer()` prints a blank line. `generate()` calls `header()` → `body()` → `footer()`. `mz_system` is a built-in testdrive connection, so `$ postgres-execute connection=mz_system` works in `body()` without any registration. ## How to Add a New Limits Test 1. Add a new class in `test/limits/mzcompose.py` that extends `Generator`. 2. Implement the `body()` classmethod. It must `print()` testdrive commands. 3. Optionally override `COUNT` and `MAX_COUNT`, only if it's causing issues in CI. ### Minimal Template ```python class MyNewFeature(Generator): COUNT = min(Generator.COUNT, 100) # Lower if operation is slow MAX_COUNT = 800 # Optional: cap for --find-limit mode @classmethod def body(cls) -> None: # Bump system limits if needed print("$ postgres-execute connection=mz_system") print(f"ALTER SYSTEM SET max_tables = {cls.COUNT * 10};") print("$ postgres-execute connection=mz_system") print(f"ALTER SYSTEM SET max_objects_per_schema = {cls.COUNT * 10};") # Create objects for i in cls.all(): print(f"> CREATE TABLE t{i} (f1 INTEGER);") print(f"> INSERT INTO t{i} VALUES ({i});") # Query and verify for i in cls.all(): cls.store_explain_and_run(f"SELECT * FROM t{i}") print(f"{i}") ``` You can run it locally with `bin/mzcompose --find limits down && bin/mzcompose --find limits run main --scenario=MyNewFeature`, add `--find-limit` for the Release Qualification mode.
在 GitHub 查看