Releases: b-erdem/hyparview
Releases · b-erdem/hyparview
v0.2.0
First minor release. Highlights:
Fixed
- Race: late
NEIGHBOR_REPLYre-adding a dead peer to the active view (#1). State now keeps a smallrecently_lostdeny-list of peer ids evicted viaconnection_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.Transportcallback signature:listen/2now takes a 1-arityevent_callbackinstead of a 2-aritydelivercallback. Events are{:message, peer, msg}and{:peer_lost, peer}.
Added
HyParView.Transport.TCPauto-signals{:peer_lost, peer}on TCP close — reactive recovery fires without applications needing to callconnection_lost/2themselves.TCP_NODELAYenabled on every Transport socket — short protocol messages no longer wait up to 40ms for Nagle. Found via thehyparview_pubsub_benchcompanion project.HyParView.subscribe/3:replayoption for late subscribers.HyParView.Telemetry.Metrics— pre-builtTelemetry.Metricsdefinitions; 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
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 paperHyParView.Protocol— versioned wire format with:safedecodeHyParView.Config— paper-default configuration with validationHyParView.State— pure functional protocol coreHyParView.Server—GenServerwrappingStatewith timers, transport, subscribers, telemetryHyParView.Transport— pluggable transport behaviourHyParView.Transport.Test— in-process transport for testsHyParView.Transport.TCP—:gen_tcp+ per-peer:gen_statemconnectionHyParView.Telemetry— event catalog and prefix helpers
Quality gates
- 7 doctests, 14 properties, 93 tests
mix credo --strict: cleanmix 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"}]
endReferences
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_lostfrom TCP-close — apps must callHyParView.connection_lost/2themselves on failure for now