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

[PATCH 3/3] pack-objects: fix off-by-one in delta-island tree-depth computation

From
Jeff King <peff@peff.net>
Date
Nov 20, 2018, 09:50 UTC
Message-ID
<20181120095053.GC22742@sigill.intra.peff.net>
In-Reply-To
<20181120094451.GA21725@sigill.intra.peff.net>

When delta-islands are in use, we need to record the deepest path at which we find each tree and blob. Our loop to do so counts slashes, so "foo" is depth 0, "foo/bar" is depth 1, and so on.

However, this neglects root trees, which are represented by the empty string. Those also have depth 0, but are at a layer above "foo". Thus, "foo" should be 1, "foo/bar" at 2, and so on. We use this depth to topo-sort the trees in resolve_tree_islands(). As a result, we may fail to visit a root tree before the sub-trees it contains, and therefore not correctly pass down the island marks.

That in turn could lead to missing some delta opportunities (objects are in the same island, but we didn't realize it) or creating unwanted cross-island deltas (one object is in an island another isn't, but we don't realize). In practice, it seems to have only a small effect. Some experiments on the real-world git/git fork network at GitHub showed an improvement of only 0.14% in the resulting clone size.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin/pack-objects.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index e7ea206c08..411aefd687 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -2786,9 +2786,11 @@ static void show_object(struct object *obj, const char *name, void *data)
 
 	if (use_delta_islands) {
 		const char *p;
-		unsigned depth = 0;
+		unsigned depth;
 		struct object_entry *ent;
 
+		/* the empty string is a root tree, which is depth 0 */
+		depth = *name ? 1 : 0;
 		for (p = strchr(name, '/'); p; p = strchr(p + 1, '/'))
 			depth++;
 
-- 
2.20.0.rc0.715.gf6b01ab3e1
Previous: Jeff KingNext: Derrick Stolee
Message 7 of 9 in “delta-island fixes”
  1. 0/3 delta-island fixesJeff King, Nov 20, 2018
  2. 1/3 pack-objects: fix tree_depth and layer invariantsJeff King, Nov 20, 2018
  3. Duy NguyenNov 20, 2018
  4. Jeff KingNov 22, 2018
  5. Junio C HamanoNov 21, 2018
  6. 2/3 pack-objects: zero-initialize tree_depth/layer arraysJeff King, Nov 20, 2018
  7. 3/3 pack-objects: fix off-by-one in delta-island tree-depth computationJeff King, Nov 20, 2018
  8. Derrick StoleeNov 20, 2018
  9. Jeff KingNov 22, 2018

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.