@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 +39 -0
- package/generate_bp_pi_report.sh +57 -7
- package/package.json +1 -1
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
|
package/generate_bp_pi_report.sh
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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\`,
|
|
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
|