Commit a00d856
Roy Lin
fix(box): retagged/rebuilt image becomes a prunable dangling (no leak)
Re-pointing a tag at a new digest (rebuild -t foo, or tag overwrite) used to
silently overwrite the index entry, dropping the displaced image from view AND
orphaning its on-disk layout forever (a real disk leak — nothing could reach it
to delete it).
- store.put: when a reference already maps to a DIFFERENT digest that loses its
last reference, re-key the displaced image under its digest so it survives as
a dangling entry — visible in `images`, removable by `image prune` (which
frees the disk). Same-digest re-puts don't spawn a spurious dangling.
- images: render a digest-keyed (dangling) reference as `<none> <none>` like
Docker, instead of splitting the digest into repository=sha256 / tag=<hex>.
Verified on KVM: build myimg:v1, rebuild with changed content -> old shows as
<none> <none>; `image-prune --force` removes exactly it and frees 3.7 MB; the
live tag survives. New unit tests cover retag->dangling, same-digest no-op, and
the <none> <none> rendering.1 parent 1cb9bb8 commit a00d856
2 files changed
Lines changed: 99 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
187 | 194 | | |
188 | | - | |
189 | 195 | | |
190 | 196 | | |
191 | 197 | | |
| |||
352 | 358 | | |
353 | 359 | | |
354 | 360 | | |
355 | | - | |
| 361 | + | |
| 362 | + | |
356 | 363 | | |
357 | 364 | | |
358 | 365 | | |
359 | | - | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
360 | 382 | | |
361 | 383 | | |
362 | 384 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
153 | 173 | | |
154 | 174 | | |
155 | 175 | | |
| |||
463 | 483 | | |
464 | 484 | | |
465 | 485 | | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
466 | 535 | | |
467 | 536 | | |
468 | 537 | | |
| |||
0 commit comments