diff --git a/REBUILD.md b/REBUILD.md index 45cdced..f93739d 100644 --- a/REBUILD.md +++ b/REBUILD.md @@ -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 diff --git a/commands/replay_corpus.ts b/commands/replay_corpus.ts index 50521aa..c93027c 100644 --- a/commands/replay_corpus.ts +++ b/commands/replay_corpus.ts @@ -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 diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 982da19..fac6883 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -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). diff --git a/deploy/replay-window.sh b/deploy/replay-window.sh index 82ac5d3..ae7b589 100755 --- a/deploy/replay-window.sh +++ b/deploy/replay-window.sh @@ -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" diff --git a/deploy/usenet-rebuild-resume.sh b/deploy/usenet-rebuild-resume.sh index 3b319d8..3f126c7 100755 --- a/deploy/usenet-rebuild-resume.sh +++ b/deploy/usenet-rebuild-resume.sh @@ -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}}"