Commit 6d85d59
authored
perf: speed up firecracker standby with diff snapshot reuse (#146)
* fix: skip unsupported graceful shutdown wait
Avoid spending standby time waiting for hypervisors without a shutdown API to exit gracefully when the process will need an immediate kill anyway.
Made-with: Cursor
* perf: reuse firecracker diff snapshot bases
Keep a hidden Firecracker diff snapshot base across restores so standby only writes changed pages while preserving the existing standby snapshot semantics exposed to users.
Made-with: Cursor
* refactor: model snapshot base reuse as a capability
Express retained snapshot-base behavior through hypervisor capabilities and generic snapshot-base paths so the diff snapshot optimization does not leak Firecracker-specific semantics.
Made-with: Cursor
* refactor: register hypervisor capabilities by type
Move static hypervisor capabilities into a type-level registry so snapshot base reuse checks do not depend on starter instances or zero-value client construction.
Made-with: Cursor
* refactor: model graceful VMM shutdown as a capability
Use explicit hypervisor capabilities to decide whether standby should attempt a graceful VMM shutdown, keeping unsupported shutdown semantics out of the core control flow.
Made-with: Cursor
* fix: discard promoted snapshot bases after snapshot errors
Avoid reusing partially written retained snapshot bases after standby snapshot failures, and lock in the rollback behavior with a regression test.
Made-with: Cursor
* refactor: simplify standby shutdown fallback handling
Skip the graceful-exit wait when a hypervisor cannot shut down its VMM cleanly, and log best-effort resume failures so standby recovery errors are visible.
Made-with: Cursor
* refactor: clarify standby shutdown control flow
Restore the structural shutdown comments and split the graceful-exit decision into explicit branches so unsupported shutdown paths are easier to follow.
Made-with: Cursor
* fix: fall back to full firecracker snapshots without a base
Use full Firecracker snapshots when the retained memory base is missing so first-time standby and post-failure retries do not produce incomplete diff snapshots.
Made-with: Cursor
* test: cover firecracker full and diff standby cycles
Exercise Firecracker standby/restore with guest file persistence across the initial full snapshot cycle and a subsequent retained-base diff snapshot cycle, and log the observed timings in the integration test.
Made-with: Cursor
* refactor: align retained base cleanup and kill helpers
Rename the standby-only SIGKILL helper to avoid colliding with the stop-path implementation, and only clean up retained snapshot bases on stop for hypervisors that actually support snapshot base reuse.
Made-with: Cursor
* test: log firecracker standby timings without strict thresholds
Keep the full-versus-diff standby timing data in the Firecracker integration test while avoiding hard CI assertions on runner-dependent latency.
Made-with: Cursor
* test: relax TAP operstate assertions
Keep the network integration checks focused on TAP existence, bridge attachment, and end-to-end connectivity instead of requiring a specific oper state that varies on the shared runner.
Made-with: Cursor
* fix: clear stale snapshot targets before retrying standby
Discard leftover snapshot-latest scratch state before promoting a retained base so failed Firecracker standby attempts can retry cleanly instead of getting stuck on a stale diff snapshot target.
Made-with: Cursor1 parent c95fad2 commit 6d85d59
19 files changed
Lines changed: 405 additions & 75 deletions
File tree
- lib
- hypervisor
- cloudhypervisor
- firecracker
- qemu
- vz
- instances
- paths
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
35 | 39 | | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
42 | 48 | | |
43 | 49 | | |
44 | 50 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
203 | 208 | | |
204 | 209 | | |
205 | 210 | | |
206 | | - | |
| 211 | + | |
207 | 212 | | |
208 | 213 | | |
209 | 214 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
5 | 7 | | |
6 | 8 | | |
| |||
59 | 61 | | |
60 | 62 | | |
61 | 63 | | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
66 | 82 | | |
67 | 83 | | |
68 | 84 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
50 | 54 | | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
57 | 63 | | |
58 | 64 | | |
59 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
48 | 52 | | |
49 | 53 | | |
50 | 54 | | |
| |||
74 | 78 | | |
75 | 79 | | |
76 | 80 | | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
77 | 92 | | |
78 | 93 | | |
79 | 94 | | |
| |||
197 | 212 | | |
198 | 213 | | |
199 | 214 | | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
200 | 223 | | |
201 | 224 | | |
202 | 225 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| 46 | + | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
40 | 44 | | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
46 | | - | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
47 | 53 | | |
48 | 54 | | |
49 | 55 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
74 | 78 | | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
81 | 87 | | |
82 | 88 | | |
83 | 89 | | |
| |||
0 commit comments