git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* WIth git-next, writing bitmaps fails when keep files are present
@ 2014-01-23  2:38 Siddharth Agarwal
  2014-01-23 20:36 ` Siddharth Agarwal
  2014-01-23 22:52 ` [PATCH] pack-objects: turn off bitmaps when skipping objects Jeff King
  0 siblings, 2 replies; 28+ messages in thread
From: Siddharth Agarwal @ 2014-01-23  2:38 UTC (permalink / raw)
  To: git

Running git-next, writing bitmap indexes fails if a keep file is present 
from an earlier pack.

With git at b139ac2, the following commands demonstrate the problem:

git init test
cd test
touch a
git add a
git commit -m "a"

git repack -ad  # generate a pack file
for f in .git/objects/pack/*.pack; touch ${f/%pack/keep}  # mark it as 
to keep

touch b
git add b
git commit -m "b"
git repack -adb

This fails at the bitmap writing stage with something like:

Counting objects: 2, done.
Delta compression using up to 24 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), done.
fatal: Failed to write bitmap index. Packfile doesn't have full closure 
(object 7388a015938147155b600eaacc59af6e78c75e5a is missing)

In our case we have .keep files lying around from ages ago (possibly due 
to kill -9s run on the server). It also means that running repack -a 
with bitmap writing enabled on a repo becomes problematic if a fetch is 
run concurrently.

Even if we practice good .keep hygiene, this seems like a bug in git 
that should be fixed.

^ permalink raw reply	[flat|nested] 28+ messages in thread
* [PATCH] pack-objects: turn off bitmaps when skipping objects
@ 2014-03-15  2:38 Jeff King
  0 siblings, 0 replies; 28+ messages in thread
From: Jeff King @ 2014-03-15  2:38 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano

The pack bitmap format requires that we have a single bit
for each object in the pack, and that each object's bitmap
represents its complete set of reachable objects. Therefore
we have no way to represent the bitmap of an object which
references objects outside the pack.

We notice this problem while generating the bitmaps, as we
try to find the offset of a particular object and realize
that we do not have it. In this case we die, and neither the
bitmap nor the pack is generated. This is correct, but
perhaps a little unfriendly. If you have bitmaps turned on
in the config, many repacks will fail which would otherwise
succeed. E.g., incremental repacks, repacks with "-l" when
you have alternates, ".keep" files.

Instead, this patch notices early that we are omitting some
objects from the pack and turns off bitmaps (with a
warning). Note that this is not strictly correct, as it's
possible that the object being omitted is not reachable from
any other object in the pack. In practice, this is almost
never the case, and there are two advantages to doing it
this way:

  1. The code is much simpler, as we do not have to cleanly
     abort the bitmap-generation process midway through.

  2. We do not waste time partially generating bitmaps only
     to find out that some object deep in the history is not
     being packed.

Signed-off-by: Jeff King <peff@peff.net>
---
I posted this earlier here:

  http://article.gmane.org/gmane.comp.version-control.git/240969

The discussion resulted in the jk/repack-pack-keep-objects topic.
However, I think this is still worth applying, as it means git behaves
sensibly when objects are omitted for other reasons (e.g., because you
tried to use "-b" with an incremental repack, or because you favor
".keep" files to bitmaps by explicitly setting repack.packKeptObjects
to "false"). In our previous discussions, I had assumed this patch had
already been picked up, but I don't see it anywhere. Without it, setting
"repack.packKeptObjects" to false is largely pointless (instead of
continuing without bitmaps, git will die).

 builtin/pack-objects.c  | 12 +++++++++++-
 t/t5310-pack-bitmaps.sh |  5 ++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 418801f..4ca3946 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1011,6 +1011,10 @@ static void create_object_entry(const unsigned char *sha1,
 	entry->no_try_delta = no_try_delta;
 }
 
+static const char no_closure_warning[] = N_(
+"disabling bitmap writing, as some objects are not being packed"
+);
+
 static int add_object_entry(const unsigned char *sha1, enum object_type type,
 			    const char *name, int exclude)
 {
@@ -1021,8 +1025,14 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type,
 	if (have_duplicate_entry(sha1, exclude, &index_pos))
 		return 0;
 
-	if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset))
+	if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {
+		/* The pack is missing an object, so it will not have closure */
+		if (write_bitmap_index) {
+			warning(_(no_closure_warning));
+			write_bitmap_index = 0;
+		}
 		return 0;
+	}
 
 	create_object_entry(sha1, type, pack_name_hash(name),
 			    exclude, name && no_try_delta(name),
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index d3a3afa..f13525c 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -91,7 +91,10 @@ test_expect_success 'fetch (partial bitmap)' '
 
 test_expect_success 'incremental repack cannot create bitmaps' '
 	test_commit more-1 &&
-	test_must_fail git repack -d
+	find .git/objects/pack -name "*.bitmap" >expect &&
+	git repack -d &&
+	find .git/objects/pack -name "*.bitmap" >actual &&
+	test_cmp expect actual
 '
 
 test_expect_success 'incremental repack can disable bitmaps' '
-- 
1.9.0.417.gc6bea4f

^ permalink raw reply related	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2014-03-15  2:38 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-23  2:38 WIth git-next, writing bitmaps fails when keep files are present Siddharth Agarwal
2014-01-23 20:36 ` Siddharth Agarwal
2014-01-23 22:52 ` [PATCH] pack-objects: turn off bitmaps when skipping objects Jeff King
2014-01-23 23:45   ` Siddharth Agarwal
2014-01-23 23:53     ` Siddharth Agarwal
2014-01-24  2:28       ` Jeff King
2014-01-24  2:44         ` Siddharth Agarwal
2014-01-28  6:09           ` [PATCH] repack: add `repack.honorpackkeep` config var Jeff King
2014-01-28  9:21             ` Junio C Hamano
2014-02-24  8:24               ` Jeff King
2014-02-24 19:10                 ` Junio C Hamano
2014-02-26 10:13                   ` Jeff King
2014-02-26 20:30                     ` Junio C Hamano
2014-02-27 11:27                       ` Jeff King
2014-02-27 18:04                         ` Junio C Hamano
2014-02-28  8:55                           ` Jeff King
2014-02-28 17:09                             ` Nasser Grainawi
2014-03-01  6:05                               ` Jeff King
2014-03-03 19:12                                 ` Shawn Pearce
2014-02-28 18:45                             ` Junio C Hamano
2014-03-01  5:43                               ` Jeff King
2014-03-03 18:13                                 ` Junio C Hamano
2014-03-03 18:15                                   ` Jeff King
2014-03-03 19:51                                     ` Junio C Hamano
2014-03-03 20:04                                       ` Jeff King
2014-01-23 23:56     ` [PATCH] pack-objects: turn off bitmaps when skipping objects Vicent Martí
2014-01-24  2:26       ` Jeff King
  -- strict thread matches above, loose matches on Subject: below --
2014-03-15  2:38 Jeff King

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).