Deploying voyager 3 without its edge worker: the no-edge marker, history replayed into the catalog
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:
1 parent
91984d3625
commit
8f5f83b4ea
5 files changed
+33
-12
No files matched your search
+9
-1
@@ -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
|
`--from`/`--to` (the corpus holds other windows of the same group), 4
|
||||||
groups at a time, logs and `.done` markers in `.cache/replay/`, looping
|
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
|
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
|
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
|
header for real), the ordered range leases with the carried window in
|
||||||
|
|||||||
@@ -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.
|
* 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 SCRATCH_DB = /_(replay|scratch)$/
|
||||||
|
const TEST_DB = /_test$/
|
||||||
const NODE_NAME = 'replay'
|
const NODE_NAME = 'replay'
|
||||||
|
|
||||||
interface StoredRange {
|
interface StoredRange {
|
||||||
@@ -79,9 +82,10 @@ export default class ReplayCorpus extends BaseCommand {
|
|||||||
|
|
||||||
async run() {
|
async run() {
|
||||||
const database = db.connection().getReadClient().client.config.connection.database as string
|
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(
|
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
|
this.exitCode = 1
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -51,7 +51,14 @@ if [ -e "$CACHE/paused" ]; then
|
|||||||
docker compose up -d --no-deps node-api web
|
docker compose up -d --no-deps node-api web
|
||||||
else
|
else
|
||||||
docker compose up -d --no-deps node-api web coordinator prober merger judge spotter spot-inspector
|
docker compose up -d --no-deps node-api web coordinator prober merger judge spotter spot-inspector
|
||||||
|
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
|
docker compose up -d --no-deps edge
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo "$SHA $(date -Is)" >> "$ROOT/deployed.log"
|
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).
|
# The images this replaced (321 MB each; the root filesystem is the NVMe, with a 10 GB floor).
|
||||||
|
|||||||
@@ -8,13 +8,17 @@
|
|||||||
# from the deployment root:
|
# from the deployment root:
|
||||||
# setsid nohup deploy/replay-window.sh > .cache/replay/driver.log 2>&1 &
|
# 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.
|
# 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
|
set -u
|
||||||
ROOT=${ROOT:-/mnt/bulk/usenet-rebuild}
|
ROOT=${ROOT:-/mnt/bulk/usenet-rebuild}
|
||||||
PRIORITY=${PRIORITY:-0}
|
PRIORITY=${PRIORITY:-0}
|
||||||
PARALLEL=${PARALLEL:-4}
|
PARALLEL=${PARALLEL:-4}
|
||||||
MEMORY=${MEMORY:-12g}
|
MEMORY=${MEMORY:-12g}
|
||||||
IMAGE=${IMAGE:-usenet-voyager3:latest}
|
IMAGE=${IMAGE:-usenet-voyager3:latest}
|
||||||
OUT=$ROOT/.cache/replay
|
DB=${DB:-usenet_replay}
|
||||||
|
OUT=${OUT:-$ROOT/.cache/replay}
|
||||||
mkdir -p "$OUT"
|
mkdir -p "$OUT"
|
||||||
cd "$ROOT" || exit 1
|
cd "$ROOT" || exit 1
|
||||||
|
|
||||||
@@ -34,7 +38,7 @@ replay() {
|
|||||||
say "$group: replaying $from–$to"
|
say "$group: replaying $from–$to"
|
||||||
if docker run --rm --name "replay-${group//./-}" --network usenet-rebuild --env-file .env \
|
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 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" \
|
-v "$ROOT/corpus:/corpus:ro" --memory "$MEMORY" "$IMAGE" \
|
||||||
node ace replay:corpus --group "$group" --from "$from" --to "$to" > "$OUT/$group.log" 2>&1; then
|
node ace replay:corpus --group "$group" --from "$from" --to "$to" > "$OUT/$group.log" 2>&1; then
|
||||||
touch "$OUT/$group.done"
|
touch "$OUT/$group.done"
|
||||||
|
|||||||
@@ -6,13 +6,11 @@ exec 9>.cache/deploy.lock
|
|||||||
flock 9
|
flock 9
|
||||||
rm -f .cache/paused
|
rm -f .cache/paused
|
||||||
date "+%F %T resuming"
|
date "+%F %T resuming"
|
||||||
if [ -e .cache/v2-reset ]; then
|
docker compose up -d --no-deps coordinator prober merger judge spotter spot-inspector
|
||||||
# The voyager 2 catalog is reset (2026-10-26, LOG.md (112)): only the coordinator (the corpus fill) runs until voyager 3
|
if [ -e .cache/no-edge ]; then
|
||||||
# is deployed; the edge, prober, merger, judge, spotter and spot inspector would fill the old catalog again.
|
# Voyager 3 without its window worker yet (deploy.sh, LOG.md (116)): the edge stays stopped.
|
||||||
echo "v2 reset: only the coordinator"
|
echo "no-edge: the edge worker left stopped"
|
||||||
docker compose up -d --no-deps coordinator
|
|
||||||
else
|
else
|
||||||
docker compose up -d --no-deps coordinator prober merger judge spotter spot-inspector
|
|
||||||
docker compose up -d --no-deps edge
|
docker compose up -d --no-deps edge
|
||||||
fi
|
fi
|
||||||
docker compose ps --format "{{.Service}} {{.Status}}"
|
docker compose ps --format "{{.Service}} {{.Status}}"
|
||||||
Reference in new issue
Block a user