Home / Input Output / hermes
Nov 12, 10-11 AM (1)
Nov 12, 11-12 PM (5)
Nov 12, 12-1 PM (2)
Nov 12, 1-2 PM (2)
Nov 12, 2-3 PM (0)
Nov 12, 3-4 PM (0)
Nov 12, 4-5 PM (0)
Nov 12, 5-6 PM (0)
Nov 12, 6-7 PM (0)
Nov 12, 7-8 PM (0)
Nov 12, 8-9 PM (0)
Nov 12, 9-10 PM (0)
Nov 12, 10-11 PM (0)
Nov 12, 11-12 AM (0)
Nov 13, 12-1 AM (0)
Nov 13, 1-2 AM (1)
Nov 13, 2-3 AM (0)
Nov 13, 3-4 AM (0)
Nov 13, 4-5 AM (0)
Nov 13, 5-6 AM (0)
Nov 13, 6-7 AM (2)
Nov 13, 7-8 AM (0)
Nov 13, 8-9 AM (7)
Nov 13, 9-10 AM (0)
Nov 13, 10-11 AM (2)
Nov 13, 11-12 PM (13)
Nov 13, 12-1 PM (1)
Nov 13, 1-2 PM (2)
Nov 13, 2-3 PM (0)
Nov 13, 3-4 PM (0)
Nov 13, 4-5 PM (0)
Nov 13, 5-6 PM (0)
Nov 13, 6-7 PM (0)
Nov 13, 7-8 PM (0)
Nov 13, 8-9 PM (0)
Nov 13, 9-10 PM (0)
Nov 13, 10-11 PM (0)
Nov 13, 11-12 AM (0)
Nov 14, 12-1 AM (0)
Nov 14, 1-2 AM (1)
Nov 14, 2-3 AM (0)
Nov 14, 3-4 AM (0)
Nov 14, 4-5 AM (0)
Nov 14, 5-6 AM (0)
Nov 14, 6-7 AM (0)
Nov 14, 7-8 AM (0)
Nov 14, 8-9 AM (4)
Nov 14, 9-10 AM (1)
Nov 14, 10-11 AM (1)
Nov 14, 11-12 PM (0)
Nov 14, 12-1 PM (2)
Nov 14, 1-2 PM (0)
Nov 14, 2-3 PM (0)
Nov 14, 3-4 PM (0)
Nov 14, 4-5 PM (0)
Nov 14, 5-6 PM (0)
Nov 14, 6-7 PM (0)
Nov 14, 7-8 PM (0)
Nov 14, 8-9 PM (0)
Nov 14, 9-10 PM (0)
Nov 14, 10-11 PM (0)
Nov 14, 11-12 AM (0)
Nov 15, 12-1 AM (0)
Nov 15, 1-2 AM (0)
Nov 15, 2-3 AM (0)
Nov 15, 3-4 AM (0)
Nov 15, 4-5 AM (0)
Nov 15, 5-6 AM (0)
Nov 15, 6-7 AM (0)
Nov 15, 7-8 AM (0)
Nov 15, 8-9 AM (0)
Nov 15, 9-10 AM (0)
Nov 15, 10-11 AM (0)
Nov 15, 11-12 PM (0)
Nov 15, 12-1 PM (0)
Nov 15, 1-2 PM (0)
Nov 15, 2-3 PM (0)
Nov 15, 3-4 PM (0)
Nov 15, 4-5 PM (0)
Nov 15, 5-6 PM (0)
Nov 15, 6-7 PM (0)
Nov 15, 7-8 PM (0)
Nov 15, 8-9 PM (0)
Nov 15, 9-10 PM (0)
Nov 15, 10-11 PM (0)
Nov 15, 11-12 AM (0)
Nov 16, 12-1 AM (0)
Nov 16, 1-2 AM (0)
Nov 16, 2-3 AM (0)
Nov 16, 3-4 AM (0)
Nov 16, 4-5 AM (0)
Nov 16, 5-6 AM (0)
Nov 16, 6-7 AM (0)
Nov 16, 7-8 AM (0)
Nov 16, 8-9 AM (0)
Nov 16, 9-10 AM (0)
Nov 16, 10-11 AM (0)
Nov 16, 11-12 PM (0)
Nov 16, 12-1 PM (0)
Nov 16, 1-2 PM (0)
Nov 16, 2-3 PM (0)
Nov 16, 3-4 PM (0)
Nov 16, 4-5 PM (0)
Nov 16, 5-6 PM (0)
Nov 16, 6-7 PM (0)
Nov 16, 7-8 PM (0)
Nov 16, 8-9 PM (0)
Nov 16, 9-10 PM (0)
Nov 16, 10-11 PM (0)
Nov 16, 11-12 AM (0)
Nov 17, 12-1 AM (0)
Nov 17, 1-2 AM (0)
Nov 17, 2-3 AM (0)
Nov 17, 3-4 AM (0)
Nov 17, 4-5 AM (0)
Nov 17, 5-6 AM (1)
Nov 17, 6-7 AM (0)
Nov 17, 7-8 AM (0)
Nov 17, 8-9 AM (0)
Nov 17, 9-10 AM (1)
Nov 17, 10-11 AM (2)
Nov 17, 11-12 PM (0)
Nov 17, 12-1 PM (0)
Nov 17, 1-2 PM (0)
Nov 17, 2-3 PM (0)
Nov 17, 3-4 PM (0)
Nov 17, 4-5 PM (0)
Nov 17, 5-6 PM (0)
Nov 17, 6-7 PM (0)
Nov 17, 7-8 PM (0)
Nov 17, 8-9 PM (0)
Nov 17, 9-10 PM (1)
Nov 17, 10-11 PM (0)
Nov 17, 11-12 AM (3)
Nov 18, 12-1 AM (0)
Nov 18, 1-2 AM (0)
Nov 18, 2-3 AM (0)
Nov 18, 3-4 AM (0)
Nov 18, 4-5 AM (0)
Nov 18, 5-6 AM (0)
Nov 18, 6-7 AM (0)
Nov 18, 7-8 AM (0)
Nov 18, 8-9 AM (3)
Nov 18, 9-10 AM (2)
Nov 18, 10-11 AM (1)
Nov 18, 11-12 PM (4)
Nov 18, 12-1 PM (5)
Nov 18, 1-2 PM (1)
Nov 18, 2-3 PM (1)
Nov 18, 3-4 PM (0)
Nov 18, 4-5 PM (0)
Nov 18, 5-6 PM (0)
Nov 18, 6-7 PM (3)
Nov 18, 7-8 PM (0)
Nov 18, 8-9 PM (0)
Nov 18, 9-10 PM (0)
Nov 18, 10-11 PM (0)
Nov 18, 11-12 AM (0)
Nov 19, 12-1 AM (0)
Nov 19, 1-2 AM (0)
Nov 19, 2-3 AM (0)
Nov 19, 3-4 AM (0)
Nov 19, 4-5 AM (0)
Nov 19, 5-6 AM (2)
Nov 19, 6-7 AM (2)
Nov 19, 7-8 AM (2)
Nov 19, 8-9 AM (2)
Nov 19, 9-10 AM (0)
Nov 19, 10-11 AM (0)
83 commits this week Nov 12, 2025 - Nov 19, 2025
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and OOM kills during blockchain indexing.

