@blinklabs/dingo 0.27.2 → 0.27.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/RELEASE_NOTES.md CHANGED
@@ -1,6 +1,45 @@
1
1
  # Release Notes
2
2
 
3
3
 
4
+ ## v0.27.2 (March 16, 2026)
5
+
6
+ **Title:** Snapshot events and safer services
7
+
8
+ **Date:** March 16, 2026
9
+
10
+ **Version:** v0.27.2
11
+
12
+ Hi folks! Here’s what we shipped in v0.27.2.
13
+
14
+ ### ✨ What's New
15
+
16
+ - **Snapshot event publishing and clean shutdown:** Relay operation is more reliable because the relay now publishes events from snapshots and shuts down cleanly without dropping in-flight work.
17
+
18
+ ### 💪 Improvements
19
+
20
+ - **HTTP timeouts for public APIs:** Network-facing services are more resilient under slow or stalled connections thanks to new write/read/idle timeouts on the Bark, Blockfrost, and UTxO RPC HTTP servers.
21
+ - **Streamlined peer and connection management:** Peer and connection management is faster and uses fewer resources on constrained machines thanks to quicker inbound host lookups, tighter Badger cache defaults, and expanded benchmarks and sizing guidance.
22
+ - **More consistent key-period handling:** Block production key period handling is more consistent across configurations thanks to improved key-period calculations with added validation and tests.
23
+ - **Race detection in CI:** Test runs catch concurrency bugs earlier because the Linux test job now runs with the Go race detector enabled.
24
+
25
+ ### 🔧 Fixes
26
+
27
+ - **Safer concurrent chain reads:** Reads are more consistent under load because primary chain and protocol-parameter access are now protected with read locks.
28
+ - **Validated epoch nonce reuse:** Nonce reuse is safer because cached epoch nonce entries are now validated against the nonce provided for the current run before reuse.
29
+ - **Graceful invalid hash handling:** Malformed block metadata no longer crashes encoding because previous-hash length issues now return errors instead of panicking.
30
+ - **SQLite VACUUM actually runs:** Database maintenance now completes as intended because SQLite VACUUM is now executed rather than only prepared.
31
+
32
+ ### 📋 What You Need to Know
33
+
34
+ - **Release notes alignment:** Release documentation was updated to reflect the final set of changes, including a detailed v0.27.1 section in `RELEASE_NOTES.md`.
35
+ - **Build provenance updates:** Supply-chain attestations are easier to verify because build provenance now uses `actions/attest` and updated Docker Hub image subjects.
36
+
37
+ ### 🙏 Thank You
38
+
39
+ Thank you for trying!
40
+
41
+ ---
42
+
4
43
  ## v0.27.1 (March 16, 2026)
5
44
 
6
45
  **Title:** Smoother reconnects and safer chain-sync
@@ -8,6 +8,11 @@ CACHE_DIR="${CACHE_DIR:-/tmp/dingo-bp-pi-go-cache}"
8
8
  GOMAXPROCS_VALUE="${GOMAXPROCS_VALUE:-4}"
9
9
  BENCH_TIME="${BENCH_TIME:-5s}"
10
10
  IMMUTABLE_PATH="${IMMUTABLE_PATH:-database/immutable/testdata}"
11
+ RSS_LIMIT_MB="${RSS_LIMIT_MB:-1024}"
12
+ GOMEMLIMIT_VALUE="${GOMEMLIMIT_VALUE:-}"
13
+ BLOCK_CACHE_SIZE_VALUE="${BLOCK_CACHE_SIZE_VALUE:-}"
14
+ INDEX_CACHE_SIZE_VALUE="${INDEX_CACHE_SIZE_VALUE:-}"
15
+ MEMTABLE_SIZE_VALUE="${MEMTABLE_SIZE_VALUE:-}"
11
16
  DEFAULT_DB_DIR="${DEFAULT_DB_DIR:-}"
12
17
  DEFAULT_LOG_FILE="${DEFAULT_LOG_FILE:-}"
13
18
  DB_DIR_BASE="${DB_DIR_BASE:-/tmp}"
@@ -16,6 +21,7 @@ TIME_FORMAT_STYLE=""
16
21
  TIME_CMD=()
17
22
  AUTO_DEFAULT_DB_DIR=0
18
23
  AUTO_DEFAULT_LOG_FILE=0
24
+ DINGO_CACHE_ARGS=()
19
25
 
