Token导航 LogoToken导航TokenDH.com
研究检索敏感数据github未标认证来源可访问许可证需确认审计通过

cubrid-isolation-test幼虫隔离试验

Agent Skill

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

总安装

198

周安装

8

GitHub Stars

2

下载量

62
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:cubrid-isolation-test(幼虫隔离试验)
来源仓库:https://github.com/vimkim/my-cubrid-skills
仓库路径:skills/cubrid-isolation-test
安装命令:
npx skills add https://github.com/vimkim/my-cubrid-skills --skill cubrid-isolation-test
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/vimkim/my-cubrid-skills --skill cubrid-isolation-test

简介

cubrid-isolation-test 创建 .ctl 隔离测试用例,验证 MVCC 可见性与锁冲突行为。

  • 适用于事务存储层开发与并发访问场景的功能验证需求。
  • 通过 qactl/qacsql 工具实现确定性多客户端调度,覆盖典型隔离级别组合。
  • 通过 npx skills add 安装,需熟悉 CTP 测试框架约定与测试语言语法。
  • 测试脚本应置于特定目录并由 CI 系统集成执行,避免本地误触发。

SKILL.md

CUBRID Isolation Test Creator & Runner

Create .ctl isolation tests that verify MVCC visibility, lock conflicts, and concurrent transaction behavior using CUBRID's CTP isolation test framework. Tests are run via the qactl/qacsql tools with deterministic multi-client orchestration.

When to Use

  • User asks to test isolation, concurrency, MVCC, or locking behavior
  • User mentions "isolation test", ".ctl test", "concurrent access test"
  • After implementing a storage/transaction feature that affects multi-session behavior
  • When verifying MVCC snapshot visibility for a feature (e.g., OOS, overflow, new column types)

$ARGUMENTS

Prerequisites

  • $CUBRID environment variable must point to a CUBRID install directory
  • CTP tools at ~/cubrid-testtools/CTP/isolation/ctltool/
  • Test case repository at ~/cubrid-testcases/isolation/

Step 0: Build CTP Isolation Tools (if needed)

Check if qacsql and qactl binaries exist. If not, build them:

cd ~/cubrid-testtools/CTP/isolation/ctltool
make clean && make
chmod +x timeout3.sh runone.sh prepare.sh clean.sh

These binaries link against $CUBRID/lib/libcubridcs, so they must be rebuilt if the CUBRID install changes.

Step 1: Prepare Test Database

The isolation framework uses a database called ctldb:

cd ~/cubrid-testtools/CTP/isolation/ctltool
sh prepare.sh qacsql ctldb log

This creates a fresh ctldb database, starts the server, and rebuilds tools if needed. The prepare.sh script kills existing CUBRID processes, so warn the user if other databases are running.

Step 2: Understand the Feature

  • If a CBRD ticket is mentioned, use /jira to fetch context
  • If working on OOS, use /cubrid-oos-context to load OOS knowledge
  • Read the relevant source code to understand what concurrency scenarios to test
  • Identify the key MVCC/locking behaviors to verify

Step 3: Design Test Scenarios

For any feature that stores/modifies data, design tests covering these categories:

Required scenarios (pick what applies):

  1. MVCC UPDATE visibility: Session 1 updates (uncommitted), Session 2 sees old value
  2. MVCC DELETE visibility: Session 1 deletes (uncommitted), Session 2 still sees row
  3. UPDATE lock conflict: Two sessions update same row — C2 blocks until C1 commits
  4. Concurrent UPDATE different rows: Two sessions update different rows — no blocking
  5. REPEATABLE READ snapshot: C2 snapshot preserved even after C1 commits

Optional advanced scenarios:

  1. Multi-chunk/large value visibility: Large values spanning multiple pages
  2. INSERT + DELETE interleaving: Phantom read prevention
  3. DDL + DML concurrency: Schema changes during active DML
  4. Deadlock detection: Two sessions acquiring locks in reverse order

Step 4: Write.ctl Files

.ctl File Format

The .ctl format orchestrates multiple csql client sessions:

/* Header comment describing the test */
MC: setup NUM_CLIENTS = 2;

C1: set transaction lock timeout INFINITE;
C1: set transaction isolation level read committed;

C2: set transaction lock timeout INFINITE;
C2: set transaction isolation level read committed;

/* preparation */
C1: drop table if exists t;
C1: create table t(id int primary key, col1 BIT VARYING);
C1: insert into t values (1, CAST(REPEAT('AA', 1700) AS BIT VARYING));
C1: commit work;
MC: wait until C1 ready;

/* test case */
C1: update t set col1 = CAST(REPEAT('BB', 1700) AS BIT VARYING) where id = 1;
MC: wait until C1 ready;

/* C2 should see OLD value */
C2: select id, DISK_SIZE(col1), (col1 = CAST(REPEAT('AA', 1700) AS BIT VARYING)) from t where id = 1;
MC: wait until C2 ready;