Problem:
Network produces blocks at high throughput (100s/sec) while WASM processes
significantly slower. Resources are created in DashMap BEFORE bounded event
queue send() can apply backpressure. Even with a 10K bounded channel, resources
accumulate in memory while waiting for queue space, leading to unbounded growth
and OOM kills (exit code 137) within minutes.

Solution:
Rate limit block processing using tokio::time::interval at the TOP of the
subscription loop, before pulling blocks from the network. This matches resource
creation rate to WASM consumption rate (~100 blocks/sec), preventing accumulation.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining resource lifecycle and ordering problem
- Add TODO for future lazy resource creation approach

Works in conjunction with bounded event queue (10K capacity) - both mechanisms
are required because resources exist before backpressure can apply.

Note: Rate limiting is a pragmatic fix for the current event-driven architecture.
Long-term solution should use lazy resource creation (send Arc<BlockData> in
events, create resources on-demand when WASM accesses them) to eliminate the
ordering problem entirely
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and system freezes during blockchain indexing.

The network can produce hundreds of blocks per second during historical sync,
but WASM processing is significantly slower (~30-50 blocks/sec). Without rate
limiting, resources accumulate in the DashMap faster than they can be consumed,
leading to unbounded memory growth and eventual OOM kills.

The rate limiter works in conjunction with the bounded event queue (10K capacity)
to provide complete backpressure control. Resources are created before the bounded
channel send() can block, so throttling at the production point is essential.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining the resource lifecycle and why both
  bounded channels and rate limiting are necessary

This replaces the previous sleep-based throttle with a more idiomatic
tokio::time::interval approach that explicitly controls block polling rate.
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and system freezes during blockchain indexing.

The network can produce hundreds of blocks per second during historical sync,
but WASM processing is significantly slower (~30-50 blocks/sec). Without rate
limiting, resources accumulate in the DashMap faster than they can be consumed,
leading to unbounded memory growth and eventual OOM kills.

The rate limiter works in conjunction with the bounded event queue (10K capacity)
to provide complete backpressure control. Resources are created before the bounded
channel send() can block, so throttling at the production point is essential.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining the resource lifecycle and why both
  bounded channels and rate limiting are necessary

This replaces the previous sleep-based throttle with a more idiomatic
tokio::time::interval approach that explicitly controls block polling rate.
Merge fix/cardano-rte-thread: combine timeout/throttling with handle approach
Resolved merge conflicts by combining:
- Our branch: timeouts + throttling + shared lock optimizations
- Their branch: handle.block_on() pattern + .clone() calls

Final implementation:
- Uses handle.block_on() for cleaner code
- Keeps timeout mechanism for robustness
- Maintains throttling for indexing performance
- Preserves shared lock optimizations from our branch
- Uses .clone() where needed for network ownership
fix: eliminate DashMap resize deadlocks and reduce lock contention
Prevents deadlocks caused by DashMap resize operations locking all shards
simultaneously under high concurrency (100+ subscription threads).

- Increase DashMap capacity to 512K in ResourceStorage and ApplicationResourceStorage
  to prevent resize operations that require locking all 2048 shards
- Convert 10 cardano host functions from exclusive to shared locks for read-only operations
  (subscribe_block, get_block, get_tips, transaction queries, etc.)

Root cause: DashMap resize with 1K initial capacity triggered under production load,
causing threads to deadlock in lock_exclusive_slow() during concurrent inserts.

Impact: Eliminates resize deadlocks and dramatically reduces lock contention.
fix: eliminate DashMap resize deadlocks and reduce lock contention
Prevents deadlocks caused by DashMap resize operations locking all shards
simultaneously under high concurrency (100+ subscription threads).

- Increase DashMap capacity to 512K in ResourceStorage and ApplicationResourceStorage
  to prevent resize operations that require locking all 2048 shards
- Convert 10 cardano host functions from exclusive to shared locks for read-only operations
  (subscribe_block, get_block, get_tips, transaction queries, etc.)

Root cause: DashMap resize with 1K initial capacity triggered under production load,
causing threads to deadlock in lock_exclusive_slow() during concurrent inserts.

Impact: Eliminates resize deadlocks and dramatically reduces lock contention.