import os, sys, time, threading, traceback, sqlite3 from pathlib import Path os.environ.setdefault("SYSTEM", "spaces") from trackio.sqlite_storage import SQLiteStorage DB_DIR = Path(os.environ["TRACKIO_DIR"]); DB_DIR.mkdir(parents=True, exist_ok=True) PROJECT = "bugtest"; N_THREADS = 8; N_LOGS = 200 errors = []; elock = threading.Lock(); done = [0]*N_THREADS def writer(tid): for i in range(N_LOGS): try: SQLiteStorage.log(project=PROJECT, run=f"run-{tid}", metrics={"x":i,"thread":tid}, step=i) done[tid] += 1 except Exception as e: with elock: errors.append((tid,i,repr(e))) t0 = time.time() threads = [threading.Thread(target=writer, args=(i,)) for i in range(N_THREADS)] for t in threads: t.start() for t in threads: t.join() dt = time.time() - t0 print(f"dt={dt:.2f}s done={done} errors={len(errors)}") for e in errors[:5]: print(f" T{e[0]}@{e[1]}: {e[2]}") dbp = SQLiteStorage.get_project_db_path(PROJECT) print(f"db_path={dbp} size={os.path.getsize(dbp)}") c = sqlite3.connect(str(dbp)) integ = [r[0] for r in c.execute("PRAGMA integrity_check").fetchall()] print(f"integrity: {integ}") for run, n in c.execute("SELECT run_name, COUNT(*) FROM metrics GROUP BY run_name ORDER BY run_name").fetchall(): print(f" {run}: {n} rows") (total,) = c.execute("SELECT COUNT(*) FROM metrics").fetchone() exp = N_THREADS * N_LOGS print(f"total_rows={total} expected={exp}") ok = not errors and total == exp and integ == ["ok"] print(f"RESULT: {'PASS' if ok else 'FAIL'}")