Skip to content

Commit 849c8b3

Browse files
committed
Merge branch 'tb/pack-revindex-on-disk'
The on-disk reverse index that allows mapping from the pack offset to the object name for the object stored at the offset has been enabled by default. * tb/pack-revindex-on-disk: t: invert `GIT_TEST_WRITE_REV_INDEX` config: enable `pack.writeReverseIndex` by default pack-revindex: introduce `pack.readReverseIndex` pack-revindex: introduce GIT_TEST_REV_INDEX_DIE_ON_DISK pack-revindex: make `load_pack_revindex` take a repository t5325: mark as leak-free pack-write.c: plug a leak in stage_tmp_packfiles()
2 parents 2807bd2 + 9f7f10a commit 849c8b3

14 files changed

+62
-26
lines changed

Documentation/config/pack.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,15 @@ pack.writeBitmapLookupTable::
171171
beneficial in repositories that have relatively large bitmap
172172
indexes. Defaults to false.
173173

174+
pack.readReverseIndex::
175+
When true, git will read any .rev file(s) that may be available
176+
(see: linkgit:gitformat-pack[5]). When false, the reverse index
177+
will be generated from scratch and stored in memory. Defaults to
178+
true.
179+
174180
pack.writeReverseIndex::
175181
When true, git will write a corresponding .rev file (see:
176182
linkgit:gitformat-pack[5])
177183
for each new packfile that it writes in all places except for
178184
linkgit:git-fast-import[1] and in the bulk checkin mechanism.
179-
Defaults to false.
185+
Defaults to true.

builtin/index-pack.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,12 +1756,13 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17561756
fsck_options.walk = mark_link;
17571757

17581758
reset_pack_idx_option(&opts);
1759+
opts.flags |= WRITE_REV;
17591760
git_config(git_index_pack_config, &opts);
17601761
if (prefix && chdir(prefix))
17611762
die(_("Cannot come back to cwd"));
17621763

1763-
if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
1764-
rev_index = 1;
1764+
if (git_env_bool(GIT_TEST_NO_WRITE_REV_INDEX, 0))
1765+
rev_index = 0;
17651766
else
17661767
rev_index = !!(opts.flags & (WRITE_REV_VERIFY | WRITE_REV));
17671768

builtin/pack-objects.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4294,9 +4294,10 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
42944294
}
42954295

42964296
reset_pack_idx_option(&pack_idx_opts);
4297+
pack_idx_opts.flags |= WRITE_REV;
42974298
git_config(git_pack_config, NULL);
4298-
if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
4299-
pack_idx_opts.flags |= WRITE_REV;
4299+
if (git_env_bool(GIT_TEST_NO_WRITE_REV_INDEX, 0))
4300+
pack_idx_opts.flags &= ~WRITE_REV;
43004301

43014302
progress = isatty(2);
43024303
argc = parse_options(argc, argv, prefix, pack_objects_options,

ci/run-build-and-tests.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ linux-TEST-vars)
2727
export GIT_TEST_MULTI_PACK_INDEX=1
2828
export GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=1
2929
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
30-
export GIT_TEST_WRITE_REV_INDEX=1
30+
export GIT_TEST_NO_WRITE_REV_INDEX=1
3131
export GIT_TEST_CHECKOUT_WORKERS=2
3232
;;
3333
linux-clang)

pack-bitmap.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ static int open_pack_bitmap_1(struct bitmap_index *bitmap_git, struct packed_git
465465
return 0;
466466
}
467467

468-
static int load_reverse_index(struct bitmap_index *bitmap_git)
468+
static int load_reverse_index(struct repository *r, struct bitmap_index *bitmap_git)
469469
{
470470
if (bitmap_is_midx(bitmap_git)) {
471471
uint32_t i;
@@ -479,23 +479,23 @@ static int load_reverse_index(struct bitmap_index *bitmap_git)
479479
* since we will need to make use of them in pack-objects.
480480
*/
481481
for (i = 0; i < bitmap_git->midx->num_packs; i++) {
482-
ret = load_pack_revindex(bitmap_git->midx->packs[i]);
482+
ret = load_pack_revindex(r, bitmap_git->midx->packs[i]);
483483
if (ret)
484484
return ret;
485485
}
486486
return 0;
487487
}
488-
return load_pack_revindex(bitmap_git->pack);
488+
return load_pack_revindex(r, bitmap_git->pack);
489489
}
490490

