barrel_p2p_hyparview (barrel_p2p v0.1.0)

View Source

Summary

Functions

Test-support: refuse overlay links to Nodes - drop them from the active/passive views, stop gossiping to them, and never (re)connect them - until unblock_peers/0. Holds a partition that disconnect_node alone cannot (HyParView would re-dial via passive promotion). Inert in normal operation: nothing calls it and the blocked set defaults empty.

Test-support: clear the blocked set (heal the partition).

Types

hyparview_msg/0

-type hyparview_msg() ::
          {join,
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {forward_join,
           NewPeer ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined},
           TTL :: integer(),
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {disconnect,
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {neighbor,
           Priority :: high | low,
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {neighbor_reply,
           Accept :: boolean(),
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {shuffle,
           TTL :: integer(),
           Peers ::
               [#peer{id :: node(),
                      address :: inet:ip_address() | undefined,
                      port :: inet:port_number() | undefined,
                      quic_port :: inet:port_number() | undefined,
                      connected :: boolean(),
                      priority :: high | low,
                      last_seen :: integer() | undefined,
                      fail_count :: non_neg_integer(),
                      backoff_until :: integer() | undefined}],
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}} |
          {shuffle_reply,
           Peers ::
               [#peer{id :: node(),
                      address :: inet:ip_address() | undefined,
                      port :: inet:port_number() | undefined,
                      quic_port :: inet:port_number() | undefined,
                      connected :: boolean(),
                      priority :: high | low,
                      last_seen :: integer() | undefined,
                      fail_count :: non_neg_integer(),
                      backoff_until :: integer() | undefined}],
           Sender ::
               #peer{id :: node(),
                     address :: inet:ip_address() | undefined,
                     port :: inet:port_number() | undefined,
                     quic_port :: inet:port_number() | undefined,
                     connected :: boolean(),
                     priority :: high | low,
                     last_seen :: integer() | undefined,
                     fail_count :: non_neg_integer(),
                     backoff_until :: integer() | undefined}}.

Functions

active_view()

-spec active_view() -> [node()].

block_peers(Nodes)

-spec block_peers([node()]) -> ok.

Test-support: refuse overlay links to Nodes - drop them from the active/passive views, stop gossiping to them, and never (re)connect them - until unblock_peers/0. Holds a partition that disconnect_node alone cannot (HyParView would re-dial via passive promotion). Inert in normal operation: nothing calls it and the blocked set defaults empty.

cleanup_passive_view()

-spec cleanup_passive_view() -> ok.

get_churn_stats()

-spec get_churn_stats() -> {Joins :: non_neg_integer(), Leaves :: non_neg_integer()}.

handle_call(Request, From, State)

handle_cast(Msg, State)

handle_info(Info, State)

handle_msg(Msg, From)

-spec handle_msg(hyparview_msg(), node()) -> ok.

init(Config)

initiate_shuffle(Target, ShuffleLength)

-spec initiate_shuffle(node(), pos_integer()) -> ok.

join(ContactNode)

-spec join(node()) -> ok | {error, term()}.

leave()

-spec leave() -> ok.

passive_view()

-spec passive_view() -> [node()].

peer_connected(Node, DHandle)

-spec peer_connected(node(), term()) -> ok.

peer_disconnected(Node, Reason)

-spec peer_disconnected(node(), term()) -> ok.

peer_failed(Node, Reason)

-spec peer_failed(node(), term()) -> ok.

start_link(Config)

terminate(Reason, State)

unblock_peers()

-spec unblock_peers() -> ok.

Test-support: clear the blocked set (heal the partition).