portunus_machine (portunus v0.8.0)
View SourceThe portunus Ra state machine. It manages leases, locks, fencing
tokens, a score-ordered succession queue (FIFO among equal scores), and
tick-based lease expiry.
Determinism rules (see AGENTS.md): apply/3 never reads node-local
time (only the leader-stamped system_time in the command metadata),
never calls make_ref/0/self/0, and mints tokens/ids from the Raft
index. Timers and monitors are effects that only trigger commands;
the decision is always re-derived from replicated state.
Summary
Types
-type command() :: {grant_lease, portunus:option(lease_id()), pos_integer(), owner(), portunus:option(pid())} | {renew, [lease_id()]} | {revoke_lease, lease_id()} | {acquire, lease_id(), lock_key(), owner(), term(), wait | nowait} | {acquire, lease_id(), lock_key(), owner(), term(), wait | nowait, integer()} | {release, lock_key(), token()} | {transfer, lock_key(), token(), owner()} | {leave_queue, lock_key(), lease_id()} | {watch, lock_key(), pid()} | {unwatch, watch_ref()} | {timeout, expire} | {down, pid(), term()} | {nodeup | nodedown, node()}.
-type lease_id() :: term().
-type lock_key() :: term().
-type owner() :: term().
-type owner_info() :: #{owner := owner(), lease := lease_id(), token := token(), context := term(), remaining_ms := non_neg_integer()}.
-opaque state()
-type token() :: non_neg_integer().
-type watch_ref() :: non_neg_integer().
Functions
-spec apply(ra_machine:command_meta_data(), command(), state()) -> {state(), term(), ra_machine:effects()}.
-spec handle_aux(ra_server:ra_state(), term(), term(), undefined, ra_aux:internal_state()) -> {no_reply, undefined, ra_aux:internal_state()}.
-spec init_aux(atom()) -> undefined.
-spec query_owner(lock_key(), state()) -> {ok, owner_info()} | {error, not_held}.
-spec state_enter(ra_server:ra_state() | eol, state()) -> ra_machine:effects().
-spec version() -> ra_machine:version().
-spec which_module(ra_machine:version()) -> module().