491-
static int load_bitmap(struct bitmap_index *bitmap_git)
491+
static int load_bitmap(struct repository *r, struct bitmap_index *bitmap_git)
492492
{
493493
assert(bitmap_git->map);
494494

495495
bitmap_git->bitmaps = kh_init_oid_map();
496496
bitmap_git->ext_index.positions = kh_init_oid_pos();
497497

498-
if (load_reverse_index(bitmap_git))
498+
if (load_reverse_index(r, bitmap_git))
499499
goto failed;
500500

501501
if (!(bitmap_git->commits = read_bitmap_1(bitmap_git)) ||
@@ -582,7 +582,7 @@ struct bitmap_index *prepare_bitmap_git(struct repository *r)
582582
{
583583
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
584584

585-
if (!open_bitmap(r, bitmap_git) && !load_bitmap(bitmap_git))
585+
if (!open_bitmap(r, bitmap_git) && !load_bitmap(r, bitmap_git))
586586
return bitmap_git;
587587

588588
free_bitmap_index(bitmap_git);
@@ -591,9 +591,10 @@ struct bitmap_index *prepare_bitmap_git(struct repository *r)
591591

592592
struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx)
593593
{
594+
struct repository *r = the_repository;
594595
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
595596

596-
if (!open_midx_bitmap_1(bitmap_git, midx) && !load_bitmap(bitmap_git))
597+
if (!open_midx_bitmap_1(bitmap_git, midx) && !load_bitmap(r, bitmap_git))
597598
return bitmap_git;
598599

599600
free_bitmap_index(bitmap_git);
@@ -1594,7 +1595,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
15941595
* from disk. this is the point of no return; after this the rev_list
15951596
* becomes invalidated and we must perform the revwalk through bitmaps
15961597
*/
1597-
if (load_bitmap(bitmap_git) < 0)
1598+
if (load_bitmap(revs->repo, bitmap_git) < 0)
15981599
goto cleanup;
15991600

16001601
object_array_clear(&revs->pending);
@@ -1744,6 +1745,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
17441745
uint32_t *entries,
17451746
struct bitmap **reuse_out)
17461747
{
1748+
struct repository *r = the_repository;
17471749
struct packed_git *pack;
17481750
struct bitmap *result = bitmap_git->result;
17491751
struct bitmap *reuse;
@@ -1754,7 +1756,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
17541756

17551757
assert(result);
17561758

1757-
load_reverse_index(bitmap_git);
1759+
load_reverse_index(r, bitmap_git);
17581760

17591761
if (bitmap_is_midx(bitmap_git))
17601762
pack = bitmap_git->midx->packs[midx_preferred_pack(bitmap_git)];
@@ -2134,11 +2136,12 @@ int rebuild_bitmap(const uint32_t *reposition,
21342136
uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
21352137
struct packing_data *mapping)
21362138
{
2139+
struct repository *r = the_repository;
21372140
uint32_t i, num_objects;
21382141
uint32_t *reposition;
21392142

21402143
if (!bitmap_is_midx(bitmap_git))
2141-
load_reverse_index(bitmap_git);
2144+
load_reverse_index(r, bitmap_git);
21422145
else if (load_midx_revindex(bitmap_git->midx) < 0)
21432146
BUG("rebuild_existing_bitmaps: missing required rev-cache "
21442147
"extension");

pack-revindex.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ static int load_revindex_from_disk(char *revindex_name,
207207
size_t revindex_size;
208208
struct revindex_header *hdr;
209209

210+
if (git_env_bool(GIT_TEST_REV_INDEX_DIE_ON_DISK, 0))
211+
die("dying as requested by '%s'", GIT_TEST_REV_INDEX_DIE_ON_DISK);
212+
210213
fd = git_open(revindex_name);
211214

212215
if (fd < 0) {
@@ -285,12 +288,15 @@ static int load_pack_revindex_from_disk(struct packed_git *p)
285288
return ret;
286289
}
287290

288-
int load_pack_revindex(struct packed_git *p)
291+
int load_pack_revindex(struct repository *r, struct packed_git *p)
289292
{
290293
if (p->revindex || p->revindex_data)
291294
return 0;
292295

293-
if (!load_pack_revindex_from_disk(p))
296+
prepare_repo_settings(r);
297+
298+
if (r->settings.pack_read_reverse_index &&
299+
!load_pack_revindex_from_disk(p))
294300
return 0;
295301
else if (!create_pack_revindex_in_memory(p))
296302
return 0;
@@ -358,7 +364,7 @@ int offset_to_pack_pos(struct packed_git *p, off_t ofs, uint32_t *pos)
358364
{
359365
unsigned lo, hi;
360366

361-
if (load_pack_revindex(p) < 0)
367+
if (load_pack_revindex(the_repository, p) < 0)
362368
return -1;
363369

364370
lo = 0;

pack-revindex.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
#define RIDX_SIGNATURE 0x52494458 /* "RIDX" */
3535
#define RIDX_VERSION 1
3636

37-
#define GIT_TEST_WRITE_REV_INDEX "GIT_TEST_WRITE_REV_INDEX"
37+
#define GIT_TEST_NO_WRITE_REV_INDEX "GIT_TEST_NO_WRITE_REV_INDEX"
3838
#define GIT_TEST_REV_INDEX_DIE_IN_MEMORY "GIT_TEST_REV_INDEX_DIE_IN_MEMORY"
39+
#define GIT_TEST_REV_INDEX_DIE_ON_DISK "GIT_TEST_REV_INDEX_DIE_ON_DISK"
3940

4041
struct packed_git;
4142
struct multi_pack_index;
43+
struct repository;
4244

4345
/*
4446
* load_pack_revindex populates the revindex's internal data-structures for the
@@ -47,7 +49,7 @@ struct multi_pack_index;
4749
* If a '.rev' file is present it is mmap'd, and pointers are assigned into it
4850
* (instead of using the in-memory variant).
4951
*/
50-
int load_pack_revindex(struct packed_git *p);
52+
int load_pack_revindex(struct repository *r, struct packed_git *p);
5153

5254
/*
5355
* load_midx_revindex loads the '.rev' file corresponding to the given

pack-write.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,8 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
570570
rename_tmp_packfile(name_buffer, rev_tmp_name, "rev");
571571
if (mtimes_tmp_name)
572572
rename_tmp_packfile(name_buffer, mtimes_tmp_name, "mtimes");
573+
574+
free((char *)rev_tmp_name);
573575
}
574576

575577
void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)

packfile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2154,7 +2154,7 @@ int for_each_object_in_pack(struct packed_git *p,
21542154
int r = 0;
21552155

21562156
if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
2157-
if (load_pack_revindex(p))
2157+
if (load_pack_revindex(the_repository, p))
21582158
return -1;
21592159
}
21602160

repo-settings.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void prepare_repo_settings(struct repository *r)
6363
repo_cfg_bool(r, "core.multipackindex", &r->settings.core_multi_pack_index, 1);
6464
repo_cfg_bool(r, "index.sparse", &r->settings.sparse_index, 0);
6565
repo_cfg_bool(r, "index.skiphash", &r->settings.index_skip_hash, r->settings.index_skip_hash);
66+
repo_cfg_bool(r, "pack.readreverseindex", &r->settings.pack_read_reverse_index, 1);
6667

6768
/*
6869
* The GIT_TEST_MULTI_PACK_INDEX variable is special in that

repository.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct repo_settings {
3737
int fetch_write_commit_graph;
3838
int command_requires_full_index;
3939
int sparse_index;
40+
int pack_read_reverse_index;
4041

4142
struct fsmonitor_settings *fsmonitor; /* lazily loaded */
4243

t/README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ GIT_TEST_DEFAULT_HASH=<hash-algo> specifies which hash algorithm to
475475
use in the test scripts. Recognized values for <hash-algo> are "sha1"
476476
and "sha256".
477477

478-
GIT_TEST_WRITE_REV_INDEX=<boolean>, when true enables the
478+
GIT_TEST_NO_WRITE_REV_INDEX=<boolean>, when true disables the
479479
'pack.writeReverseIndex' setting.
480480

481481
GIT_TEST_SPARSE_INDEX=<boolean>, when true enables index writes to use the

t/perf/p5312-pack-bitmaps-revs.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ test_lookup_pack_bitmap () {
1212
test_perf_large_repo
1313

1414
test_expect_success 'setup bitmap config' '
15-
git config pack.writebitmaps true &&
16-
git config pack.writeReverseIndex true
15+
git config pack.writebitmaps true
1716
'
1817

1918
# we need to create the tag up front such that it is covered by the repack and

t/t5325-reverse-index.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
#!/bin/sh
22

33
test_description='on-disk reverse index'
4+
5+
TEST_PASSES_SANITIZE_LEAK=true
46
. ./test-lib.sh
57

68
# The below tests want control over the 'pack.writeReverseIndex' setting
79
# themselves to assert various combinations of it with other options.
8-
sane_unset GIT_TEST_WRITE_REV_INDEX
10+
sane_unset GIT_TEST_NO_WRITE_REV_INDEX
911

1012
packdir=.git/objects/pack
1113

1214
test_expect_success 'setup' '
1315
test_commit base &&
1416
17+
test_config pack.writeReverseIndex false &&
1518
pack=$(git pack-objects --all $packdir/pack) &&
1619
rev=$packdir/pack-$pack.rev &&
1720
@@ -94,6 +97,17 @@ test_expect_success 'reverse index is not generated when available on disk' '
9497
--batch-check="%(objectsize:disk)" <tip
9598
'
9699

100+
test_expect_success 'reverse index is ignored when pack.readReverseIndex is false' '
101+
test_index_pack true &&
102+
test_path_is_file $rev &&
103+
104+
test_config pack.readReverseIndex false &&
105+
106+
git rev-parse HEAD >tip &&
107+
GIT_TEST_REV_INDEX_DIE_ON_DISK=1 git cat-file \
108+
--batch-check="%(objectsize:disk)" <tip
109+
'
110+
97111
test_expect_success 'revindex in-memory vs on-disk' '
98112
git init repo &&
99113
test_when_finished "rm -fr repo" &&

0 commit comments

Comments
 (0)