Changelog
View Source0.4.6
Added
bootstrap_retry_msapplication env option (default:500). Whenmarina_pool_serverfails to reach anybootstrap_ipshost on startup, it retries on this interval. Previously hardcoded to 500ms; deployments behind slow-DNS or transient network outages can now back the retry off without forking marina.
Plan-time notes
- B2's "fuse the body-skip pipeline" recommendation was checked on
inspection and not acted on:
skip_tracing,skip_warnings, andskip_custom_payloadinmarina_body.erleach peel a small fixed-or-counted prefix off the head of the binary -- they don't re-scan the body. The recommended fusion produces no measurable win and adds branching complexity, so it stays as three small passes. - B2's "property-based ring tests" item is deferred with A4 (the property-test umbrella task).
0.4.5
Changed
error/0is now{error, error_reason()}whereerror_reason/0is a documented sum type — was{error, term()}, which gave dialyzer nothing to check at call sites. The sum covers:marina_pool_not_startedandtimeout(marina-level)cql_error()—{Code :: pos_integer(), Msg :: binary()}, the Cassandra/Scylla server-side error tupleno_server,pool_not_started,shackle_not_started(shackle errors that propagate through marina)
cql_error/0is exported as a public type so callers can pattern- match against it cleanly.marina_body:decode/1spec corrected: was{error, atom()}, is actually{error, cql_error()}— the{Code, Msg}shape was documented but the spec contradicted it. Real bug; dialyzer was silently acceptingatom()because no caller was destructuring.Four
marina_typesspec corrections (real correctness bugs, not just imprecision):decode_short_bytes/1anddecode_string/1can return{null, binary()}on the 0xFFFF sentinel; specs claimed{binary(), binary()}.encode_bytes/1andencode_short_bytes/1acceptnullas input (encoded as the sentinel); specs claimedbinary()only.
No behavioural change — the functions handled
nullcorrectly already, the specs just lied about it.
No source changes beyond the type tightening; existing callers
continue to work unchanged. Dialyzer now flags {error, typo}
at call sites that don't match the sum.
0.4.4
Added
Two telemetry events at the request boundary:
Event Measurements Metadata [marina, request, sent]count => 1operation, pool, async[marina, request, error]count => 1operation, reasonsentfires at each shackle dispatch — once per query/batch/prepare/ execute.reusable_querywith a cache miss fires twice (preparethenexecute), giving an accurate count of CQL ops. Theerrorevent fires whenmarina_pool:node/1returns no pool (e.g.marina_pool_not_started). Attach handlers viatelemetry:attach/4.Per-request shackle lifecycle (queue / send / receive) remains observable via shackle's own telemetry — marina's events surface the CQL-level intent without duplicating that work.
telemetry(1.4.2) is now a direct dependency (was already transitively present via shackle).vsninmarina.app.srcis now an explicit string ("0.4.4") — wasgit, which only works when built from a checkout.
No source or API changes beyond the instrumentation.
0.4.3
Changed
- Replaced
lz4git ref (lpgauth/erlang-lz4) with the new in-houselz4_nifhex package (0.1.1).marina_utils:pack/1' andunpack/1' calllz4_nif:compress/2' andlz4_nif:uncompress/2' respectively — same API, same return shape. - Replaced
murmurgit ref (lpgauth/murmur) with the new in-housemurmur_nifhex package (0.1.0).marina_token:m3p/1' callsmurmur_nif:murmur3_cassandra_x64_128/1'. Byte-for-byte compatible with the legacy fork (verified across inputs with high-byte sequences where the signed/unsigned variant difference matters); same token integers, no routing changes.
Both new NIFs follow the same standards as the rest of the
ecosystem: vendored upstream source, raw NIF (no rustler runtime),
dirty CPU scheduler for inputs above 20 KB, enif_consume_timeslice
accounting on the inline path, hex publish config, CI matrix
covering OTP 25-28, MIT license for the wrapper plus the upstream
license for the vendored code.
With this swap marina's only remaining non-hex deps are the plumbing inside its test profile (fprofx git ref).
0.4.2
Infrastructure refresh: dependency bumps + docs migration.
Changed
- Bumped
shacklefrom git ref0.6.20to hex0.7.1. shackle 0.7.1 replaces granderl with knot (in-house C NIF), so marina's transitive granderl dependency is gone — fixing the OTP 27+ build break that affected anything depending ongranderl 0.1.5from hex.pm. - Bumped
foilfrom git ref0.1.3to hex0.1.4(tightenederror/0type, internal DRY refactor; behaviour unchanged). fprofxtest-profile dep moved from theransomr/fprofxfork tolpgauth/fprofx(otp_19branch), matching the rest of the ecosystem.- Documentation migrated from
edowntorebar3_ex_doc.
Removed
- Direct
granderldep entry (was unused by marina source — it sat in the dep tree only because the old shackle ref pulled it in).