C1: commit;
MC: wait until C1 ready;

C2: commit;
C1: quit;
C2: quit;

Key.ctl Commands

CommandPurpose
MC: setup NUM_CLIENTS = NInitialize N client sessions
MC: wait until C1 readyWait for C1 to finish current command
MC: wait until C2 blockedWait for C2 to be blocked on a lock
MC: sleep NSleep N seconds
C1: <SQL>Execute SQL on client 1
C1: commit / C1: rollbackTransaction control
C1: quitClose client session

Data Type Rules

  • Use BIT VARYING (VARBIT) for large columns, NOT VARCHAR — CUBRID compresses strings, making disk size unpredictable
  • Pattern: CAST(REPEAT('AA', N) AS BIT VARYING) produces N bytes on disk
  • Use DISK_SIZE() to verify column size (not LENGTH which returns bits for VARBIT)
  • Use different hex patterns ('AA', 'BB', 'CC') to distinguish values between sessions
  • Verify value equality with (col = CAST(REPEAT('XX', N) AS BIT VARYING)) which returns 1 (true) or 0 (false)

OOS-Specific Rules (when testing OOS features)

  • OOS trigger: record > DB_PAGESIZE/8 (2KB on 16KB pages) AND column > 512B
  • Use 1700-byte VARBIT values to trigger OOS (well above 512B threshold, record > 2KB)
  • For multi-chunk OOS: use 20000+ byte VARBIT values (spans multiple OOS pages)
  • DISK_SIZE overhead: typically 8 bytes over the raw data size

File Location Convention

Place test files based on isolation level and category:

cubrid-testcases/isolation/
├── _01_ReadCommitted/issues/<jira_id>_<feature>/
│   ├── <test_name>.ctl
│   └── answer/<test_name>.answer
├── _02_RepeatableRead/issues/<jira_id>_<feature>/
│   ├── <test_name>.ctl
│   └── answer/<test_name>.answer
├── _04_RepeatableRead_ReadCommitted/  (mixed isolation)
└── _05_ReadCommitted_RepeatableRead/  (mixed isolation)

Naming: <feature>_<scenario>_NN.ctl (e.g., oos_update_visibility_01.ctl)

Step 5: Run Tests and Capture Answers

First run (no answer file yet)

cd ~/cubrid-testtools/CTP/isolation/ctltool
sh runone.sh /path/to/<test>.ctl 120

The test will report NOK (no answer file). Check the result:

cat /path/to/result/<test>.log

Verify the output is correct

Analyze the .log output:

  • Check row counts match expectations
  • Check value equality columns (should be 1 for true)
  • Check DISK_SIZE values are reasonable
  • Verify blocking behavior occurred where expected (no timeout)

Create answer file from verified output

IMPORTANT: Copy the exact .log file — do NOT manually create the answer file:

cp /path/to/result/<test>.log /path/to/answer/<test>.answer

The framework does an exact diff between .log and .answer, so even whitespace differences cause failure.

Verify test passes with answer file

sh runone.sh /path/to/<test>.ctl 120

Should now report flag: OK.

Step 6: Run All Tests

After all tests are created and have answer files, verify them all:

cd ~/cubrid-testtools/CTP/isolation/ctltool
for ctl in /path/to/test_dir/*.ctl; do
  echo "=== $(basename $ctl) ==="
  sh runone.sh "$ctl" 120 2>&1 | grep -E "flag:"
done

All tests must show flag: OK.

Step 7: Summary

Present results in this format:

TestScenarioIsolationResult
<name>What it testsRC/RROK/NOK

Include:

  • Total pass/fail count
  • Any unexpected behaviors discovered
  • Files created (.ctl + .answer paths)

Troubleshooting

Exit code 126 on first run

Permission issue. Run:

chmod +x ~/cubrid-testtools/CTP/isolation/ctltool/*.sh

"ctldb is unknown" error

Database doesn't exist. Run prepare.sh again.

Test hangs / timeout

  • Check if CUBRID server is still running: cubrid server status
  • Lock timeout is INFINITE — a deadlock or missed wait until can hang forever
  • Use shorter timeout in runone.sh (e.g., 60 instead of 120)
  • Check for MC: wait until C2 blocked on operations that don't actually block

DISK_SIZE returns unexpected values

  • VARCHAR is compressed — switch to BIT VARYING
  • VARBIT DISK_SIZE includes small overhead (typically 8 bytes)

"find: CUBRID/log: No such file or directory"

Harmless warning from runone.sh cleanup. The ~/CUBRID/log path is hardcoded in the script but your install may be elsewhere. Does not affect test results.

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

35.05%
按下载量换算22

Claude

30.15%
按下载量换算19

Cursor

19.81%
按下载量换算12

Gemini CLI

9.72%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills