Skip to content

Verify the replicate alias table on the VM before archiver issues the first content.replicate command (archiver#197, #81) #86

Description

@gregoryfoster

Archiver is about to issue the first real content.replicate command (CannObserv/archiver#197, the other half of #81). What that command does depends entirely on whether this host has an alias table provisioned, and that state is unverified from the archiver side: ssh watcher times out from the archiver VM, so this issue is the shortest path to an answer.

What is known

  • REPLICATOR_REPLICATION_ALIASES_FILE was unset on the VM when Consume content.replicate: permanent replication per RepSpec, emit replication_complete #29 closed on 2026-08-14 (its closing comment: "No host is provisioned … the startup line reads "replication_aliases": []").
  • docs/ENVIRONMENT.md documents the binding as if it were provisioned - { "primary": { "provider": "gcs", "bucket": "co-gcs-replication" } } with an empty prefix and a paragraph on why - but README.md's "Set on this VM" table does not list the variable.
  • docs/DEPLOYMENT.md says the worker's ADC is the replication writer SA (co-gcs-replicator), so the credential half should already be in place.

Please report

  1. The journal line at the last boot: alias table loaded with its provisioned list, or no alias table on this host — replication is not provisioned.
  2. Whether could not build a provider writer appears after that line (an alias that resolves but has no writer refuses provider_disabled, which reads differently on archiver's dashboard).
  3. The value of REPLICATOR_REPLICATION_ALIASES_FILE in /etc/replicator/.env, and if set, the file's alias names (not its contents).

The sequencing this decides

Archiver's first command is deliberately going out before provisioning if the host is unprovisioned: the refusal is alias_unknown, terminal and pre-credential, so nothing is written anywhere, yet the command lands on content.replicate, the group delivers and acks it, the fact lands on content.artifacts, and archiver's writeback closes the command as failed. That exercises both streams end to end with zero permanent writes, which is what CannObserv/archiver#197 and CannObserv/broker#7 need. #81 stays open until the provisioned run - its "executes against a real destination" criterion needs a real write.

After the rehearsal, provisioning is the operator act (contract T5). Two asks so the second command succeeds first time:

  • Name the alias primary, matching docs/ENVIRONMENT.md. credentials_alias is part of the RepSpec document, which freezes on assignment (archiver#83), so a different name means a second RepSpec on archiver's side rather than an edit.
  • Say so here when it is provisioned. Archiver re-issues with a fresh command_id from the dashboard's Replicate now; nothing re-issues automatically.

If the host turns out to be provisioned already, say so and archiver skips the rehearsal: the same first command is then the real first write, under the destination layout being settled on archiver#197.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions