EigenStore reads bypass trace/replay and silently use changed live data under strict replay
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Ambito
- databases, documentation, testing-qa
Direzione di ricerca
Start in src/ext_store.c at builtin_store_open and builtin_store_get, then read docs/TRACE.md and policy precedent #148. Run the provided Python reproduction from the checkout root and inspect replay coverage around store_open and store_get. Done means the chosen store replay boundary prevents changed or newly created live data, preserves persistence, documents the boundary in docs/TRACE.md, and adds regression coverage.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
EigenStore reads are neither recorded nor refused during replay. The same program prints a different stored value after the database changes, even with EIGS_REPLAY_STRICT=1, and exits successfully without a warning.
Severity: major correctness issue for deterministic debugging. This is separate from the existing trace threading/ownership issues: the reproduction is single-threaded, uses one database handle, and needs no malformed input.
Reproduction
Confirmed from a fresh default make build of b91768e23c5a874a64e76e4af9ab291e6aa49983. Run this from that checkout's root; all database/tape files are created in a unique temporary directory:
python3 - <<'PY'
import json, os, pathlib, subprocess, tempfile
binary = str(pathlib.Path('src/eigenscript').resolve())
scratch = pathlib.Path(tempfile.mkdtemp(prefix='eigs-store-replay-'))
db = json.dumps(str(scratch / 'probe.db'))
tape = str(scratch / 'run.tape')
base = {k:v for k,v in os.environ.items() if not k.startswith('EIGS_')}
def run(source, **extra):
p = subprocess.run([binary, '-e', source], env=base | extra,
text=True, capture_output=True, timeout=10)
print(p.returncode, repr(p.stdout), repr(p.stderr))
run(f'db is store_open of {db}\nstore_put of [db, "config", {{"_id":"answer","value":10}}]\nstore_close of db\n')
reader = f'db is store_open of {db}\nr is store_get of [db, "config", "answer"]\nprint of r.value\nstore_close of db\n'
run(reader, EIGS_TRACE=tape)
run(f'db is store_open of {db}\nstore_update of [db, "config", "answer", {{"_id":"answer","value":20}}]\nstore_close of db\n')
run(reader, EIGS_REPLAY=tape, EIGS_REPLAY_STRICT='1')
print('N records:', sum(line.startswith('N ') for line in pathlib.Path(tape).read_text().splitlines()))
PY
Actual:
0 '' ''
0 '10\n' ''
0 '' ''
0 '20\n' ''
N records: 0
Expected: replay returns the recorded observation (10), or the store operation raises a clear non-replayable-boundary error before accessing live storage. Silently substituting 20 is neither outcome.
Cause and scope
src/ext_store.c opens the real database in builtin_store_open and reads its current contents in builtin_store_get; it has no trace-record/take hooks or replay refusal. docs/TRACE.md promises replayed nondeterministic inputs and explicitly refuses unsupported subprocess/channel operations, but gives EigenStore no such boundary.
EIGS_REPLAY_STRICT currently checks names on consumed N records. Here there are no N records, so enabling it cannot detect the gap. This report does not claim that strict mode promises a general program-equivalence check.
Define the store's replay boundary as a family: either support logical recorded results and handle lifetime without relying on a live database, or reject unsupported store operations during replay. Simply taping a live handle ID is not sufficient. The minimal confirmed case is store_open + store_get; adjacent queries and writes should be audited when choosing that boundary.
Regression acceptance
- Record a read, change the stored value, then replay the same program. Require recorded output or the explicit refusal, never the changed live value with exit 0.
- Cover a missing database at replay time and confirm the chosen boundary cannot silently create/use a new database.
- Preserve ordinary store persistence behavior and existing replay behavior outside the store.
- Document the boundary in
docs/TRACE.mdand add the real store case to replay coverage.
Related policy precedent: #148. No implementation change is included in this report.
- Lingua principale
- C
- Stelle
- 3
- Fork
- 7
- Merge medio
- 3h 58m
- PR unite (30g)
- 105
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di InauguralSystems/EigenScript
-
area:lint-tooling bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
InauguralSystems/EigenScript#1340 ·
I maintainer di solito rispondono entro 1 giorno
-
area:stdlib found-by:code-review kind:silent-wrong
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
InauguralSystems/EigenScript#1338 ·
I maintainer di solito rispondono entro 1 giorno
-
area:lint-tooling found-by:critic kind:docs-drift
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
InauguralSystems/EigenScript#1335 ·
I maintainer di solito rispondono entro 1 giorno
-
area:ci found-by:critic kind:gate-defect
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
InauguralSystems/EigenScript#1311 ·
I maintainer di solito rispondono entro 1 giorno
-
enrolment: decide test_gc_runner_controls.py (exempt vs enrol) and whether floors need a ratchetApertaarea:gates found-by:critic kind:decision
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
InauguralSystems/EigenScript#1280 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di InauguralSystems/EigenScript
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
johnsonjh/emu2-cpm86#68 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Zenmap CrashApertaZenmap
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
BasedHardware/omi#19306 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
fastfetch-cli/fastfetch#2619 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100