The outcome of one Linx.Netlink.Rtnl.Reconcile.reconcile/4 pass.
rtnl ops are ordered (addresses must exist before the routes that use them),
so a pass is fail-fast: it stops at the first op that errors, and the ops
it had not yet reached become :pending. The level-triggered next pass
re-converges them. (This is the same report shape as
Linx.Sysctl.Reconcile.Report; the strategy differs because rtnl ops are
ordered where sysctl's are independent — see the reconcile design notes.)
Fields:
:converged?—trueiff nothing was left undone (:failedand:pendingboth empty).:applied— ops that succeeded this pass, in apply order. Each is aLinx.Netlink.Rtnl.Diffop ({:create | :update | :delete, struct}).:failed—{op, error}for the op that stopped the pass (at most one, fail-fast).:pending— ops not attempted after the failure.:last_applied— the updated ownership map to thread into the next pass:%{addresses: MapSet.t()}ofDiff.address_key/1values. (Routes are owned by theirrtm_protocoltag, so they need no last-applied set.)
Inspect
#Linx.Netlink.Rtnl.Reconcile.Report<converged: 4 applied>
#Linx.Netlink.Rtnl.Reconcile.Report<2 applied, 1 failed, 3 pending>
Summary
Types
@type t() :: %Linx.Netlink.Rtnl.Reconcile.Report{ applied: [Linx.Netlink.Rtnl.Diff.op()], converged?: boolean(), failed: [{Linx.Netlink.Rtnl.Diff.op(), term()}], last_applied: %{optional(:addresses) => MapSet.t()}, pending: [Linx.Netlink.Rtnl.Diff.op()] }