Skip to content

Releases: b-erdem/hyparview

v0.2.0

08 May 18:15

Choose a tag to compare

First minor release. Highlights:

Fixed

  • Race: late NEIGHBOR_REPLY re-adding a dead peer to the active view (#1). State now keeps a small recently_lost deny-list of peer ids evicted via connection_lost/2; the reply handler rejects only replies whose sender is in that set, everything else is accepted as before. Found and reproduced by Lockstep.

Changed (breaking)

  • HyParView.Transport callback signature: listen/2 now takes a 1-arity event_callback instead of a 2-arity deliver callback. Events are {:message, peer, msg} and {:peer_lost, peer}.

Added

  • HyParView.Transport.TCP auto-signals {:peer_lost, peer} on TCP close — reactive recovery fires without applications needing to call connection_lost/2 themselves.
  • TCP_NODELAY enabled on every Transport socket — short protocol messages no longer wait up to 40ms for Nagle. Found via the hyparview_pubsub_bench companion project.
  • HyParView.subscribe/3 :replay option for late subscribers.
  • HyParView.Telemetry.Metrics — pre-built Telemetry.Metrics definitions; drop into Prometheus / StatsD / any reporter. Optional dep on :telemetry_metrics ~> 1.0.

Tested

  • HyParView.PartitionTest — partition + heal property tests.
  • HyParView.ConnectionTest — Connection error-path coverage.
  • HyParView.ConnectionLostRaceTest — H1 regression test.
  • Coverage bumped to 89% (test-support modules excluded from the average).

See CHANGELOG.md for full notes and the upgrade impact of the breaking Transport change.

v0.1.0 — initial release

02 May 15:48

Choose a tag to compare

First release of hyparview, a clean Elixir implementation of the HyParView hybrid partial-view membership protocol from Leitão, Pereira, and Rodrigues (DSN 2007).

What's in the box

  • HyParView.Peer — opaque peer identity (id + address)
  • HyParView.Messages — the seven protocol messages from the paper
  • HyParView.Protocol — versioned wire format with :safe decode
  • HyParView.Config — paper-default configuration with validation
  • HyParView.State — pure functional protocol core
  • HyParView.ServerGenServer wrapping State with timers, transport, subscribers, telemetry
  • HyParView.Transport — pluggable transport behaviour
  • HyParView.Transport.Test — in-process transport for tests
  • HyParView.Transport.TCP:gen_tcp + per-peer :gen_statem connection
  • HyParView.Telemetry — event catalog and prefix helpers

Quality gates

  • 7 doctests, 14 properties, 93 tests
  • mix credo --strict: clean
  • mix dialyzer: clean (modulo two known-suppressed MapSet opacity false-positives)
  • mix format --check-formatted: clean

Tested coverage

  • Seven numbered view invariants (StateTest)
  • Wire-format round-trip (ProtocolTest)
  • JOIN + dual-TTL FORWARD_JOIN (JoinTest)
  • DISCONNECT + NEIGHBOR + reactive recovery (RecoveryTest)
  • SHUFFLE + SHUFFLE_REPLY (ShuffleTest)
  • Active-view symmetry (SymmetryTest)
  • Chaos + stress + determinism (ChaosTest)
  • Multi-process integration via Transport.Test (IntegrationTest)
  • Real-network integration via Transport.TCP (TCPTest)
  • Edge cases: lone node, concurrent joins, larger cluster, subscriber down events (ComprehensiveTest)
  • Telemetry events (TelemetryTest)

Install

def deps do
  [{:hyparview, "~> 0.1"}]
end

References

Out of scope for v0.1

  • Plumtree (broadcast layer) — separate library
  • Distributed registry / supervisor — see Horde
  • TLS / auth — wrap the transport behaviour
  • Auto-trigger of connection_lost from TCP-close — apps must call HyParView.connection_lost/2 themselves on failure for now