Two cluster fixes from the survey of what upstream's single-node design misses on three nodes.
Web push once per node. Subscription updates are broadcast to every node and the push manager only checked the node's role when loading subscriptions at startup. A node whose role turns push off still registered each updated subscription and POSTed its own copy. Event::Update now checks the role as well as the shard. (hosts-baseline gets the matching role change: pushNotifications off on peer/peer-mta.)
Colliding snowflake ids after a lost lease. A node silent for over an hour can have its id taken by another host. On its return the renewal only logged held by another host and the node kept minting ids as that node. It now claims a fresh id, re-points the id generator and logs cluster.node-id-reassigned (event 649). RegistryStoreInner.node_id is atomic for that, and the claim loop is shared by startup and the step-down.
Checks: cargo check + clippy on store/services (no new warnings), cargo test -p store --lib build::cluster (4 pass, one new), fork checks clean.
Two cluster fixes from the survey of what upstream's single-node design misses on three nodes.
**Web push once per node.** Subscription updates are broadcast to every node and the push manager only checked the node's role when loading subscriptions at startup. A node whose role turns push off still registered each updated subscription and POSTed its own copy. `Event::Update` now checks the role as well as the shard. (hosts-baseline gets the matching role change: `pushNotifications` off on `peer`/`peer-mta`.)
**Colliding snowflake ids after a lost lease.** A node silent for over an hour can have its id taken by another host. On its return the renewal only logged `held by another host` and the node kept minting ids as that node. It now claims a fresh id, re-points the id generator and logs `cluster.node-id-reassigned` (event 649). `RegistryStoreInner.node_id` is atomic for that, and the claim loop is shared by startup and the step-down.
Checks: `cargo check` + `clippy` on store/services (no new warnings), `cargo test -p store --lib build::cluster` (4 pass, one new), fork checks clean.
Push subscription updates are broadcast to every node, and the push manager
only checked the role when loading subscriptions at startup. A node whose
role turns push off still registered each updated subscription and sent
its own copy, so a client was pushed once per node. Event::Update now
checks the role as well as the shard.
A node that loses its id lease (silent for over an hour, another host took
the id) only logged the failed renewal and carried on minting snowflake ids
as that node, which can collide with the new holder's. The node now claims
a fresh id, re-points the id generator and logs cluster.node-id-reassigned.
The registry's node id is atomic for that; the claim loop is shared by
startup and the step-down.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Two cluster fixes from the survey of what upstream's single-node design misses on three nodes.
Web push once per node. Subscription updates are broadcast to every node and the push manager only checked the node's role when loading subscriptions at startup. A node whose role turns push off still registered each updated subscription and POSTed its own copy.
Event::Updatenow checks the role as well as the shard. (hosts-baseline gets the matching role change:pushNotificationsoff onpeer/peer-mta.)Colliding snowflake ids after a lost lease. A node silent for over an hour can have its id taken by another host. On its return the renewal only logged
held by another hostand the node kept minting ids as that node. It now claims a fresh id, re-points the id generator and logscluster.node-id-reassigned(event 649).RegistryStoreInner.node_idis atomic for that, and the claim loop is shared by startup and the step-down.Checks:
cargo check+clippyon store/services (no new warnings),cargo test -p store --lib build::cluster(4 pass, one new), fork checks clean.