Changelog
View Source0.7.2
Added
shackle:receive_response/2— likereceive_response/1but with a millisecond timeout. Returns{error, timeout}if no reply arrives within the window. The arity-1 variant still blocks indefinitely (unchanged).cast_error/0is now an exported type — the sumno_server | pool_not_started | shackle_not_startedof atoms thatcast/2..4can return.
Changed
cast/2..4andcall/2,3error specs tightened from{error, atom()}/{error, term()}to{error, cast_error()}. No behavioural change; dialyzer now flags{error, typo}at call sites that don't match the sum. Existingno_server | pool_not_started | shackle_not_startedwere the only atoms ever returned.Latency measurement in
shackle_serverswitched fromos:timestamp/0+timer:now_diff/2toerlang:monotonic_time(microsecond)+ subtraction. The monotonic clock isn't NTP-jumpable and skips the kernel call, so latency telemetry now stays accurate across clock skew events and shaves ~50ns off per request.The
#cast.timestampfield type changed fromerlang:timestamp/0(the 3-tuple) tointeger()(microsecond monotonic). The field is internal — clients that don't destructure the cast record see no impact. Custom shackle_client behaviours that readCast#cast.timestampreceive an integer now.vsninshackle.app.srcis now an explicit string ("0.7.2") — wasgit, which only resolved correctly when building from a checkout.
0.7.1
Changed
- Bumped
foildependency from0.1.3to0.1.4(CI/infrastructure refresh;error/0type tightened; macro-based DRY refactor with no perf change). - Bumped
metaldependency from0.1.1to0.1.2(CI/infrastructure refresh; onesystem_continue/3spec fix fromoktono_return()).
No source changes in shackle itself. Behaviour, API, and benchmarks are identical to 0.7.0.
0.7.0
Breaking
- Minimum supported Erlang/OTP version is now 25. OTP 21–24 are no longer tested and the compatibility code paths for those releases have been removed.
Changed
Replaced the
granderldependency withknot(in-house C NIF using wyrand).shackle_utils:random/1now callsknot:uniform/1— same signature, same range guarantees, no behavioural difference at call sites.granderl 0.1.5on hex.pm fails to build on OTP 27+ (itspreamble.shinvokeserl -noshell -s init stop -eval ...with options in an order that causes the node to terminate before-evalruns, leavingERTS_INCLUDE_DIRempty); the fix exists in granderl's master but its hex package is not under our ownership, so we couldn't release a fix.knotis a tiny C NIF (~80 LOC) that builds correctly on every supported OTP and matches hand-written C dispatch overhead. Benchmarks (Apple Silicon, OTP 29, 10M iterations ofuniform(254), median of 5 runs):conc rand:uniform/1 granderl:uniform/1 knot:uniform/1 1 34 ns 13 ns 12 ns 8 9 ns 7 ns 3.3 ns 32 6 ns 8 ns 3.2 ns 128 6 ns 8.5 ns 3.1 ns CI matrix now covers OTP 25, 26, 27, and 28;
actions/checkoutupgraded to v5.telemetrydependency bumped from 1.2.1 to 1.4.2.README documents the full set of telemetry events shackle emits and their measurement shapes.
Removed
ATOMICS,DECENTRALIZED_COUNTERS,ETS_TAKE, andSSL_HANDSHAKEplatform_define macros.OTP_RELEASEifdef block inshackle_internal.hrland the associated pre-OTP-21 logger / stacktrace fallbacks.shackle_utils:info_msg/3andshackle_utils:warning_msg/3.- ETS-based fallback path in
shackle_status(the persistent_term + counters path is now unconditional).
0.6.20
See git history for details.