chore: add AGENTS.md, .claude lock, and 30-min sandbox soak benchmark results
ober
58907da27af310ba49f2ad14543c10acc761c08e
new file mode 100644 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"d2292307-bbeb-499c-9e06-7a2ba3e633e3","pid":34961,"procStart":"Sat May 16 20:31:35 2026","acquiredAt":1778974075662} \ No newline at end of file new file mode 100644 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,466 @@ +## The Jerboa Language — Quick Reference + +Jerboa is a Scheme dialect built on Chez Scheme. It is Gerbil-inspired but its own language. **All user-facing code is `.ss` files. Never write `.sls` files for the user** — those are internal implementation files. + +### File Structure + +Every Jerboa file looks like this: + +```scheme +(import (jerboa prelude)) ;; ONE import gives you the ENTIRE language +;; Optional extra imports for modules NOT in the prelude: +;; (import (std net request)) + +(def (my-function x y) + (+ x y)) + +(displayln (my-function 1 2)) +``` + +Run with: `scheme --libdirs lib --script file.ss` + +**NEVER** write `(library ...)` forms — that's `.sls` internal syntax. + +### Reader Syntax Extensions + +``` +[...] → plain parentheses — same as Gerbil and Chez Scheme +{method obj args} → (~ obj 'method args) — method dispatch +name: → keyword #:name +:std/sort → (std sort) — Gerbil-style module path +#<<END ... END → heredoc string +``` + +Square brackets `[...]` are interchangeable with `(...)`, exactly like Gerbil and stock Chez Scheme. You can freely use them in bindings, match clauses, and anywhere you'd use parentheses: +```scheme +;; All of these are correct: +(let ([x 1] [y 2]) (+ x y)) +(for/collect ([x (in-range 5)]) (* x x)) +(match val ([list a b] (+ a b))) +(cond [(> x 0) "positive"] [else "non-positive"]) +``` + +### CRITICAL: Things That DO NOT EXIST in Jerboa/Chez + +Claude frequently hallucinates these from Gerbil, Gambit, Racket, or R7RS training data. +**NONE of them are real in Jerboa/Chez. STOP and use the correct form.** + +#### AI Compatibility Aliases (these now work in the prelude) +The following names from other Scheme dialects are aliased in `(jerboa prelude)`: +- `hash-has-key?` → `hash-key?` (Racket) +- `hash-table-set!` → `hash-put!` (Racket) +- `directory-exists?` → `file-directory?` (Gambit) +- `eql?` → `eqv?` (Common Lisp) +- `random-integer` → `random` (Gambit) +- `read-line` → `get-line` wrapper (Gambit) — works with or without port arg +- `force-output` → `flush-output-port` wrapper (Gambit) — works with or without port arg +- `string-map` → char-level map (Racket/R7RS) — `(string-map f str)` + +#### Hallucinated Functions (still do NOT exist) +- `symbol<?` — use `(lambda (a b) (string<? (symbol->string a) (symbol->string b)))` +- `string-contains?` — use `(string-contains str sub)` (returns index or #f, NOT boolean) +- `define-struct` — use `(defstruct name (fields ...))` +- `raise` with a string — use `(error 'who "message" irritants ...)` +- `environment-bound?` — Gerbil-only. No direct Chez equivalent + +#### Gerbil/Gambit-isms (from training data — wrong in Jerboa) +- `time->seconds` — use `(time-second (current-time))` for epoch seconds +- `thread-sleep!` — Gambit. Use `(sleep (make-time 'time-duration 0 seconds))` +- `thread-yield` — no Chez equivalent. Use `(sleep (make-time 'time-duration 0 0))` as workaround +- `path-expand` with 2 args — Gerbil takes `(path-expand rel base)`. Jerboa takes 1 arg. Use `(path-join base rel)` for 2-arg version +- `process-status` — Gerbil. Use `(std misc process)` API in Jerboa +- `user-info-home` — Gerbil. Use `(getenv "HOME")` +- `the-environment` — Gerbil. Use `(interaction-environment)` in Chez +- `condition/report-string` — Gerbil. Use `(with-output-to-string (lambda () (display-condition c)))` +- `make-class-type` — Gerbil. Use `(defstruct ...)` or `(defclass ...)` in Jerboa +- `string-subst` — Gerbil. Not in prelude. Use `(string-replace str old new)` or implement manually +- `open-fd-pair` — Gambit. Does not exist in Chez; requires different API + +#### R6RS/Racket-isms (wrong variant) +- `make-equal-hashtable` — R6RS. Use `(make-hash-table)` from Jerboa prelude +- `arithmetic-shift` — Racket. Use `(bitwise-arithmetic-shift n k)` or `(ash n k)` in Chez +- `pregexp-match` — Racket. Use `(std text regex)` or `(std pregexp)` API in Jerboa + +### CRITICAL: Common Arity Mistakes + +- `(list-of? pred)` → returns a PREDICATE. It takes 1 arg. Use: `((list-of? number?) lst)` +- `(maybe pred)` → returns a PREDICATE. It takes 1 arg. Use: `((maybe string?) val)` +- `(in-range end)` or `(in-range start end)` or `(in-range start end step)` — NOT `(in-range start step end)` +- `(hash-ref ht key)` or `(hash-ref ht key default)` — NOT `(hash-ref key ht)` +- `(string-split str delimiter)` where delimiter is a CHAR: `(string-split "a,b" #\,)` +- `(make-rwlock)` — takes **0 args**, NOT `(make-rwlock 'name)` (Gerbil takes a name; Jerboa does not) +- `(path-expand path)` — takes **1 arg**, NOT `(path-expand rel base)` (Gerbil takes 2; use `path-join` for 2-arg) +- `(sort predicate list)` — Chez arg order. NOT `(sort list predicate)` which is Gerbil/SRFI order + +### Core Forms (all from `(import (jerboa prelude))`) + +#### Definitions +```scheme +(def x 42) ;; variable +(def (f x y) (+ x y)) ;; function +(def (f x (y 10)) body) ;; optional param with default +(def (f x . rest) body) ;; rest args +(def* f ((x) ...) ((x y) ...)) ;; multi-arity +(defrule (name pat) template) ;; macro +``` + +#### Data Structures +```scheme +(defstruct point (x y)) ;; → make-point, point?, point-x, point-y, point-x-set! +(defstruct (circle shape) (radius)) ;; inheritance (single only) +(defmethod (area (self circle)) body) ;; method on type +(~ obj 'method arg ...) ;; dispatch (or {method obj arg ...}) +(defrecord person (name age)) ;; struct + pretty-print + ->alist +(define-enum color (red green blue)) ;; → color-red, color?, color->name +``` + +#### Pattern Matching +```scheme +(match value + (42 "exact") ;; literal + ((list a b c) (+ a b c)) ;; list destructure + ((cons h t) h) ;; pair + ((? number?) "num") ;; predicate + ((? string? s) (string-upcase s)) ;; predicate + bind + ((and (? number?) (? positive?)) "positive number") + ((or "yes" "y") #t) + ((=> string->number n) n) ;; view pattern + (n (where (> n 0)) "positive") ;; guard + (_ "default")) ;; wildcard +``` + +#### Error Handling +```scheme +(try expr (catch (e) handler) (finally cleanup)) +(try expr (catch (error? e) handler)) +(unwind-protect body cleanup) +(with-resource (var init cleanup) body) +``` + +#### Result Type (Rust-inspired ok/err) +```scheme +(ok 42) (err "bad") (ok? r) (err? r) +(unwrap (ok 42)) ;; → 42 (raises on err) +(unwrap-or (err "x") 0) ;; → 0 +(map-ok f result) (map-err f result) +(and-then result f) ;; monadic bind +(try-result expr) ;; exceptions → (err condition) +(try-result* expr) ;; exceptions → (err "message string") +(sequence-results list-of-results) ;; → (ok list) or first (err) +(->? (ok 10) (+ 5) (* 2)) ;; → (ok 30), short-circuits on err +``` + +#### Iterators +```scheme +(for ((x (in-range 5))) (displayln x)) +(for/collect ((x (in-range 5))) (* x x)) ;; → (0 1 4 9 16) +(for/fold ((sum 0)) ((x (in-range 10))) (+ sum x)) ;; → 45 +(for/or ((x lst)) (and (pred? x) x)) ;; first truthy +(for/and ((x lst)) (pred? x)) ;; all truthy + +;; Iterators: in-list, in-vector, in-string, in-range, in-hash-keys, +;; in-hash-values, in-hash-pairs, in-naturals, in-indexed, +;; in-port, in-lines, in-chars, in-bytes, in-producer +``` + +#### Threading Macros +```scheme +(-> x (f a) (g b)) ;; thread first: (g (f x a) b) +(->> x (f a) (g b)) ;; thread last: (g b (f a x)) +(as-> x v (f v) (g v)) ;; named +(some-> x (f) (g)) ;; short-circuit on #f +(cond-> x test (f) t2 (g)) ;; conditional steps +(->? (ok x) (f) (g)) ;; result-aware thread first +``` + +#### Ergo Typing +```scheme +(: expr pred?) ;; checked cast +(using (p (make-point 1 2) : point?) + (+ p.x p.y)) ;; dot-access → (point-x p) etc. +((list-of? number?) '(1 2 3)) ;; predicate factory → #t +((maybe string?) #f) ;; accepts #f or string → #t +``` + +#### Hash Tables +```scheme +(def ht (make-hash-table)) +(hash-put! ht "key" "val") +(hash-ref ht "key") ;; error if missing +(hash-ref ht "key" "default") ;; with default +(hash-get ht "key") ;; → val or #f +(hash-key? ht "key") ;; → #t/#f +(hash-remove! ht "key") +(hash->list ht) (hash-keys ht) (hash-values ht) +(hash-for-each (lambda (k v) ...) ht) +(list->hash-table '(("a" . 1) ("b" . 2))) +``` + +#### Strings +```scheme +(string-split "a,b,c" #\,) ;; → ("a" "b" "c") NOTE: char delimiter +(string-join '("a" "b") ",") ;; → "a,b" +(string-trim " hi ") ;; → "hi" +(string-prefix? "he" "hello") ;; → #t +(string-suffix? "lo" "hello") ;; → #t +(string-contains "hello" "ell") ;; → 1 (index, not boolean!) +(string-empty? "") ;; → #t +(str "age: " 42 "!") ;; → "age: 42!" (auto-coerce) +``` + +#### Lists +```scheme +(flatten '(1 (2 (3)))) ;; → (1 2 3) +(unique '(1 2 2 3)) ;; → (1 2 3) +(take lst n) (drop lst n) (take-last lst n) (drop-last lst n) +(every pred lst) (any pred lst) (filter-map f lst) +(group-by f lst) (zip lst1 lst2) (frequencies lst) +(partition pred lst) (interleave l1 l2) (mapcat f lst) +(distinct lst) (keep f lst) (split-at lst n) +(append-map f lst) (snoc lst elem) +``` + +#### Functional Combinators +```scheme +(compose f g) (comp f g) ;; (f (g x)) +(partial f arg ...) ;; partial application +(complement pred) (negate pred) ;; logical not +(identity x) (constantly v) ;; basic combinators +(curry f arg) (flip f) ;; currying, arg swap +(conjoin p1 p2) (disjoin p1 p2) ;; predicate AND/OR +(juxt f g) ;; → (lambda (x) (list (f x) (g x))) +(cut f <> y) ;; SRFI-26 partial: (lambda (x) (f x y)) +``` + +#### JSON +```scheme +(string->json-object "{\"key\":\"val\"}") ;; → hash table +(json-object->string ht) ;; → JSON string +(read-json port) (write-json obj port) +``` + +#### CSV +```scheme +(csv->alists "name,age\nAlice,30") ;; → (((name . "Alice") (age . "30"))) +(read-csv-file "data.csv") ;; → list of row lists +(write-csv-file "out.csv" rows) +``` + +#### DateTime +```scheme +(datetime-now) (datetime-utc-now) +(make-datetime 2026 3 27 12 0 0) +(parse-datetime "2026-03-27T12:00:00Z") +(datetime->iso8601 dt) (datetime->epoch dt) +(datetime-add dt duration) (datetime-diff dt1 dt2) +(datetime<? dt1 dt2) (day-of-week dt) (leap-year? 2024) +``` + +#### Paths +```scheme +(path-join "/home" "user" "f.txt") ;; → "/home/user/f.txt" +(path-directory "/a/b/f.txt") ;; → "/a/b" +(path-extension "file.txt") ;; → "txt" +(path-absolute? "/home") ;; → #t +``` + +#### File I/O +```scheme +(read-file-string "f.txt") ;; → entire file +(read-file-lines "f.txt") ;; → list of lines +(write-file-string "f.txt" "data") +``` + +#### Pretty Printing +```scheme +(pp expr) (pp-to-string expr) (pprint expr) +``` + +#### Formatting +```scheme +(format "~a is ~a" "Alice" 30) ;; → "Alice is 30" +(printf "x = ~a\n" 42) +(displayln "hello" " " "world") +``` + +#### Anaphoric / Conditional Binding +```scheme +(awhen (find x) (use it)) ;; binds result to `it` +(aif (find x) (use it) (default)) +(when-let (x (find y)) (use x)) +(if-let (x (find y)) (use x) (default)) +``` + +#### Loops +```scheme +(while test body ...) +(until test body ...) +(dotimes (i 10) body ...) ;; 0..9 +``` + +#### Misc Sugar +```scheme +(assert! (> x 0)) (assert! (> x 0) "message") +(alist (name "Alice") (age 30)) ;; → ((name . "Alice") (age . 30)) +(let-alist data (name age) body) +``` + +### What's NOT in the Prelude (requires separate import) + +```scheme +(import (std net request)) ;; HTTP client +(import (std net httpd)) ;; HTTP server +(import (std db sqlite)) ;; SQLite +(import (std actor)) ;; Actor system +(import (std async)) ;; Async/await +(import (std crypto digest)) ;; SHA, MD5 +(import (std text regex)) ;; Regex +(import (std text xml)) ;; XML +(import (std text yaml)) ;; YAML +(import (std os env)) ;; Environment variables +(import (std os signal)) ;; Signal handling +(import (std security sandbox)) ;; Sandboxing +``` + +### Chez Scheme Conflicts (handled by prelude) + +The prelude shadows these Chez builtins with Jerboa versions: +`make-hash-table`, `hash-table?`, `sort`, `sort!`, `printf`, `fprintf`, +`path-extension`, `path-absolute?`, `with-input-from-string`, +`with-output-to-string`, `iota`, `1+`, `1-`, `partition`, +`make-date`, `make-time` + +All standard Chez Scheme is still available — the prelude just re-exports +improved versions of the above. + +--- + +## Repository Boundaries + +When working in a Jerboa project, **ONLY modify files in the current repo** unless the user explicitly names another path. + +Common sibling repos that exist but must NOT be touched without explicit instruction: +- `~/mine/jerboa-emacs` — **NEVER touch**. Another model owns it. +- `~/mine/jerboa-mcp` — Only modify when user explicitly says to work there. +- `~/mine/jerboa-shell` — Only modify when user explicitly says to work there. +- `~/mine/gerbil-mcp` — **NEVER touch**. Deprecated. +- `~/mine/gerbil-orig` — Read-only reference for upstream Gerbil. Never modify. + +If a user instruction mentions a file path, use EXACTLY that path. Do not substitute a similar-looking path from another repo. + +--- + +## Build & Verification + +After modifying any `.ss` or `.sls` (Jerboa Scheme) source files, always run the build command and fix any errors before moving on. Common issues include: missing imports, wrong function names, and duplicate definitions. + +### Stale Artifacts + +If edits seem to have no effect after `make build`, delete stale compiled files: +```bash +find lib -name "*.so" -delete && find lib -name "*.wpo" -delete && make build +``` +Run `jerboa_stale_static` to detect stale `.so` files before debugging "why doesn't my edit work?". + +## Jerboa MCP Tools — MANDATORY Usage + +Jerboa is a niche Scheme dialect with limited training data. **Never guess — always verify** with MCP tools. Tool descriptions are available at runtime via the MCP server; this section covers **when** and **why** to use each tool. + +### MANDATORY Workflow Order (for writing new code) + +1. **`jerboa_howto`** — BEFORE writing code, search cookbook for verified patterns +2. **`jerboa_module_exports`** / **`jerboa_function_signature`** — confirm APIs exist and check arities +3. Write the code +4. **`jerboa_verify`** — combined syntax + compile + lint + arity + duplicate check (use instead of individual tools) +5. **`jerboa_security_scan`** — for code involving FFI, shell commands, or file I/O + +### Essential Tools (use proactively) + +| When | Tool | +|---|---| +| Before writing ANY Jerboa code | `jerboa_howto` — cookbook has verified patterns with correct imports | +| Check what a module exports | `jerboa_module_exports` — never guess function names | +| Check function arity/args | `jerboa_function_signature` — prevents wrong-arg-count errors | +| Validate your code | `jerboa_verify` — one-stop syntax+compile+lint+arity check | +| Test expressions interactively | `jerboa_eval` — use `imports` param for modules, `env` for FFI paths | +| Persistent interactive testing | `jerboa_repl_session` — maintains state across evaluations | +| Debug an error message | `jerboa_explain_error` + `jerboa_error_fix_lookup` | +| Understand unfamiliar code | `jerboa_file_summary` + `jerboa_document_symbols` | +| Find where something is defined | `jerboa_find_definition` — source file, module, kind, arity | +| Search for symbol by substring | `jerboa_apropos` or `jerboa_smart_complete` | +| Build the project | `jerboa_build_and_report` or `jerboa_make` — prefer over bash `make` | +| Run tests | `jerboa_run_tests` — prefer over bash `scheme --script` | +| Check for stale .so artifacts | `jerboa_stale_static` — common cause of "edit has no effect" | +| Macro expansion | `jerboa_expand_macro` / `jerboa_trace_macro` | +| Inspect struct/class types | `jerboa_class_info` — fields, inheritance, constructor signature | +| FFI work | `jerboa_ffi_scaffold` / `jerboa_ffi_type_check` / `jerboa_ffi_null_safety` | +| Port Gerbil code | `jerboa_migration_check` + `jerboa_translate_scheme` | +| Detect paren imbalance | `jerboa_check_balance` — use BEFORE `make build` after deep edits | +| Full project audit | `jerboa_project_health_check` — balance, exports, cycles, duplicates | +| Security audit | `jerboa_security_audit` + `jerboa_import_policy_check` | +| Static build audit | `jerboa_static_symbol_audit` + `jerboa_boot_library_audit` | +| Explore a module | `jerboa_module_catalog` (replaces multiple `jerboa_doc` calls) | +| Look up any symbol | `jerboa_doc` — type, arity, qualified name, related symbols | +| Read stdlib source | `jerboa_stdlib_source` — see internal implementations | + +### Cookbook & Knowledge Management + +- **`jerboa_howto`** / **`jerboa_howto_get`**: Search and retrieve verified recipes +- **`jerboa_howto_add`**: Save new patterns to cookbook (MANDATORY when you discover something non-trivial) +- **`jerboa_howto_run`** / **`jerboa_howto_verify`**: Validate recipes still work +- **`jerboa_error_fix_add`**: Save error→fix mappings for common mistakes + +### Code Generation & Refactoring + +`jerboa_rename_symbol`, `jerboa_balanced_replace`, `jerboa_wrap_form`, `jerboa_splice_form`, `jerboa_scaffold_test`, `jerboa_generate_module`, `jerboa_translate_scheme`, `jerboa_project_template`, `jerboa_httpd_handler_scaffold`, `jerboa_db_pattern_scaffold`, `jerboa_actor_ensemble_scaffold` + +### Feature Suggestions + +- **`jerboa_list_features`** / **`jerboa_suggest_feature`** / **`jerboa_vote_feature`**: Track and submit tooling improvement ideas + +--- + +## MANDATORY: Save What You Learn + +Jerboa is niche — every non-trivial pattern you discover prevents future sessions from re-discovering it. + +### Save to cookbook (`jerboa_howto_add`) whenever you: +- Discover a working pattern through `jerboa_eval` or trial-and-error +- Figure out correct imports, arities, or calling conventions that weren't obvious +- Find a workaround for a Jerboa quirk or undocumented behavior + +**Before saving**: check `jerboa_howto` to avoid duplicates. **Do NOT save**: trivial one-liners, project-specific logic, or existing recipes. + +**Recipe format**: `id` (kebab-case), `tags` (4-6 search keywords incl. module name), `imports` (all required), `code` (complete working example), `notes` (gotchas/alternatives). + +### Suggest tooling improvements (`jerboa_suggest_feature`) whenever you: +- Make multiple sequential tool calls that could be one tool +- Fall back to bash because an MCP tool is missing or insufficient + +**Before suggesting**: check `jerboa_list_features`; vote with `jerboa_vote_feature` if it already exists. + +### Save Discoveries Mechanisms +- **`/save-discoveries` skill**: invoke anytime to review session and save patterns + suggestions +- **PreCompact hook**: add `PreCompact` hook with `type: "prompt"` in `.claude/settings.json` to auto-save before context compaction + +--- + +## Common Workflows + +- **Write new code**: `jerboa_howto` -> `jerboa_module_exports` -> write code -> `jerboa_verify` -> `jerboa_security_scan` +- **Debug an error**: `jerboa_explain_error` -> follow suggested tools -> `jerboa_howto` for fix patterns +- **Understand unfamiliar code**: `jerboa_file_summary` -> `jerboa_document_symbols` -> `jerboa_module_deps` +- **Refactor a module**: `jerboa_check_exports` -> `jerboa_find_callers` -> `jerboa_rename_symbol` -> `jerboa_check_import_conflicts` +- **Build project**: `jerboa_build_conflict_check` -> `jerboa_make` -> `jerboa_build_and_report` +- **Port from Gerbil**: `jerboa_migration_check` -> `jerboa_translate_scheme` -> `jerboa_verify` -> `jerboa_check_syntax` +- **Audit project quality**: `jerboa_verify` -> `jerboa_lint` -> `jerboa_dead_code` -> `jerboa_dependency_cycles` +- **Debug a crash**: `jerboa_stale_static` -> `jerboa_bisect_crash` -> `jerboa_ffi_type_check` +- **Learn a module**: `jerboa_stdlib_source` -> `jerboa_module_catalog` -> `jerboa_module_quickstart` +- **Security audit**: `jerboa_security_audit` -> `jerboa_import_policy_check` -> `jerboa_unsafe_import_lint` +- **Static build audit**: `jerboa_static_symbol_audit` -> `jerboa_boot_library_audit` -> `jerboa_rust_musl_build` +- **Safe-by-default check**: `jerboa_safe_prelude_check` -> `jerboa_resource_leak_check` -> `jerboa_safe_prelude_generate` +- **Debug editor command**: `jerboa_command_trace` with `project_path` and `buffer_type` + +## Workflow Conventions + +When implementing new features, always complete the documentation update in the same session. Document non-trivial solutions as howto recipes in the cookbook system. new file mode 100644 --- /dev/null +++ b/bench/results/fix1/soak30/sandbox-15k-30min.dnsperf.log @@ -0,0 +1,34 @@ +DNS Performance Testing Tool +Version 2.15.1 + +[Status] Command line: dnsperf -d bench/queries/mixed.txt -s 127.0.0.1 -p 5400 -Q 15000 -l 1800 -q 1000 -t 2 -S 30 -c 4 -O latency-histogram +[Status] Sending queries (to 127.0.0.1:5400) +[Status] Started at: Sat May 16 19:48:17 2026 +[Status] Stopping after 1800.000000 seconds +1778982527.682152: 14940.971297 +1778982557.682570: 14999.991000 +1778982587.684559: 15000.005500 +1778982658.308681: 6356.595838 +1778982688.310651: 15000.048330 +1778982718.312638: 15000.006500 +1778982748.314613: 14999.979168 +1778982778.316195: 15000.009000 +1778982808.298943: 14999.925957 +1778982838.295457: 14999.976331 +1778982868.296423: 15000.016999 +1778982937.802857: 6452.208439 +1778982967.806222: 15000.050828 +[Timeout] Query timed out: msg id 30640 +Warning: received a response with an unexpected (maybe timed out) id: 30640 +1778983020.204173: 8565.983811 +1778983050.206069: 15000.018665 +1778983080.207951: 14999.992334 +[Timeout] Query timed out: msg id 45079 +Warning: received a response with an unexpected (maybe timed out) id: 45079 +1778983168.225914: 5100.458869 +1778983198.227777: 15000.001833 +1778983249.387955: 8767.678643 +1778983279.389893: 14014.128021 +1778983309.389951: 14884.104557 +[Timeout] Query timed out: msg id 12799 +Warning: received a response with an unexpected (maybe timed out) id: 12799 new file mode 100644 --- /dev/null +++ b/bench/results/fix1/soak30/sandbox-15k-30min.watchdog.log @@ -0,0 +1,24 @@ +# ts elapsed rss_kb fd_count dnsperf_log_bytes server_alive +1778982527 30 51680 10 321 1 +1778982557 60 51728 10 353 1 +1778982587 90 51728 10 385 1 +1778982658 161 51728 10 417 1 +1778982688 191 51728 10 448 1 +1778982718 221 51728 10 480 1 +1778982749 252 51728 10 512 1 +1778982779 282 51728 10 544 1 +1778982809 312 51728 10 576 1 +1778982839 342 51728 10 608 1 +1778982869 372 51728 10 640 1 +1778982939 442 51728 10 672 1 +1778982969 472 51728 10 703 1 +1778983021 524 51728 10 851 1 +1778983051 554 51728 10 882 1 +1778983082 585 51728 10 914 1 +1778983170 673 51728 10 1062 1 +1778983200 703 51728 10 1093 1 +1778983251 754 37312 10 1125 1 +1778983281 784 32976 10 1156 1 +1778983311 814 32976 10 1188 1 +1778983373 876 0 0 1336 0 +# soak ended new file mode 100644 --- /dev/null +++ b/bench/results/fix1/soak30/sandbox-20k-30min.dnsperf.log @@ -0,0 +1,2560 @@ +DNS Performance Testing Tool +Version 2.15.1 + +[Status] Command line: dnsperf -d bench/queries/mixed.txt -s 127.0.0.1 -p 5400 -Q 20000 -l 1800 -q 1000 -t 2 -S 30 -c 4 -O latency-histogram +[Status] Sending queries (to 127.0.0.1:5400) +[Status] Started at: Sat May 16 18:53:29 2026 +[Status] Stopping after 1800.000000 seconds +1778979239.103946: 19999.998000 +[Timeout] Query timed out: msg id 10963 +Warning: received a response with an unexpected (maybe timed out) id: 10963 +1778979271.018767: 18744.425983 +1778979301.020151: 20000.010666 +1778979331.022126: 19999.983334 +1778979361.095519: 19906.400319 +1778979391.096850: 19999.979334 +1778979421.098860: 19999.993334 +1778979451.100840: 20000.013332 +1778979481.102793: 19999.998000 +1778979511.104763: 19999.986668 +1778979541.104868: 19999.996667 +1778979636.332626: 6154.035465 +1778979666.332949: 19999.984667 +1778979696.349959: 20000.026652 +[Timeout] Query timed out: msg id 56373 +Warning: received a response with an unexpected (maybe timed out) id: 56373 +1778979748.267548: 10691.444088 +1778979778.273746: 6349.721481 +1778979808.275577: 17342.874840 +1778979838.277844: 19999.988668 +1778979868.279998: 19999.997334 +1778979898.282131: 19999.978002 +1778979928.284264: 20000.044663 +[Timeout] Query timed out: msg id 40018 +[Timeout] Query timed out: msg id 40019 +[Timeout] Query timed out: msg id 40020 +[Timeout] Query timed out: msg id 40021 +[Timeout] Query timed out: msg id 40022 +[Timeout] Query timed out: msg id 40023 +[Timeout] Query timed out: msg id 40024 +[Timeout] Query timed out: msg id 40025 +[Timeout] Query timed out: msg id 40026 +[Timeout] Query timed out: msg id 40027 +[Timeout] Query timed out: msg id 40028 +[Timeout] Query timed out: msg id 40029 +[Timeout] Query timed out: msg id 40030 +[Timeout] Query timed out: msg id 40031 +[Timeout] Query timed out: msg id 40032 +[Timeout] Query timed out: msg id 40033 +[Timeout] Query timed out: msg id 40034 +[Timeout] Query timed out: msg id 40035 +[Timeout] Query timed out: msg id 40036 +[Timeout] Query timed out: msg id 40037 +[Timeout] Query timed out: msg id 40038 +[Timeout] Query timed out: msg id 40039 +[Timeout] Query timed out: msg id 40040 +[Timeout] Query timed out: msg id 40041 +[Timeout] Query timed out: msg id 40042 +[Timeout] Query timed out: msg id 40043 +[Timeout] Query timed out: msg id 40044 +[Timeout] Query timed out: msg id 40045 +[Timeout] Query timed out: msg id 40046 +[Timeout] Query timed out: msg id 40047 +[Timeout] Query timed out: msg id 40048 +[Timeout] Query timed out: msg id 40049 +[Timeout] Query timed out: msg id 40050 +[Timeout] Query timed out: msg id 40051 +[Timeout] Query timed out: msg id 40052 +[Timeout] Query timed out: msg id 40053 +[Timeout] Query timed out: msg id 40054 +[Timeout] Query timed out: msg id 40055 +[Timeout] Query timed out: msg id 40056 +[Timeout] Query timed out: msg id 40057 +[Timeout] Query timed out: msg id 40058 +[Timeout] Query timed out: msg id 40059 +[Timeout] Query timed out: msg id 40060 +[Timeout] Query timed out: msg id 40061 +[Timeout] Query timed out: msg id 40062 +[Timeout] Query timed out: msg id 40063 +[Timeout] Query timed out: msg id 40064 +[Timeout] Query timed out: msg id 40065 +[Timeout] Query timed out: msg id 40066 +[Timeout] Query timed out: msg id 40067 +[Timeout] Query timed out: msg id 40068 +[Timeout] Query timed out: msg id 40069 +[Timeout] Query timed out: msg id 40070 +[Timeout] Query timed out: msg id 40071 +[Timeout] Query timed out: msg id 40072 +[Timeout] Query timed out: msg id 40073 +[Timeout] Query timed out: msg id 40074 +[Timeout] Query timed out: msg id 40075 +[Timeout] Query timed out: msg id 40076 +[Timeout] Query timed out: msg id 40077 +[Timeout] Query timed out: msg id 40078 +[Timeout] Query timed out: msg id 40079 +[Timeout] Query timed out: msg id 40080 +[Timeout] Query timed out: msg id 40081 +[Timeout] Query timed out: msg id 40082 +[Timeout] Query timed out: msg id 40083 +[Timeout] Query timed out: msg id 40084 +[Timeout] Query timed out: msg id 40085 +[Timeout] Query timed out: msg id 40086 +[Timeout] Query timed out: msg id 40087 +[Timeout] Query timed out: msg id 40088 +[Timeout] Query timed out: msg id 40089 +[Timeout] Query timed out: msg id 40090 +[Timeout] Query timed out: msg id 40091 +[Timeout] Query timed out: msg id 40092 +[Timeout] Query timed out: msg id 40093 +[Timeout] Query timed out: msg id 40094 +[Timeout] Query timed out: msg id 40095 +[Timeout] Query timed out: msg id 40096 +[Timeout] Query timed out: msg id 40097 +[Timeout] Query timed out: msg id 40098 +[Timeout] Query timed out: msg id 40099 +[Timeout] Query timed out: msg id 40100 +[Timeout] Query timed out: msg id 40101 +[Timeout] Query timed out: msg id 40102 +[Timeout] Query timed out: msg id 40103 +[Timeout] Query timed out: msg id 40104 +[Timeout] Query timed out: msg id 40105 +[Timeout] Query timed out: msg id 40106 +[Timeout] Query timed out: msg id 40107 +[Timeout] Query timed out: msg id 40108 +[Timeout] Query timed out: msg id 40109 +[Timeout] Query timed out: msg id 40110 +[Timeout] Query timed out: msg id 40111 +[Timeout] Query timed out: msg id 40112 +[Timeout] Query timed out: msg id 40113 +[Timeout] Query timed out: msg id 40114 +[Timeout] Query timed out: msg id 40115 +[Timeout] Query timed out: msg id 40116 +[Timeout] Query timed out: msg id 40117 +[Timeout] Query timed out: msg id 40118 +[Timeout] Query timed out: msg id 40119 +[Timeout] Query timed out: msg id 40120 +[Timeout] Query timed out: msg id 40121 +[Timeout] Query timed out: msg id 40122 +[Timeout] Query timed out: msg id 40123 +[Timeout] Query timed out: msg id 40124 +[Timeout] Query timed out: msg id 40125 +[Timeout] Query timed out: msg id 40126 +[Timeout] Query timed out: msg id 40127 +[Timeout] Query timed out: msg id 40128 +[Timeout] Query timed out: msg id 40129 +[Timeout] Query timed out: msg id 40130 +[Timeout] Query timed out: msg id 40131 +[Timeout] Query timed out: msg id 40132 +[Timeout] Query timed out: msg id 40133 +[Timeout] Query timed out: msg id 40134 +[Timeout] Query timed out: msg id 40135 +[Timeout] Query timed out: msg id 40136 +[Timeout] Query timed out: msg id 40137 +[Timeout] Query timed out: msg id 40138 +[Timeout] Query timed out: msg id 40139 +[Timeout] Query timed out: msg id 40140 +[Timeout] Query timed out: msg id 40141 +[Timeout] Query timed out: msg id 40142 +[Timeout] Query timed out: msg id 40143 +[Timeout] Query timed out: msg id 40144 +[Timeout] Query timed out: msg id 40145 +[Timeout] Query timed out: msg id 40146 +[Timeout] Query timed out: msg id 40147 +[Timeout] Query timed out: msg id 40148 +[Timeout] Query timed out: msg id 40149 +[Timeout] Query timed out: msg id 40150 +[Timeout] Query timed out: msg id 40151 +[Timeout] Query timed out: msg id 40152 +[Timeout] Query timed out: msg id 40153 +[Timeout] Query timed out: msg id 40154 +[Timeout] Query timed out: msg id 40155 +[Timeout] Query timed out: msg id 40156 +[Timeout] Query timed out: msg id 40157 +[Timeout] Query timed out: msg id 40158 +[Timeout] Query timed out: msg id 40159 +[Timeout] Query timed out: msg id 40160 +[Timeout] Query timed out: msg id 40161 +[Timeout] Query timed out: msg id 40162 +[Timeout] Query timed out: msg id 40163 +[Timeout] Query timed out: msg id 40164 +[Timeout] Query timed out: msg id 40165 +[Timeout] Query timed out: msg id 40166 +[Timeout] Query timed out: msg id 40167 +[Timeout] Query timed out: msg id 40168 +[Timeout] Query timed out: msg id 40169 +[Timeout] Query timed out: msg id 40170 +[Timeout] Query timed out: msg id 40171 +[Timeout] Query timed out: msg id 40172 +[Timeout] Query timed out: msg id 40173 +[Timeout] Query timed out: msg id 40174 +[Timeout] Query timed out: msg id 40175 +[Timeout] Query timed out: msg id 40176 +[Timeout] Query timed out: msg id 40177 +[Timeout] Query timed out: msg id 40178 +[Timeout] Query timed out: msg id 40179 +[Timeout] Query timed out: msg id 40180 +[Timeout] Query timed out: msg id 40181 +[Timeout] Query timed out: msg id 40182 +[Timeout] Query timed out: msg id 40183 +[Timeout] Query timed out: msg id 40184 +[Timeout] Query timed out: msg id 40185 +[Timeout] Query timed out: msg id 40186 +[Timeout] Query timed out: msg id 40187 +[Timeout] Query timed out: msg id 40188 +[Timeout] Query timed out: msg id 40189 +[Timeout] Query timed out: msg id 40190 +[Timeout] Query timed out: msg id 40191 +[Timeout] Query timed out: msg id 40192 +[Timeout] Query timed out: msg id 40193 +[Timeout] Query timed out: msg id 40194 +[Timeout] Query timed out: msg id 40195 +[Timeout] Query timed out: msg id 40196 +[Timeout] Query timed out: msg id 40197 +[Timeout] Query timed out: msg id 40198 +[Timeout] Query timed out: msg id 40199 +[Timeout] Query timed out: msg id 40200 +[Timeout] Query timed out: msg id 40201 +[Timeout] Query timed out: msg id 40202 +[Timeout] Query timed out: msg id 40203 +[Timeout] Query timed out: msg id 40204 +[Timeout] Query timed out: msg id 40205 +[Timeout] Query timed out: msg id 40206 +[Timeout] Query timed out: msg id 40207 +[Timeout] Query timed out: msg id 40208 +[Timeout] Query timed out: msg id 40209 +[Timeout] Query timed out: msg id 40210 +[Timeout] Query timed out: msg id 40211 +[Timeout] Query timed out: msg id 40212 +[Timeout] Query timed out: msg id 40213 +[Timeout] Query timed out: msg id 40214 +[Timeout] Query timed out: msg id 40215 +[Timeout] Query timed out: msg id 40216 +[Timeout] Query timed out: msg id 40217 +[Timeout] Query timed out: msg id 40218 +[Timeout] Query timed out: msg id 40219 +[Timeout] Query timed out: msg id 40220 +[Timeout] Query timed out: msg id 40221 +[Timeout] Query timed out: msg id 40222 +[Timeout] Query timed out: msg id 40223 +[Timeout] Query timed out: msg id 40224 +[Timeout] Query timed out: msg id 40225 +[Timeout] Query timed out: msg id 40226 +[Timeout] Query timed out: msg id 40227 +[Timeout] Query timed out: msg id 40228 +[Timeout] Query timed out: msg id 40229 +[Timeout] Query timed out: msg id 40230 +[Timeout] Query timed out: msg id 40231 +[Timeout] Query timed out: msg id 40232 +[Timeout] Query timed out: msg id 40233 +[Timeout] Query timed out: msg id 40234 +[Timeout] Query timed out: msg id 40235 +[Timeout] Query timed out: msg id 40236 +[Timeout] Query timed out: msg id 40237 +[Timeout] Query timed out: msg id 40238 +[Timeout] Query timed out: msg id 40239 +[Timeout] Query timed out: msg id 40240 +[Timeout] Query timed out: msg id 40241 +[Timeout] Query timed out: msg id 40242 +[Timeout] Query timed out: msg id 40243 +[Timeout] Query timed out: msg id 40244 +[Timeout] Query timed out: msg id 40245 +[Timeout] Query timed out: msg id 40246 +[Timeout] Query timed out: msg id 40247 +[Timeout] Query timed out: msg id 40248 +[Timeout] Query timed out: msg id 40249 +[Timeout] Query timed out: msg id 40250 +[Timeout] Query timed out: msg id 40251 +[Timeout] Query timed out: msg id 40252 +[Timeout] Query timed out: msg id 40253 +[Timeout] Query timed out: msg id 40254 +[Timeout] Query timed out: msg id 40255 +[Timeout] Query timed out: msg id 40256 +[Timeout] Query timed out: msg id 40257 +[Timeout] Query timed out: msg id 40258 +[Timeout] Query timed out: msg id 40259 +[Timeout] Query timed out: msg id 40260 +[Timeout] Query timed out: msg id 40261 +[Timeout] Query timed out: msg id 40262 +[Timeout] Query timed out: msg id 40263 +[Timeout] Query timed out: msg id 40264 +[Timeout] Query timed out: msg id 40265 +[Timeout] Query timed out: msg id 40266 +[Timeout] Query timed out: msg id 40267 +[Timeout] Query timed out: msg id 40268 +[Timeout] Query timed out: msg id 40269 +[Timeout] Query timed out: msg id 40270 +[Timeout] Query timed out: msg id 40271 +[Timeout] Query timed out: msg id 40272 +[Timeout] Query timed out: msg id 40273 +[Timeout] Query timed out: msg id 40274 +[Timeout] Query timed out: msg id 40275 +[Timeout] Query timed out: msg id 40276 +[Timeout] Query timed out: msg id 40277 +[Timeout] Query timed out: msg id 40278 +[Timeout] Query timed out: msg id 40279 +[Timeout] Query timed out: msg id 40280 +[Timeout] Query timed out: msg id 40281 +[Timeout] Query timed out: msg id 40282 +[Timeout] Query timed out: msg id 40283 +[Timeout] Query timed out: msg id 40284 +[Timeout] Query timed out: msg id 40285 +[Timeout] Query timed out: msg id 40286 +[Timeout] Query timed out: msg id 40287 +[Timeout] Query timed out: msg id 40288 +[Timeout] Query timed out: msg id 40289 +[Timeout] Query timed out: msg id 40290 +[Timeout] Query timed out: msg id 40291 +[Timeout] Query timed out: msg id 40292 +[Timeout] Query timed out: msg id 40293 +[Timeout] Query timed out: msg id 40294 +[Timeout] Query timed out: msg id 40295 +[Timeout] Query timed out: msg id 40296 +[Timeout] Query timed out: msg id 40297 +[Timeout] Query timed out: msg id 40298 +[Timeout] Query timed out: msg id 40299 +[Timeout] Query timed out: msg id 40300 +[Timeout] Query timed out: msg id 40301 +[Timeout] Query timed out: msg id 40302 +[Timeout] Query timed out: msg id 40303 +[Timeout] Query timed out: msg id 40304 +[Timeout] Query timed out: msg id 40305 +[Timeout] Query timed out: msg id 40306 +[Timeout] Query timed out: msg id 40307 +[Timeout] Query timed out: msg id 40308 +[Timeout] Query timed out: msg id 40309 +[Timeout] Query timed out: msg id 40310 +[Timeout] Query timed out: msg id 40311 +[Timeout] Query timed out: msg id 40312 +[Timeout] Query timed out: msg id 40313 +[Timeout] Query timed out: msg id 40314 +[Timeout] Query timed out: msg id 40315 +[Timeout] Query timed out: msg id 40316 +[Timeout] Query timed out: msg id 40317 +[Timeout] Query timed out: msg id 40318 +[Timeout] Query timed out: msg id 40319 +[Timeout] Query timed out: msg id 40320 +[Timeout] Query timed out: msg id 40321 +[Timeout] Query timed out: msg id 40322 +[Timeout] Query timed out: msg id 40323 +[Timeout] Query timed out: msg id 40324 +[Timeout] Query timed out: msg id 40325 +[Timeout] Query timed out: msg id 40326 +[Timeout] Query timed out: msg id 40327 +[Timeout] Query timed out: msg id 40328 +[Timeout] Query timed out: msg id 40329 +[Timeout] Query timed out: msg id 40330 +[Timeout] Query timed out: msg id 40331 +[Timeout] Query timed out: msg id 40332 +[Timeout] Query timed out: msg id 40333 +[Timeout] Query timed out: msg id 40334 +[Timeout] Query timed out: msg id 40335 +[Timeout] Query timed out: msg id 40336 +[Timeout] Query timed out: msg id 40337 +[Timeout] Query timed out: msg id 40338 +[Timeout] Query timed out: msg id 40339 +[Timeout] Query timed out: msg id 40340 +[Timeout] Query timed out: msg id 40341 +[Timeout] Query timed out: msg id 40342 +[Timeout] Query timed out: msg id 40343 +[Timeout] Query timed out: msg id 40344 +[Timeout] Query timed out: msg id 40345 +[Timeout] Query timed out: msg id 40346 +[Timeout] Query timed out: msg id 40347 +[Timeout] Query timed out: msg id 40348 +[Timeout] Query timed out: msg id 40349 +[Timeout] Query timed out: msg id 40350 +[Timeout] Query timed out: msg id 40351 +[Timeout] Query timed out: msg id 40352 +[Timeout] Query timed out: msg id 40353 +[Timeout] Query timed out: msg id 40354 +[Timeout] Query timed out: msg id 40355 +[Timeout] Query timed out: msg id 40356 +[Timeout] Query timed out: msg id 40357 +[Timeout] Query timed out: msg id 40358 +[Timeout] Query timed out: msg id 40359 +[Timeout] Query timed out: msg id 40360 +[Timeout] Query timed out: msg id 40361 +[Timeout] Query timed out: msg id 40362 +[Timeout] Query timed out: msg id 40363 +[Timeout] Query timed out: msg id 40364 +[Timeout] Query timed out: msg id 40365 +[Timeout] Query timed out: msg id 40366 +[Timeout] Query timed out: msg id 40367 +[Timeout] Query timed out: msg id 40368 +[Timeout] Query timed out: msg id 40369 +[Timeout] Query timed out: msg id 40370 +[Timeout] Query timed out: msg id 40371 +[Timeout] Query timed out: msg id 40372 +[Timeout] Query timed out: msg id 40373 +[Timeout] Query timed out: msg id 40374 +[Timeout] Query timed out: msg id 40375 +[Timeout] Query timed out: msg id 40376 +[Timeout] Query timed out: msg id 40377 +[Timeout] Query timed out: msg id 40378 +[Timeout] Query timed out: msg id 40379 +[Timeout] Query timed out: msg id 40380 +[Timeout] Query timed out: msg id 40381 +[Timeout] Query timed out: msg id 40382 +[Timeout] Query timed out: msg id 40383 +[Timeout] Query timed out: msg id 40384 +[Timeout] Query timed out: msg id 40385 +[Timeout] Query timed out: msg id 40386 +[Timeout] Query timed out: msg id 40387 +[Timeout] Query timed out: msg id 40388 +[Timeout] Query timed out: msg id 40389 +[Timeout] Query timed out: msg id 40390 +[Timeout] Query timed out: msg id 40391 +[Timeout] Query timed out: msg id 40392 +[Timeout] Query timed out: msg id 40393 +[Timeout] Query timed out: msg id 40394 +[Timeout] Query timed out: msg id 40395 +[Timeout] Query timed out: msg id 40396 +[Timeout] Query timed out: msg id 40397 +[Timeout] Query timed out: msg id 40398 +[Timeout] Query timed out: msg id 40399 +[Timeout] Query timed out: msg id 40400 +[Timeout] Query timed out: msg id 40401 +[Timeout] Query timed out: msg id 40402 +[Timeout] Query timed out: msg id 40403 +[Timeout] Query timed out: msg id 40404 +[Timeout] Query timed out: msg id 40405 +[Timeout] Query timed out: msg id 40406 +[Timeout] Query timed out: msg id 40407 +[Timeout] Query timed out: msg id 40408 +[Timeout] Query timed out: msg id 40409 +[Timeout] Query timed out: msg id 40410 +[Timeout] Query timed out: msg id 40411 +[Timeout] Query timed out: msg id 40412 +[Timeout] Query timed out: msg id 40413 +[Timeout] Query timed out: msg id 40414 +[Timeout] Query timed out: msg id 40415 +[Timeout] Query timed out: msg id 40416 +[Timeout] Query timed out: msg id 40417 +[Timeout] Query timed out: msg id 40418 +[Timeout] Query timed out: msg id 40419 +[Timeout] Query timed out: msg id 40420 +[Timeout] Query timed out: msg id 40421 +[Timeout] Query timed out: msg id 40422 +[Timeout] Query timed out: msg id 40423 +[Timeout] Query timed out: msg id 40424 +[Timeout] Query timed out: msg id 40425 +[Timeout] Query timed out: msg id 40426 +[Timeout] Query timed out: msg id 40427 +[Timeout] Query timed out: msg id 40428 +[Timeout] Query timed out: msg id 40429 +[Timeout] Query timed out: msg id 40430 +[Timeout] Query timed out: msg id 40431 +[Timeout] Query timed out: msg id 40432 +[Timeout] Query timed out: msg id 40433 +[Timeout] Query timed out: msg id 40434 +[Timeout] Query timed out: msg id 40435 +[Timeout] Query timed out: msg id 40436 +[Timeout] Query timed out: msg id 40437 +[Timeout] Query timed out: msg id 40438 +[Timeout] Query timed out: msg id 40439 +[Timeout] Query timed out: msg id 40440 +[Timeout] Query timed out: msg id 40441 +[Timeout] Query timed out: msg id 40442 +[Timeout] Query timed out: msg id 40443 +[Timeout] Query timed out: msg id 40444 +[Timeout] Query timed out: msg id 40445 +[Timeout] Query timed out: msg id 40446 +[Timeout] Query timed out: msg id 40447 +[Timeout] Query timed out: msg id 40448