From be1fd23bfce85c1ac16e1221a53c6050cf45ca76 Mon Sep 17 00:00:00 2001 From: sneak Date: Tue, 29 Sep 2026 03:11:03 +0000 Subject: [PATCH 1/4] README: license and author up front; bring TODO.md up to date (closes #38) REPO_POLICIES.md asks the README's first line to name the license and the author, and for License and Author sections; the README had neither up front, its License section only said "See LICENSE file.", and it had no Author section. TODO.md's Status, Next Step and Future Steps still described the unmerged repo-policies-compliance branch and a missing CI workflow. They now say what is true of next, and Completed Steps gains a line for each issue that landed from 2026-09-21 on without one. The next step is not decided, and Next Step says so. Model: opus-5-5 --- README.md | 11 +++++++++-- TODO.md | 58 +++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e1cddf5..6204266 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # RouteWatch -RouteWatch is a real-time BGP routing table monitor that streams BGP UPDATE messages from the RIPE RIS Live service, maintains a live routing table in SQLite, and provides HTTP APIs for querying routing information. +RouteWatch is an MIT-licensed Go daemon by @sneak that monitors the BGP routing +table in real time: it streams BGP UPDATE messages from the RIPE RIS Live +service, maintains a live routing table in SQLite, and provides HTTP APIs for +querying routing information. ## Features @@ -299,4 +302,8 @@ invoke `go test` directly without `-short`: ## License -See LICENSE file. +MIT. See [`LICENSE`](LICENSE). + +## Author + +[@sneak](https://sneak.berlin) diff --git a/TODO.md b/TODO.md index 70ef510..01ee428 100644 --- a/TODO.md +++ b/TODO.md @@ -10,19 +10,24 @@ # Status -pre-1.0. No git tags. Runs in production-style Docker deployment, but -the policy compliance branch (repo-policies-compliance, make check -passing, clean tree) is unmerged to main and the CI workflow is missing. +pre-1.0. No git tags. The Docker build runs the format check, the linter +and the tests, and the Gitea workflow runs that build on every push. The +image sets memory ceilings for a 5 GiB container (README "Memory") and the +README says how to run it under upaas (README "Running under upaas"). A +35-hour run of `3898daa` on the live feed peaked at about 1 GiB, without a +container memory limit. # Next Step -Merge repo-policies-compliance into main (3 commits: policy files and -.gitignore, Makefile targets fmt-check/check/docker/hooks, gofmt pass), -then add .gitea/workflows/check.yml as a small follow-up commit so CI -runs make check on main. +Not decided. Nothing on the tracker orders the open issues under Future +Steps. # Completed Steps +- 2026-09-29: README first line names the MIT license and the author, + with new License and Author sections; this file brought up to date + (closes #38) +- 2026-09-29: MIT `LICENSE` (closes #1) - 2026-09-28: stopping the daemon while the feed is flowing no longer panics with "send on closed channel": the read loop checks for a stop just before handing a message to the handler queues, and a second @@ -40,6 +45,33 @@ runs make check on main. startup and adjusted on every write, oldest/newest route timestamps via index-end lookups; `/api/v1/stats` no longer scans the tables (closes #27) +- 2026-09-21: batch writes take the write lock when their transaction + begins (`_txlock=immediate`), so they wait out a WAL checkpoint instead + of failing with "database is locked" (closes #25) +- 2026-09-21: `MALLOC_ARENA_MAX=2` in the image caps glibc malloc arenas, + so memory outside the Go runtime no longer grows with the core count + (closes #23) +- 2026-09-21: `GOMEMLIMIT=1536MiB` in the image; README Memory section + with the memory budget and the 5 GiB container limit (closes #13) +- 2026-09-21: the four handler queues hold at most 20,000 messages each, + down from 100,000 (closes #11) +- 2026-09-21: two goroutine leaks fixed: the stats handlers after a + timeout and the streamer's tickers on every reconnect (closes #12) +- 2026-09-21: parsed RIS messages no longer keep the unused `Community` + and `Raw` fields (closes #9) +- 2026-09-21: `.editorconfig`, and a Gitea workflow that runs + `script/cibuild` on every push (closes #14) +- 2026-09-21: the peering handler's AS-path map holds at most 500,000 + paths and is swapped for an empty one every 30 seconds instead of copied + (closes #10) +- 2026-09-21: SQLite memory bounded across the whole connection pool: a + 64 MiB page cache on each connection, 1 GiB soft and 1.5 GiB hard heap + limits (closes #8) +- 2026-09-21: the Docker build runs the format check, the linter and the + tests, linting in a separate stage on a golangci-lint image pinned by + digest (closes #5) +- 2026-09-21: `make test` skips the live-network feed test (`-short`), so + `make check` no longer depends on the network (closes #2) - 2026-07-07 Adopted scripts-to-rule-them-all: `script/` entrypoints, Makefile shims, README Entrypoints section - 2026-02-22: repo policy compliance: required policy files, .gitignore @@ -58,8 +90,10 @@ runs make check on main. # Future Steps -- Verify main is green after the merge: make check locally and the new - CI workflow passing -- Review stale remote branches fix-min-time-calculation and - optimize-sqlite-settings: land or delete -- Clean up the tmp/ directory at the repo root: gitignore or remove +- Production memory under 5 GiB: whether to test under a real 5 GiB + container limit on fsn1app1 is open for sneak + (https://git.eeqj.de/sneak/routewatch/issues/3) +- `/api/v1/stats` answered HTTP 500 after 35 hours on the live feed, seen + on `3898daa`, which predates the 2026-09-22 in-memory statistics + (https://git.eeqj.de/sneak/routewatch/issues/30) +- Add a `.dockerignore` (https://git.eeqj.de/sneak/routewatch/issues/39) -- 2.54.0 From ee4a92433bbfe2899b793f33a3e3df655628bf29 Mon Sep 17 00:00:00 2001 From: sneak Date: Tue, 29 Sep 2026 03:41:15 +0000 Subject: [PATCH 2/4] TODO.md: License section was rewritten, not added The 2026-09-29 Completed Steps line now says the README License section says MIT and links LICENSE, and that an Author section was added. Model: opus-5-5 --- TODO.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TODO.md b/TODO.md index 01ee428..dcdc323 100644 --- a/TODO.md +++ b/TODO.md @@ -24,9 +24,9 @@ Steps. # Completed Steps -- 2026-09-29: README first line names the MIT license and the author, - with new License and Author sections; this file brought up to date - (closes #38) +- 2026-09-29: README first line names the MIT license and the author; + the License section now says MIT and links `LICENSE`, and an Author + section was added; this file brought up to date (closes #38) - 2026-09-29: MIT `LICENSE` (closes #1) - 2026-09-28: stopping the daemon while the feed is flowing no longer panics with "send on closed channel": the read loop checks for a stop -- 2.54.0 From 8fb91936152e457ecafb468e47c60a63c8a70617 Mon Sep 17 00:00:00 2001 From: clawbot Date: Tue, 29 Sep 2026 04:07:39 +0000 Subject: [PATCH 3/4] TODO.md: Next Step says what the record decides `next` waits for sneak to merge it to `main`; the upaas setup and deploy and the run under a real 5 GiB limit follow and are his. Meanwhile the `.dockerignore` issue is next on `next`; nothing orders the stats issue. Model: opus-5-5 --- TODO.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index dcdc323..55d801c 100644 --- a/TODO.md +++ b/TODO.md @@ -19,8 +19,14 @@ container memory limit. # Next Step -Not decided. Nothing on the tracker orders the open issues under Future -Steps. +`next` waits for sneak to merge it to `main` through +https://git.eeqj.de/sneak/routewatch/pulls/6. After that, setting +routewatch up under upaas on fsn1app1 and deploying it are his +(https://git.eeqj.de/sneak/routewatch/issues/31), and so is the run under a +real 5 GiB limit (https://git.eeqj.de/sneak/routewatch/issues/3). +Meanwhile https://git.eeqj.de/sneak/routewatch/issues/39 is the next issue +to work on `next`; nothing on the record orders +https://git.eeqj.de/sneak/routewatch/issues/30. # Completed Steps -- 2.54.0 From 59430480bf456220ed6277aebf4f2b091d126169 Mon Sep 17 00:00:00 2001 From: sneak Date: Tue, 29 Sep 2026 04:41:14 +0000 Subject: [PATCH 4/4] TODO.md: nothing on the record orders the two open issues Next Step no longer puts https://git.eeqj.de/sneak/routewatch/issues/39 ahead of https://git.eeqj.de/sneak/routewatch/issues/30; nothing on the tracker decides that. Model: opus-5-5 --- TODO.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 55d801c..fbab888 100644 --- a/TODO.md +++ b/TODO.md @@ -24,8 +24,8 @@ https://git.eeqj.de/sneak/routewatch/pulls/6. After that, setting routewatch up under upaas on fsn1app1 and deploying it are his (https://git.eeqj.de/sneak/routewatch/issues/31), and so is the run under a real 5 GiB limit (https://git.eeqj.de/sneak/routewatch/issues/3). -Meanwhile https://git.eeqj.de/sneak/routewatch/issues/39 is the next issue -to work on `next`; nothing on the record orders +Nothing on the record orders +https://git.eeqj.de/sneak/routewatch/issues/39 and https://git.eeqj.de/sneak/routewatch/issues/30. # Completed Steps -- 2.54.0