git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC/PATCH] commit-graph: verify swapped zero/non-zero generation cases

From
Taylor Blau <me@ttaylorr.com>
Date
Aug 10, 2023, 16:00 UTC
Message-ID
<ZNUJq2nFEDHwrF0U@nand.local>
In-Reply-To
<20230808191536.GA4033224@coredump.intra.peff.net>
On Tue, Aug 08, 2023 at 03:15:36PM -0400, Jeff King wrote:
Show 5 quoted lines
> This is marked as RFC because I'm still confused about a lot of things.
> For one, my explanation above about what the code is doing is mostly a
> guess. It _looks_ to me like that's what the existing check is trying to
> do. But if so, then why is the generation_zero flag defined outside the
> loop over each object? I'd think it would be a per-object thing.

I thought the same thing initially, but looking back at 1373e547f7 (commit-graph: verify generation number, 2018-06-27), I think the scope of generation_zero is correct.

This is an artifact from when commit-graphs were written with all commit generation numbers equal to zero. So I think the logic is something like:

- If the commit-graph has a generation number of 0 for some commit, but
  we saw a non-zero value from any another commit, report it.
- Otherwise, if the commit-graph had a non-zero value for the commit's
  generation number, and we had previously seen a generation number of
  zero for some other commit, report it.

IOW, I think we expect to see either all zeros, or all non-zero values in a single commit-graph's set of generation numbers.

Earlier in your message, you wrote:
Show 12 quoted lines
> There's a matching GENERATION_NUMBER_EXISTS value, which in theory would
> be used to find the case that we see the entries in the opposite order:
>
>   1. When we see an entry with a non-zero generation, we set the
>      generation_zero flag to GENERATION_NUMBER_EXISTS.
>
>   2. When we later see an entry with a zero generation, we complain if
>      the flag is GENERATION_NUMBER_EXISTS.
>
> But that doesn't work; step 2 is implemented, but there is no step 1. We
> never use NUMBER_EXISTS at all, and Coverity rightly complains that step
> 2 is dead code.

So I think the missing part is setting GENERATION_NUMBER_EXISTS when we have a non-zero generation number from the commit-graph, but have generation_zero set to GENERATION_ZERO_EXISTS (IOW, we have seen at least one commit with generation number 0).

--- 8< ---
diff --git a/commit-graph.c b/commit-graph.c
index 0aa1640d15..935bc15440 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -2676,9 +2676,11 @@ static int verify_one_commit_graph(struct repository *r,
 				graph_report(_("commit-graph has generation number zero for commit %s, but non-zero elsewhere"),
 					     oid_to_hex(&cur_oid));
 			generation_zero = GENERATION_ZERO_EXISTS;
-		} else if (generation_zero == GENERATION_ZERO_EXISTS)
+		} else if (generation_zero == GENERATION_ZERO_EXISTS) {
 			graph_report(_("commit-graph has non-zero generation number for commit %s, but zero elsewhere"),
 				     oid_to_hex(&cur_oid));
+			generation_zero = GENERATION_NUMBER_EXISTS;
+		}

 		if (generation_zero == GENERATION_ZERO_EXISTS)
 			continue;
--- >8 ---

> So I kind of wonder if there's something I'm not getting here. Coverity
> is definitely right that our "step 2" is dead code (because we never set
> NUMBER_EXISTS). But I'm not sure if we should be deleting it, or trying
> to fix an underlying bug.

I think that above is correct in that we should be fixing an underlying
bug. But the fact that this isn't caught by our existing tests indicates
that there is a gap in coverage. Let me see if I can find a test case
that highlights this bug...

Thanks,
Taylor
Previous: Jeff KingNext: Taylor Blau
Message 2 of 30 in “commit-graph: verify swapped zero/non-zero generation cases”
  1. commit-graph: verify swapped zero/non-zero generation casesJeff King, Aug 8, 2023
  2. Taylor BlauAug 10, 2023
  3. Taylor BlauAug 10, 2023
  4. 0/4 commit-graph: fsck zero/non-zero generation number fixesTaylor Blau, Aug 10, 2023
  5. 1/4 commit-graph: introduce `commit_graph_generation_from_graph()`Taylor Blau, Aug 10, 2023
  6. 2/4 commit-graph: verify swapped zero/non-zero generation casesTaylor Blau, Aug 10, 2023
  7. Junio C HamanoAug 10, 2023
  8. Jeff KingAug 11, 2023
  9. Taylor BlauAug 11, 2023
  10. 3/4 t/t5318-commit-graph.sh: test generation zero transitions during fsckTaylor Blau, Aug 10, 2023
  11. 4/4 commit-graph: invert negated conditionalTaylor Blau, Aug 10, 2023
  12. Jeff KingAug 11, 2023
  13. 0/5 commit-graph: fsck zero/non-zero generation number fixesTaylor Blau, Aug 11, 2023
  14. 1/5 commit-graph: introduce `commit_graph_generation_from_graph()`Taylor Blau, Aug 11, 2023
  15. 2/5 commit-graph: verify swapped zero/non-zero generation casesTaylor Blau, Aug 11, 2023
  16. 3/5 t/t5318-commit-graph.sh: test generation zero transitions during fsckTaylor Blau, Aug 11, 2023
  17. 4/5 commit-graph: invert negated conditional, extract to functionTaylor Blau, Aug 11, 2023
  18. 5/5 commit-graph: avoid repeated mixed generation number warningsTaylor Blau, Aug 11, 2023
  19. Jeff KingAug 11, 2023
  20. Junio C HamanoAug 11, 2023
  21. Jeff KingAug 17, 2023
  22. Taylor BlauAug 21, 2023
  23. 0/4 commit-graph: fsck zero/non-zero generation number fixesTaylor Blau, Aug 21, 2023
  24. 1/4 commit-graph: introduce `commit_graph_generation_from_graph()`Taylor Blau, Aug 21, 2023
  25. 2/4 commit-graph: verify swapped zero/non-zero generation casesTaylor Blau, Aug 21, 2023
  26. 3/4 t/t5318-commit-graph.sh: test generation zero transitions during fsckTaylor Blau, Aug 21, 2023
  27. 4/4 commit-graph: commit-graph: avoid repeated mixed generation number warningsTaylor Blau, Aug 21, 2023
  28. Jeff KingAug 21, 2023
  29. Junio C HamanoAug 21, 2023
  30. Taylor BlauAug 23, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.