[PATCH 0/7] odb: handle `OBJECT_INFO_DIE_IF_CORRUPT` generically
Patrick Steinhardt <[email protected]>
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <20260818-pks-odb-generic-corrupt-objects-v1-0-ec234567510f@pks.im> |
Hi,
when looking up an object with `OBJECT_INFO_DIE_IF_CORRUPT` fails we
want to die in case the object exists but is corrupted. This flag is
handled in two different spots right now:
- `do_oid_object_info_extended()` calls `has_packed_and_bad()` to
check whether the object is known to be corrupt in any packfile.
This function reaches into the internals of the packed source and
thus breaks the abstraction provided by our object sources.
- The loose source handles the flag itself and dies directly in
`read_object_info_from_path()`, which means that we die even in
cases where another source may still have a good copy of the
object.
Besides being inconsistent, it also ties us to the specific backend used
by the database sources because `has_packed_and_bad()` assumes that they
use the "files" backend. Any other backend will instead cause us to die
when calling `odb_source_files_downcast()`, even if the object was
simply nonexistent.
This series fixes these issues and makes the check backend-agnostic by
extending semantics of `odb_source_read_object_info()`: on the one hand
it now distinguishes whether an object is missing or corrput, and on the
other hand it starts to return an error message to the caller.
Thanks!
Patrick
---
Patrick Steinhardt (7):
odb/source: discern missing and corrupt objects
odb/source-inmemory: signal missing objects via positive return
odb/source-packed: flag known-bad objects as corrupt and not missing
odb/source-loose: distinguish missing and corrupt objects
odb/source-files: signal mark objects via positive return
odb/source: allow `read_object_info()` to bubble up error messages
odb: handle `OBJECT_INFO_DIE_IF_CORRUPT` generically
builtin/pack-objects.c | 8 +++----
midx.c | 10 +++++---
midx.h | 3 ++-
odb.c | 47 ++++++++++++++++++++++++++------------
odb/source-files.c | 25 ++++++++++++++++----
odb/source-inmemory.c | 5 ++--
odb/source-loose.c | 46 +++++++++++++++++++++----------------
odb/source-packed.c | 53 +++++++++++++++++++++++++++++++++----------
odb/source.h | 33 ++++++++++++++++++++++-----
packfile.c | 29 +++++++----------------
packfile.h | 4 ++--
t/helper/test-read-midx.c | 2 +-
t/t1060-object-corruption.sh | 18 +++++++++++++++
t/unit-tests/u-odb-inmemory.c | 4 ++--
14 files changed, 196 insertions(+), 91 deletions(-)
---
base-commit: 18e66859d87fb4b76599f73460b54f0848c76b16
change-id: 20260818-pks-odb-generic-corrupt-objects-52a47d6214d9