@@ -0,0 +1,39 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user