···206206 #[cfg(feature = "indexer_stream")]
207207 #[derive(Clone, Debug)]
208208 pub(crate) enum BroadcastEvent {
209209- #[allow(dead_code)]
210210- Persisted(u64),
209209+ Persisted(#[allow(dead_code)] u64),
210210+ /// a durable record event with optional inline block bytes for live tailing.
211211+ ///
212212+ /// used to avoid re-reading `events`/`blocks` from the database when tailing.
213213+ LiveRecord(std::sync::Arc<super::LiveRecordEvent>),
211214 Ephemeral(Box<MarshallableEvt<'static>>),
212215 }
213216···423426 pub data: StoredData,
424427}
425428429429+/// a durable record event that is also emitted on the in-memory stream after commit.
430430+///
431431+/// `inline_block` is only used for live tailing to avoid loading the record block from `blocks`.
432432+/// cursor replay continues to read from the database.
433433+#[cfg(feature = "indexer_stream")]
434434+#[derive(Debug, Clone)]
435435+pub(crate) struct LiveRecordEvent {
436436+ pub id: u64,
437437+ pub stored: StoredEvent<'static>,
438438+ pub inline_block: Option<Bytes>,
439439+}
440440+426441#[cfg(feature = "relay")]
427442#[derive(Clone)]
428443pub(crate) enum RelayBroadcast {
429444 Persisted(#[allow(dead_code)] u64),
430445 #[allow(dead_code)]
431431- Ephemeral(bytes::Bytes),
446446+ Ephemeral(u64, bytes::Bytes),
432447}
+39-9
tests/run_all.nu
···2121}
22222323def run-test [] {
2424- let result = (with-env {
2424+ let name = $in.name
2525+ let base_env = {
2526 HYDRANT_API_PORT: $in.api
2627 HYDRANT_DEBUG_PORT: $in.debug
2728 HYDRANT_TEST_MOCK_PORT: $in.mock
2828- HYDRANT_BINARY: "target/x86_64-unknown-linux-gnu/debug/hydrant"
2929- } {
3030- ^nu $"tests/($in.name).nu" | complete
2929+ }
3030+ let binary = $in.binary?
3131+ let env_vars = if $binary == null { $base_env } else { $base_env | insert HYDRANT_BINARY $binary }
3232+3333+ let result = (with-env $env_vars {
3434+ ^nu $"tests/($name).nu" | complete
3135 })
3236 {
3333- name: $in.name
3737+ name: $name
3438 success: ($result.exit_code == 0)
3539 output: $result.stdout
3640 stderr: $result.stderr
4141+ }
4242+}
4343+4444+def test-needs-relay-binary [name: string] {
4545+ # tests that build a relay-only binary must run last (and serially) to avoid racing on
4646+ # `target/` artifacts while other tests are executing.
4747+ try {
4848+ open --raw $"tests/($name).nu" | str contains "build-hydrant-relay"
4949+ } catch {
5050+ false
3751 }
3852}
3953···6478 }
6579 let ports = get_free_ports (($tests | length) * 3)
66808181+ let relay_tests = $tests | where {|t| test-needs-relay-binary $t }
8282+6783 mut assigned = []
6884 for test in ($tests | enumerate) {
6985 let p = {($test | get index) * 3 + $in}
8686+ let name = ($test | get item)
8787+ let binary = if ($relay_tests | any {$in == $name}) { null } else { "target/x86_64-unknown-linux-gnu/debug/hydrant" }
7088 let entry = {
7171- name: ($test | get item),
8989+ name: $name,
7290 api: ($ports | get (0 | do $p)),
7391 debug: ($ports | get (1 | do $p)),
7474- mock: ($ports | get (2 | do $p))
9292+ mock: ($ports | get (2 | do $p)),
9393+ binary: $binary,
7594 }
7695 $assigned = ($assigned | append $entry)
7796 }
9797+9898+ let relay_assigned = $assigned | where {|t| $t.binary == null }
9999+ let parallel_assigned = $assigned | where {|t| $t.binary != null }
7810079101 let groups = {
80102 "authenticated_stream": "event_dependent",
81103 "count_tracking": "event_dependent",
82104 "signal_filter": "event_dependent",
83105 }
8484- let grouped = $assigned | group-by {|t| $groups | get -o $t.name | default $t.name}
106106+ let grouped = $parallel_assigned | group-by {
107107+ let name = $in.name
108108+ $groups | get -o $name | default $name
109109+ }
8511086111 print $"running ($assigned | length) tests...\n"
112112+ if not ($relay_assigned | is-empty) {
113113+ print $"note: relay-binary tests will run last and not in parallel: (($relay_assigned | get name) | str join ', ')\n"
114114+ }
8711588116 let run_group = {each {timeit -o {run-test} | {time: $in.time, ...$in.output}}};
8989- let results = $grouped | values | par-each {do $run_group} | flatten
117117+ let parallel_results = $grouped | values | par-each {do $run_group} | flatten
118118+ let relay_results = if ($relay_assigned | is-empty) { [] } else { $relay_assigned | do $run_group }
119119+ let results = $parallel_results | append $relay_results
9012091121 print "\n=== results ===\n"
92122 for r in $results {