Deploying voyager 3 without its edge worker: the no-edge marker, history replayed into the catalog
Test and deploy / test (push) Failing after 51s
Test and deploy / edge (push) Successful in 1m52s
Test and deploy / deploy (push) Skipped

deploy.sh and the nightly resume leave the edge stopped while .cache/no-edge
exists (range by range it would split releases at every edge with no merger
left). deploy/replay-window.sh takes DB and OUT and passes
REPLAY_INTO_CATALOG=1, which lets replay:corpus write a database not named
*_replay or *_scratch (never the test one).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Daan MeijerandClaude Fable 5.1 committed 2026-10-26 16:30:56 +01:00
1 parent 91984d3625
commit 8f5f83b4ea
5 files changed
+34 -13

No files matched your search

+9 -1
View File
@@ -690,7 +690,15 @@ ranges are all stored is replayed once with the window's bounds as
`--from`/`--to` (the corpus holds other windows of the same group), 4
groups at a time, logs and `.done` markers in `.cache/replay/`, looping
until the window is done (LOG.md 2026-10-26 (111) has the first local
numbers, (112) the homelab run).
numbers, (112) the homelab run). **Deployed 2026-10-26** (LOG.md (116)):
voyager 3 runs on homelab without its edge worker (`.cache/no-edge`:
deploy.sh and the nightly resume leave it stopped, since range by range
it would split releases at every edge with no merger left), and history
comes from the corpus through this driver into the catalog itself
(`DB=usenet_rebuild OUT=.cache/replay-catalog`, the harness allowed by
`REPLAY_INTO_CATALOG=1`), the prober's ladder, the merger and the judge
working on it as it fills; the scratch run's numbers (63 groups) were
read before (LOG.md (115)). The tail waits for the window worker.
Next: the replay on homelab over the 2016 window (the NVMe bytes per
header for real), the ordered range leases with the carried window in
+7 -3
View File
@@ -13,9 +13,12 @@ import { fromWire, type WireBatch } from '#lib/edge/index'
/**
* Only a database named like one of these is written: the replay leases and finishes ranges and fills the catalog.
* Not the test database: the rows left behind failed 27 functional tests (LOG.md 2026-10-26 (111)).
* Not the test database: the rows left behind failed 27 functional tests (LOG.md 2026-10-26 (111)). With
* REPLAY_INTO_CATALOG=1 any database but the test one: voyager 3 deployed, history replayed from the corpus into
* the catalog itself (deploy/replay-window.sh, LOG.md (116)).
*/
const SCRATCH_DB = /_(replay|scratch)$/
const TEST_DB = /_test$/
const NODE_NAME = 'replay'
interface StoredRange {
@@ -79,9 +82,10 @@ export default class ReplayCorpus extends BaseCommand {
async run() {
const database = db.connection().getReadClient().client.config.connection.database as string
if (!SCRATCH_DB.test(database)) {
const intoCatalog = process.env.REPLAY_INTO_CATALOG === '1' && !TEST_DB.test(database)
if (!SCRATCH_DB.test(database) && !intoCatalog) {
this.logger.error(
`The replay writes the catalog: it only runs against a database named *_replay or *_scratch (this is "${database}")`
`The replay writes the catalog: it only runs against a database named *_replay or *_scratch (this is "${database}"; REPLAY_INTO_CATALOG=1 allows it)`
)
this.exitCode = 1
return
+8 -1
View File
@@ -51,7 +51,14 @@ if [ -e "$CACHE/paused" ]; then
docker compose up -d --no-deps node-api web
else
docker compose up -d --no-deps node-api web coordinator prober merger judge spotter spot-inspector
docker compose up -d --no-deps edge
if [ -e "$CACHE/no-edge" ]; then
# Voyager 3 (2026-10-26, LOG.md (116)): the worker indexes range by range, without the carried window, and
# would split releases at every range edge with nothing to join them; history comes from the corpus through
# deploy/replay-window.sh until the window worker is built. Remove the marker to start it again.
echo "== no-edge: the edge worker left stopped"
else
docker compose up -d --no-deps edge
fi
fi
echo "$SHA $(date -Is)" >> "$ROOT/deployed.log"
# The images this replaced (321 MB each; the root filesystem is the NVMe, with a 10 GB floor).
+6 -2
View File
@@ -8,13 +8,17 @@
# from the deployment root:
# setsid nohup deploy/replay-window.sh > .cache/replay/driver.log 2>&1 &
# No new group starts while the nightly pause is on (.cache/paused); the running ones finish.
# DB=usenet_rebuild replays into the catalog itself (voyager 3 deployed, 2026-10-26: history comes from the corpus
# this way until the window worker is built); the harness then needs REPLAY_INTO_CATALOG=1, passed here. OUT keeps
# a run's logs and markers apart (.cache/replay-catalog for the catalog's).
set -u
ROOT=${ROOT:-/mnt/bulk/usenet-rebuild}
PRIORITY=${PRIORITY:-0}
PARALLEL=${PARALLEL:-4}
MEMORY=${MEMORY:-12g}
IMAGE=${IMAGE:-usenet-voyager3:latest}
OUT=$ROOT/.cache/replay
DB=${DB:-usenet_replay}
OUT=${OUT:-$ROOT/.cache/replay}
mkdir -p "$OUT"
cd "$ROOT" || exit 1
@@ -34,7 +38,7 @@ replay() {
say "$group: replaying $from–$to"
if docker run --rm --name "replay-${group//./-}" --network usenet-rebuild --env-file .env \
-e NODE_ENV=production -e HOST=0.0.0.0 -e PORT=3334 -e APP_URL=http://web:3334 -e SPOOL_DIR=/spool -e CORPUS_DIR=/corpus \
-e DB_HOST=postgres -e DB_PORT=5432 -e DB_DATABASE=usenet_replay -e CHUNK_TABLESPACE=pg_default \
-e DB_HOST=postgres -e DB_PORT=5432 -e DB_DATABASE="$DB" -e CHUNK_TABLESPACE=pg_default -e REPLAY_INTO_CATALOG=1 \
-v "$ROOT/corpus:/corpus:ro" --memory "$MEMORY" "$IMAGE" \
node ace replay:corpus --group "$group" --from "$from" --to "$to" > "$OUT/$group.log" 2>&1; then
touch "$OUT/$group.done"
+4 -6
View File
@@ -6,13 +6,11 @@ exec 9>.cache/deploy.lock
flock 9
rm -f .cache/paused
date "+%F %T resuming"
if [ -e .cache/v2-reset ]; then
# The voyager 2 catalog is reset (2026-10-26, LOG.md (112)): only the coordinator (the corpus fill) runs until voyager 3
# is deployed; the edge, prober, merger, judge, spotter and spot inspector would fill the old catalog again.
echo "v2 reset: only the coordinator"
docker compose up -d --no-deps coordinator
docker compose up -d --no-deps coordinator prober merger judge spotter spot-inspector
if [ -e .cache/no-edge ]; then
# Voyager 3 without its window worker yet (deploy.sh, LOG.md (116)): the edge stays stopped.
echo "no-edge: the edge worker left stopped"
else
docker compose up -d --no-deps coordinator prober merger judge spotter spot-inspector
docker compose up -d --no-deps edge
fi
docker compose ps --format "{{.Service}} {{.Status}}"