1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//! RAII termination guard for the reindex task.
//!
//! Why: a Rust panic inside a `tokio::spawn` task unwinds that task silently
//! — the `broadcast::Sender` in `ReindexProgress` drops, live SSE subscribers
//! never receive a terminal frame, and the CLI reports "stream ended without
//! completion event" indefinitely. Placing this guard at the start of the
//! spawned future and calling `disarm()` only after `emit_complete_event`
//! completes ensures that ANY early exit (panic, early return, or `.await`
//! cancellation) emits `{"event":"error","message":"…"}` before the sender
//! drops.
//!
//! What: holds `Arc<ReindexProgress>` and an `armed: bool` flag. `Drop`
//! checks the flag — if still armed, it pushes a blocking-channel send of
//! the error event directly onto the broadcast sender (no `.await` in `Drop`;
//! use `try_send`) and marks the progress status as `Failed`.
//!
//! Test: `reindex_guard_fires_on_early_return` in `tests.rs`.
use Arc;
use ;
/// RAII guard that emits a terminal SSE error event if the reindex task exits
/// without having emitted one via the normal path.
///
/// Why: ensures that ANY early exit from the spawned reindex task (panic,
/// early return, `.await` cancellation) emits `{"event":"error","message":"…"}`
/// so live SSE subscribers are never left hanging.
/// What: armed on construction; `Drop` fires the error event synchronously
/// when still armed. Call `disarm()` after the normal terminal event is emitted.
/// Test: `reindex_guard_fires_on_early_return`.
pub