A swap of the active site is stored as two single-site requests held together by naming conventions #184

Open
opened 2026-10-06 21:25:18 +00:00 by cgalo5758 · 4 comments
Owner

A swap parks one site and activates another. core.lifecycle_requests holds one request per instance, so a swap is two set_status rows under one workflow id, each naming the other site in its parameters. Readers rebuild it from conventions: a second swap is refused by workflow-id shape (IsSwapRequestWorkflowID), a dismissal pairs rows by workflow id, the slot count in internal/integrations/fedwiki/store/queries/sites.sql skips rows with swap_park_site_id, an unstarted swap deletes its rows in separate statements, and FedWiki answers a repeated swap itself (sameRowRequest) because core would compare the park site the console chose.

The published protocol (#171) will carry lifecycle requests and FedWiki moves onto it (#174), so the model must say first whether a request can cover several instances, and if not, what holds the rows together.

Done when: docs/models/provider-integration.md states it, #171 carries it, and no code finds a swap by workflow id or parameter key.

A swap parks one site and activates another. `core.lifecycle_requests` holds one request per instance, so a swap is two `set_status` rows under one workflow id, each naming the other site in its parameters. Readers rebuild it from conventions: a second swap is refused by workflow-id shape (`IsSwapRequestWorkflowID`), a dismissal pairs rows by workflow id, the slot count in `internal/integrations/fedwiki/store/queries/sites.sql` skips rows with `swap_park_site_id`, an unstarted swap deletes its rows in separate statements, and FedWiki answers a repeated swap itself (`sameRowRequest`) because core would compare the park site the console chose. The published protocol (#171) will carry lifecycle requests and FedWiki moves onto it (#174), so the model must say first whether a request can cover several instances, and if not, what holds the rows together. Done when: `docs/models/provider-integration.md` states it, #171 carries it, and no code finds a swap by workflow id or parameter key.
cgalo5758 added the
kind
design
area/fedwikiarea/integrations
labels 2026-10-06 21:25:18 +00:00
Author
Owner

#179, #181 and #184 share one gap: an action that writes several rows has no record of its own, so readers rebuild it from prefixes, a borrowed request id, or the shape of a workflow id. They take one convention, decided by whichever is worked first and followed by the others. #184 comes first, because the published protocol (#171) needs its answer. #131 asks the same of subscription changes.

#179, #181 and #184 share one gap: an action that writes several rows has no record of its own, so readers rebuild it from prefixes, a borrowed request id, or the shape of a workflow id. They take one convention, decided by whichever is worked first and followed by the others. #184 comes first, because the published protocol (#171) needs its answer. #131 asks the same of subscription changes.
cgalo5758 added this to the Public launch milestone 2026-10-07 00:16:56 +00:00
Author
Owner

The order changes: #187 sets the convention for an action that writes several rows, because its plan-wide acts need it first. A tier removal, a default change or a reorder will record one act and one row per organization it reaches, each pointing at the act. That design is researched against every action that will follow it: this issue's swap, #179's tier changes, #181's rule-change batches, #131's subscription changes and #171's acts, so each fits it. This issue follows the convention, and still answers before #171 starts whether a lifecycle request can cover several instances.

The order changes: #187 sets the convention for an action that writes several rows, because its plan-wide acts need it first. A tier removal, a default change or a reorder will record one act and one row per organization it reaches, each pointing at the act. That design is researched against every action that will follow it: this issue's swap, #179's tier changes, #181's rule-change batches, #131's subscription changes and #171's acts, so each fits it. This issue follows the convention, and still answers before #171 starts whether a lifecycle request can cover several instances.
Author
Owner

Two more things the swap's design has to cover.

Core's rule for a repeated request (sameLifecycleContent in internal/integration/lifecycle.go: the same operation, the same requesting person, the same parameters as JSON values) is written twice more in FedWiki, as sameRowRequest (internal/integrations/fedwiki/web/requests.go) and sameCreate (internal/integrations/fedwiki/web/api.go). For every parameter FedWiki writes, the three agree except the swap's swap_park_site_id and swap_activate_site_id, which sameRowRequest ignores because the console chooses the site to park under the lock. sameCreate has no such reason. Once the site to park leaves a request's parameters, core's rule answers every repeat and both copies can go. Core reads an address through one function that the recording and the lookup share, so a lookup that also applies the content rule is a small addition there.

A swap recorded as one act takes two instance locks. Today it records the activated site's request first and the parked site's second (swapActiveSite in internal/integrations/fedwiki/web/site_actions.go), not in instance order. That is safe only because both run under the workspace lock and a site belongs to one workspace. An act that records requests on several instances without that outer lock has to take their locks in ascending instance order.

Two more things the swap's design has to cover. Core's rule for a repeated request (`sameLifecycleContent` in `internal/integration/lifecycle.go`: the same operation, the same requesting person, the same parameters as JSON values) is written twice more in FedWiki, as `sameRowRequest` (`internal/integrations/fedwiki/web/requests.go`) and `sameCreate` (`internal/integrations/fedwiki/web/api.go`). For every parameter FedWiki writes, the three agree except the swap's `swap_park_site_id` and `swap_activate_site_id`, which `sameRowRequest` ignores because the console chooses the site to park under the lock. `sameCreate` has no such reason. Once the site to park leaves a request's parameters, core's rule answers every repeat and both copies can go. Core reads an address through one function that the recording and the lookup share, so a lookup that also applies the content rule is a small addition there. A swap recorded as one act takes two instance locks. Today it records the activated site's request first and the parked site's second (`swapActiveSite` in `internal/integrations/fedwiki/web/site_actions.go`), not in instance order. That is safe only because both run under the workspace lock and a site belongs to one workspace. An act that records requests on several instances without that outer lock has to take their locks in ascending instance order.
Author
Owner

The slot holds FedWiki now keeps for creates and activations in flight key on the lifecycle request, not on the workflow id a swap's two requests share, and a swap takes no hold: it takes its slot inside its record transaction. The slot count no longer reads the swap's park-site parameter, so one reader of the two-request convention is gone.

The slot holds FedWiki now keeps for creates and activations in flight key on the lifecycle request, not on the workflow id a swap's two requests share, and a swap takes no hold: it takes its slot inside its record transaction. The slot count no longer reads the swap's park-site parameter, so one reader of the two-request convention is gone.
cgalo5758 referenced this issue from a commit 2026-10-22 18:40:40 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wiki-cafe/member-console#184