20
26
  cleanup() {
21
27
  local exit_status=$?
@@ -197,18 +203,25 @@ run_load_profile() {
197
203
  validate_db_dir "$db_dir" "$log_file"
198
204
  rm -rf "$db_dir"
199
205
  : > "$log_file"
206
+ local -a env_args=(
207
+ PATH="$PATH"
208
+ HOME="${HOME:-/tmp}"
209
+ GOMAXPROCS="$GOMAXPROCS_VALUE"
210
+ DINGO_RUN_MODE=serve
211
+ DINGO_STORAGE_MODE=core
212
+ )
213
+ if [[ -n "$GOMEMLIMIT_VALUE" ]]; then
214
+ env_args+=(GOMEMLIMIT="$GOMEMLIMIT_VALUE")
215
+ fi
200
216
  env -i \
201
- PATH="$PATH" \
202
- HOME="${HOME:-/tmp}" \
203
- GOMAXPROCS="$GOMAXPROCS_VALUE" \
204
- DINGO_RUN_MODE=serve \
205
- DINGO_STORAGE_MODE=core \
217
+ "${env_args[@]}" \
206
218
  "${TIME_CMD[@]}" \
207
219
  ./dingo \
208
220
  --config /dev/null \
209
221
  --blob badger \
210
222
  --metadata sqlite \
211
223
  --data-dir "$db_dir" \
224
+ "${DINGO_CACHE_ARGS[@]}" \
212
225
  load "$IMMUTABLE_PATH" "$@" \
213
226
  > "$log_file" 2>&1
214
227
 
@@ -231,6 +244,16 @@ parse_metric() {
231
244
 
232
245
  configure_time_cmd
233
246
 
247
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" ]]; then
248
+ DINGO_CACHE_ARGS+=(--block-cache-size "$BLOCK_CACHE_SIZE_VALUE")
249
+ fi
250
+ if [[ -n "$INDEX_CACHE_SIZE_VALUE" ]]; then
251
+ DINGO_CACHE_ARGS+=(--index-cache-size "$INDEX_CACHE_SIZE_VALUE")
252
+ fi
253
+ if [[ -n "$MEMTABLE_SIZE_VALUE" ]]; then
254
+ DINGO_CACHE_ARGS+=(--memtable-size "$MEMTABLE_SIZE_VALUE")
255
+ fi
256
+
234
257
  DB_DIR_BASE="$(resolve_path "$DB_DIR_BASE")"
235
258
 
236
259
  if [[ -z "$DEFAULT_DB_DIR" ]]; then
@@ -279,6 +302,12 @@ if [[ ! "$default_rss_kb" =~ ^[0-9]+$ ]]; then
279
302
  fi
280
303
 
281
304
  default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
305
+ rss_limit_kb=$((RSS_LIMIT_MB * 1024))
306
+
307
+ if (( default_rss_kb > rss_limit_kb )); then
308
+ echo "error: peak RSS ${default_rss_mb} MB exceeds limit ${RSS_LIMIT_MB} MB" >&2
309
+ exit 1
310
+ fi
282
311
 
283
312
  {
284
313
  echo "# Four-Thread Block Producer Sizing Report (Non-Pi Host)"
@@ -287,7 +316,23 @@ default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
287
316
  printf -- "- \`storageMode=core\`\n"
288
317
  printf -- "- \`runMode=serve\`, \`blob=badger\`, \`metadata=sqlite\`\n"
289
318
  printf -- "- \`GOMAXPROCS=%s\`\n" "$GOMAXPROCS_VALUE"
319
+ printf -- "- target peak RSS: \`<= %s MB\`\n" "$RSS_LIMIT_MB"
290
320
  printf -- "- immutable fixture: \`%s\`\n" "$IMMUTABLE_PATH"
321
+ if [[ -n "$GOMEMLIMIT_VALUE" ]]; then
322
+ printf -- "- test-only \`GOMEMLIMIT=%s\`\n" "$GOMEMLIMIT_VALUE"
323
+ fi
324
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" || -n "$INDEX_CACHE_SIZE_VALUE" || -n "$MEMTABLE_SIZE_VALUE" ]]; then
325
+ echo "- explicit Badger test-only overrides:"
326
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" ]]; then
327
+ printf -- " - \`--block-cache-size=%s\`\n" "$BLOCK_CACHE_SIZE_VALUE"
328
+ fi
329
+ if [[ -n "$INDEX_CACHE_SIZE_VALUE" ]]; then
330
+ printf -- " - \`--index-cache-size=%s\`\n" "$INDEX_CACHE_SIZE_VALUE"
331
+ fi
332
+ if [[ -n "$MEMTABLE_SIZE_VALUE" ]]; then
333
+ printf -- " - \`--memtable-size=%s\`\n" "$MEMTABLE_SIZE_VALUE"
334
+ fi
335
+ fi
291
336
  echo "- measurements were collected on non-Pi hardware and are a sizing proxy, not Raspberry Pi device benchmarks"
292
337
  echo "- block producer peer count remains small; this is not a relay profile"
293
338
  echo
@@ -295,11 +340,16 @@ default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
295
340
  echo
296
341
  echo "| Profile | Elapsed | Peak RSS | Notes |"
297
342
  echo "| --- | --- | --- | --- |"
298
- printf -- "| \`core-default\` | \`%ss\` | \`%s MB\` | Current default \`serve/core\` cache profile |\n" "$default_elapsed" "$default_rss_mb"
343
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" || -n "$INDEX_CACHE_SIZE_VALUE" || -n "$MEMTABLE_SIZE_VALUE" || -n "$GOMEMLIMIT_VALUE" ]]; then
344
+ printf -- "| \`core-constrained\` | \`%ss\` | \`%s MB\` | Explicit test-only memory/cache overrides |\n" "$default_elapsed" "$default_rss_mb"
345
+ else
346
+ printf -- "| \`core-default\` | \`%ss\` | \`%s MB\` | Current default \`serve/core\` cache profile |\n" "$default_elapsed" "$default_rss_mb"
347
+ fi
299
348
  echo
300
349
  echo "## Recommendation"
301
350
  echo
302
- printf -- "For Raspberry Pi-class sizing in \`storageMode=core\`, the current default \`serve/core\` profile is already in the measured low-memory range on this four-thread non-Pi host.\n"
351
+ printf -- "For Raspberry Pi-class sizing in \`storageMode=core\`, keep production defaults aligned with normal Badger behavior and use explicit memory/cache constraints only in this harness when validating low-memory targets.\n"
352
+ printf -- "This run stayed under the configured \`%s MB\` RSS limit.\n" "$RSS_LIMIT_MB"
303
353
  echo "Explicit Badger cache settings still override these defaults if an operator wants to tune further."
304
354
  echo "Treat this as a sizing baseline rather than a direct Raspberry Pi hardware measurement."
305
355
  echo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinklabs/dingo",
3
- "version": "0.27.2",
3
+ "version": "0.27.3",
4
4
  "description": "Dingo is a Cardano blockchain data node",
5
5
  "main": "index.js",
6
6
  "bin": {