Repository navigation
Commit 6b6275d
Fix uninstall data-delete crash and uv cache-lock hang
Found while exercising `spin uninstall` end-to-end against a real default
data dir on this machine.
1. _delete_owned crashed mid-rmtree with FileNotFoundError on studio.sqlite3-
shm/-wal: SQLite checkpoints remove WAL sidecar files between rmtree's
directory listing and its per-file unlink, aborting the delete and leaving
the data dir half-deleted. Now pass an onerror that tolerates
FileNotFoundError (already-gone files) but still surfaces real errors like
PermissionError, plus a best-effort final sweep.
2. _uv_cleanup hung indefinitely when the uv cache lock was held. The first
attempt used subprocess.run(timeout=), which is unreliable here: `uv cache
clean` spawns children that keep its pipes open, so run()'s internal
communicate() blocked ~94 minutes past a 120 s bound. In particular,
`spin uninstall` invoked via `uvx --from ...` runs inside a uv session whose
ancestor holds the cache lock, so the child deadlocks on its own parent.
Rewrote each step to Popen in its own session with a hard wall-clock
deadline that kills the whole process group; on timeout it reports
"Timed out ... left as-is" instead of hanging.
Verified: real `spin uninstall` now removes the data dir cleanly (no crash,
no debris) and completes in bounded time (~241 s worst case, exit 0) with the
uv-cleanup steps degrading gracefully. Unit tests added for the WAL race,
permission-error propagation, and the wall-clock bound (with a fake hanging
uv); no orphaned children leak from the group kill.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>1 parent 80a3ce5 commit 6b6275d
2 files changed
Lines changed: 191 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
143 | 144 | | |
144 | 145 | | |
145 | 146 | | |
146 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
147 | 163 | | |
148 | 164 | | |
149 | 165 | | |
| |||
153 | 169 | | |
154 | 170 | | |
155 | 171 | | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
156 | 200 | | |
157 | 201 | | |
158 | 202 | | |
| |||
161 | 205 | | |
162 | 206 | | |
163 | 207 | | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
164 | 231 | | |
165 | | - | |
166 | | - | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
167 | 236 | | |
168 | 237 | | |
169 | | - | |
170 | | - | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
171 | 242 | | |
172 | 243 | | |
173 | 244 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
73 | 126 | | |
74 | 127 | | |
75 | 128 | | |
| |||
91 | 144 | | |
92 | 145 | | |
93 | 146 | | |
94 | | - | |
95 | | - | |
96 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
97 | 162 | | |
98 | 163 | | |
99 | 164 | | |
100 | | - | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
101 | 212 | | |
102 | 213 | | |
103 | 214 | | |
| |||
0 commit comments