Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9497319c3 | ||
|
|
7e8aae1875 | ||
|
|
6de44ac054 |
No files matched your search
+1
-1
@@ -105,7 +105,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
ARG CACHEBUST
|
ARG CACHEBUST
|
||||||
|
|
||||||
# Create non-root user
|
# Create non-root user
|
||||||
RUN useradd -r -u 1000 -m routewatch
|
RUN useradd -u 1000 -m routewatch
|
||||||
|
|
||||||
RUN mkdir -p /var/lib/berlin.sneak.app.routewatch && chown routewatch:routewatch /var/lib/berlin.sneak.app.routewatch
|
RUN mkdir -p /var/lib/berlin.sneak.app.routewatch && chown routewatch:routewatch /var/lib/berlin.sneak.app.routewatch
|
||||||
|
|
||||||
|
|||||||
@@ -143,8 +143,9 @@ and origin AS can have two kept routes, one or none.
|
|||||||
AS path, a next hop and a time. The next hop is the router the peer sends the
|
AS path, a next hop and a time. The next hop is the router the peer sends the
|
||||||
prefix's traffic to. RouteWatch records the peer itself as the next hop. The
|
prefix's traffic to. RouteWatch records the peer itself as the next hop. The
|
||||||
page also lists the prefix's origin changes, newest first. An origin change is
|
page also lists the prefix's origin changes, newest first. An origin change is
|
||||||
recorded when an AS gains its first peer for the prefix, or loses its last.
|
recorded when the first peer starts to carry the prefix with an origin AS, or
|
||||||
The page shows at most the newest 5,000. Each row shows:
|
when the last peer stops. The page shows at most the newest 5,000. Each row
|
||||||
|
shows:
|
||||||
- the time
|
- the time
|
||||||
- announced or withdrawn
|
- announced or withdrawn
|
||||||
- the origin AS
|
- the origin AS
|
||||||
@@ -196,8 +197,9 @@ also carries an `@meta` object:
|
|||||||
- `api_version`: `1`
|
- `api_version`: `1`
|
||||||
- `execution_time_ms`: the number of milliseconds the request took
|
- `execution_time_ms`: the number of milliseconds the request took
|
||||||
|
|
||||||
Every value with a unit is a number, and the unit ends the field name. Examples
|
Every value with a unit is a number. The unit ends the field name, as in `_ms`,
|
||||||
are `_ms`, `_seconds`, `_bytes`, `_per_sec` and `_per_min`.
|
`_seconds`, `_bytes`, `_per_sec` and `_per_min`. `latitude` and `longitude` are
|
||||||
|
in degrees, and their names do not say so.
|
||||||
|
|
||||||
The paths:
|
The paths:
|
||||||
|
|
||||||
@@ -521,7 +523,7 @@ An IP lookup finds where each address is, on a best-effort basis. It uses two
|
|||||||
sources:
|
sources:
|
||||||
|
|
||||||
- [geojs](https://www.geojs.io/) is asked first. One request carries every
|
- [geojs](https://www.geojs.io/) is asked first. One request carries every
|
||||||
address of the lookup that the cache does not hold, and it has 1 second to
|
address of the lookup that the cache does not hold. geojs has 1 second to
|
||||||
answer.
|
answer.
|
||||||
- [DB-IP City Lite](https://db-ip.com/db/download/ip-to-city-lite) answers when
|
- [DB-IP City Lite](https://db-ip.com/db/download/ip-to-city-lite) answers when
|
||||||
geojs has no answer for the address. It is a database file that RouteWatch
|
geojs has no answer for the address. It is a database file that RouteWatch
|
||||||
@@ -704,8 +706,10 @@ What happens at each limit:
|
|||||||
allocating more.
|
allocating more.
|
||||||
- The SQLite hard heap limit: a database statement fails with an out-of-memory
|
- The SQLite hard heap limit: a database statement fails with an out-of-memory
|
||||||
error, which the handler logs. The prefix handler writes the routing table's
|
error, which the handler logs. The prefix handler writes the routing table's
|
||||||
changes again in a later write. Everything else in the failed write is
|
changes and its origin changes again in a later write. Everything else in a
|
||||||
dropped. The process keeps running.
|
handler's failed write is dropped. The PTR cache and the geolocation part
|
||||||
|
write their answers to `cache.db` again in a later write. The process keeps
|
||||||
|
running.
|
||||||
- The handler queues: the handlers are the four parts that take the feed's
|
- The handler queues: the handlers are the four parts that take the feed's
|
||||||
messages (see Design). The prefix handler's queue holds at most 100,000
|
messages (see Design). The prefix handler's queue holds at most 100,000
|
||||||
messages, about 100 MiB. Each of the other three holds at most 20,000. When a
|
messages, about 100 MiB. Each of the other three holds at most 20,000. When a
|
||||||
@@ -1072,8 +1076,8 @@ calls one of them. The scripts:
|
|||||||
- `script/projectname`: print the project name, `routewatch`, which
|
- `script/projectname`: print the project name, `routewatch`, which
|
||||||
`script/docker` uses as the image tag.
|
`script/docker` uses as the image tag.
|
||||||
- `script/test`: build the `test` phase of the `Dockerfile` alone. It runs
|
- `script/test`: build the `test` phase of the `Dockerfile` alone. It runs
|
||||||
`go test -short -count=1 -timeout 90s -race -cover ./...`, and reruns it with
|
`go test -short -count=1 -timeout 90s -race -cover ./...`. On failure it runs
|
||||||
`-v` on failure.
|
the tests again with `-v` and without `-cover`.
|
||||||
- `script/lint`: build the `lint` phase of the `Dockerfile` alone. It runs
|
- `script/lint`: build the `lint` phase of the `Dockerfile` alone. It runs
|
||||||
`golangci-lint` v2.14.0 with `.golangci.yml`.
|
`golangci-lint` v2.14.0 with `.golangci.yml`.
|
||||||
- `script/fmt`: format the Go code with `go fmt` and the markdown with
|
- `script/fmt`: format the Go code with `go fmt` and the markdown with
|
||||||
|
|||||||
@@ -22,18 +22,17 @@ formatting of the Go code and the markdown. Then it builds the image.
|
|||||||
The image sets memory ceilings for a 5 GiB container (README "Memory"). README
|
The image sets memory ceilings for a 5 GiB container (README "Memory"). README
|
||||||
"Running under upaas" says how to run it.
|
"Running under upaas" says how to run it.
|
||||||
|
|
||||||
Since 2026-10-27, `next` has run on the live feed five times, from three hours
|
Five runs of `next` on the live feed have ended since 2026-10-27, from three
|
||||||
to five days. The runs found the handlers dropping updates for five causes, and
|
hours to five days long. The runs found the handlers dropping updates for five
|
||||||
the WHOIS fetcher asking a registry that had refused it. Each is fixed on
|
causes, and the WHOIS fetcher asking a registry that had refused it. Each is
|
||||||
`next`, and its Completed Steps entry below names its issue. A 21-hour run of
|
fixed on `next`, and its Completed Steps entry below names its issue. A 21-hour
|
||||||
`742e759`, which has every fix but one, dropped no update except after the feed
|
run of `742e759`, which has every fix but one, dropped no update except after
|
||||||
stalled. That cause, https://git.eeqj.de/sneak/routewatch/issues/229, is fixed
|
the feed stalled. That cause, https://git.eeqj.de/sneak/routewatch/issues/229,
|
||||||
on `next`.
|
is fixed on `next`.
|
||||||
|
|
||||||
A 24-hour run of `e58c663` on the live feed began at 09:19 UTC on 2026-11-10
|
A run of `e58c663` on the live feed began at 09:19 UTC on 2026-11-10
|
||||||
(https://git.eeqj.de/sneak/routewatch/issues/232). It reads whether any handler
|
(https://git.eeqj.de/sneak/routewatch/issues/232). It is to confirm that fix.
|
||||||
drops an update, the size of the `origin_changes` table on disk, and the
|
Next Step lists what its outcome reports. The seven IP lookup additions of
|
||||||
process's peak memory against 5 GiB. The seven IP lookup additions of
|
|
||||||
https://git.eeqj.de/sneak/routewatch/issues/203 landed after it began, so it
|
https://git.eeqj.de/sneak/routewatch/issues/203 landed after it began, so it
|
||||||
does not exercise them.
|
does not exercise them.
|
||||||
|
|
||||||
@@ -42,13 +41,15 @@ https://git.eeqj.de/sneak/routewatch/issues/86.
|
|||||||
|
|
||||||
# Next Step
|
# Next Step
|
||||||
|
|
||||||
Post the outcome of the 24-hour run of `e58c663` on
|
Post the outcome of the run of `e58c663` on
|
||||||
https://git.eeqj.de/sneak/routewatch/issues/232. The run lasts 24 hours, or
|
https://git.eeqj.de/sneak/routewatch/issues/232. The run lasts at least 24
|
||||||
until the feed has stalled or reconnected once, up to 72 hours. The outcome
|
hours. If the feed has not stalled or reconnected by then, the run goes on until
|
||||||
says:
|
it does, up to 72 hours in all. The outcome says:
|
||||||
|
|
||||||
- whether any handler dropped an update, and the prefix queue's high-water mark
|
- whether the feed stalled or reconnected
|
||||||
- the held-back count
|
- whether any handler dropped an update, and the most messages the prefix
|
||||||
|
handler's queue held at once
|
||||||
|
- the most messages the prefix handler held back at once
|
||||||
- the size of the `origin_changes` table on disk
|
- the size of the `origin_changes` table on disk
|
||||||
- the process's peak memory against 5 GiB
|
- the process's peak memory against 5 GiB
|
||||||
|
|
||||||
@@ -57,11 +58,14 @@ File an issue for each problem the run finds.
|
|||||||
# Completed Steps
|
# Completed Steps
|
||||||
|
|
||||||
- 2026-11-10: `README.md` and this file are read whole against the rules of
|
- 2026-11-10: `README.md` and this file are read whole against the rules of
|
||||||
https://git.eeqj.de/sneak/routewatch/issues/157, and every statement is
|
https://git.eeqj.de/sneak/routewatch/issues/157, and every statement except
|
||||||
checked against the code on `next`. Four README sentences, on origin changes,
|
measured figures and what outside services do is checked against the code on
|
||||||
PTR lookups and geolocation, are rewritten. Status and Next Step describe the
|
`next`. Four README sentences failed the prose rules. Five disagreed with the
|
||||||
live-feed run in progress (closes
|
code. Each is rewritten. Status and Next Step describe the live-feed run in
|
||||||
https://git.eeqj.de/sneak/routewatch/issues/251).
|
progress (closes https://git.eeqj.de/sneak/routewatch/issues/251).
|
||||||
|
- 2026-11-10: the image creates the `routewatch` user as a regular user with UID
|
||||||
|
1000, so the build no longer warns about the system UID range (closes
|
||||||
|
https://git.eeqj.de/sneak/routewatch/issues/248).
|
||||||
- 2026-11-10: each result of the IP lookup has `geo`, where the address is. It
|
- 2026-11-10: each result of the IP lookup has `geo`, where the address is. It
|
||||||
comes from geojs, with DB-IP's City Lite database as the fallback. The geojs
|
comes from geojs, with DB-IP's City Lite database as the fallback. The geojs
|
||||||
answers stay in memory and in `cache.db` for 7 days (closes
|
answers stay in memory and in `cache.db` for 7 days (closes
|
||||||
@@ -74,7 +78,8 @@ File an issue for each problem the run finds.
|
|||||||
servers, and `protonvpn_entry` holds the servers' IPv4 and IPv6 addresses
|
servers, and `protonvpn_entry` holds the servers' IPv4 and IPv6 addresses
|
||||||
(closes https://git.eeqj.de/sneak/routewatch/issues/236).
|
(closes https://git.eeqj.de/sneak/routewatch/issues/236).
|
||||||
- 2026-11-10: the IP lookup finds PTR names over DNS-over-HTTPS and caches them
|
- 2026-11-10: the IP lookup finds PTR names over DNS-over-HTTPS and caches them
|
||||||
for the record's TTL, in memory and in `cache.db` (closes
|
in memory and in `cache.db` for the record's TTL. A TTL is the time for which
|
||||||
|
a DNS record may be kept (closes
|
||||||
https://git.eeqj.de/sneak/routewatch/issues/238).
|
https://git.eeqj.de/sneak/routewatch/issues/238).
|
||||||
- 2026-11-10: the tests no longer fail when a busy host stalls for several
|
- 2026-11-10: the tests no longer fail when a busy host stalls for several
|
||||||
seconds. Most waits for something that should happen are now 15 seconds. Tests
|
seconds. Most waits for something that should happen are now 15 seconds. Tests
|
||||||
|
|||||||
Reference in new issue
Block a user