All checks were successful
release-tag / release-image (push) Successful in 2m30s
40 lines
1.6 KiB
Markdown
40 lines
1.6 KiB
Markdown
# SQLite startup fix
|
|
|
|
## Problem
|
|
|
|
Some installations aborted during `graph.Open` with an opaque modernc SQLite error similar to:
|
|
|
|
```text
|
|
SQL logic error: out of memory (1)
|
|
```
|
|
|
|
The original startup path applied a 64 MiB SQLite page cache, a 256 MiB mmap window and `temp_store=MEMORY` while the connection was being opened. Those settings are unnecessary because the live graph and embeddings already reside in Go memory. The DSN-based PRAGMA list also made it impossible to identify which startup step failed.
|
|
|
|
## Changes
|
|
|
|
- Open SQLite using a plain absolute filename.
|
|
- Verify that `BRAIN_DATA_DIR` exists, is a directory and is writable before opening SQLite.
|
|
- Reject a `graph.db` path that is accidentally a directory.
|
|
- Apply PRAGMAs individually with step-specific error messages.
|
|
- Use conservative storage defaults:
|
|
- `cache_size=-8192` (approximately 8 MiB)
|
|
- `mmap_size=0`
|
|
- `temp_store=FILE`
|
|
- WAL, `synchronous=NORMAL`, foreign keys and a 5-second busy timeout remain enabled.
|
|
- Persist and report the journal mode actually selected by SQLite.
|
|
- Add the dependency checksums to `go.sum` and copy both `go.mod` and `go.sum` in the Docker dependency layer.
|
|
|
|
## Recovery
|
|
|
|
Because this is a staging-only database, remove files left by a failed first start before rebuilding:
|
|
|
|
```bash
|
|
docker compose stop brain
|
|
docker compose run --rm --no-deps --entrypoint sh brain -c '
|
|
rm -f /app/data/graph.db /app/data/graph.db-wal /app/data/graph.db-shm
|
|
'
|
|
docker compose up -d --build --force-recreate brain
|
|
```
|
|
|
|
If startup still fails, the new error includes the exact phase, for example an unwritable data directory or a failed WAL configuration.
|