Normandy.Behaviours.SessionStore.Mnesia (normandy v1.3.0)

View Source

Distributed, durable SessionStore over OTP-native Mnesia ("distributed ETS"). ram_copies tables are replicated ETS; :mnesia.transaction/1 serializes per-session appends (the FOR-UPDATE equivalent), so concurrent/cross-node appends never lose an entry. Mnesia stores Erlang terms natively, so content / turn_state / config_template need no term_to_binary.

The handle is %{entries: table, sessions: table}. The host (or Normandy.Cluster) calls create_tables/1 with copies: :disc_copies for durable, full-cluster-restart survival (the production default); ram_copies (test/default new/0) is faster but only meaningful with ≥2 nodes. Configure via {Normandy.Behaviours.SessionStore.Mnesia, entries: :..., sessions: :...}.

Summary

Functions

Create the two Mnesia tables. Opts: :entries/:sessions (table-name atoms, required), :copies (:disc_copies default | :ram_copies), :nodes (default [node()]). disc_copies converts this node's schema to disc first so it survives restart (requires a writable Mnesia dir; see -mnesia dir / :mnesia app env).

Test/default handle: fresh uniquely-named ram_copies tables on this node.

Functions

create_tables(opts)

@spec create_tables(keyword()) :: :ok

Create the two Mnesia tables. Opts: :entries/:sessions (table-name atoms, required), :copies (:disc_copies default | :ram_copies), :nodes (default [node()]). disc_copies converts this node's schema to disc first so it survives restart (requires a writable Mnesia dir; see -mnesia dir / :mnesia app env).

new(opts \\ [])

@spec new(keyword()) :: %{entries: atom(), sessions: atom()}

Test/default handle: fresh uniquely-named ram_copies tables on this node.