Skip to content

Commit

Permalink
multi-pack-index: prepare for 'expire' subcommand
Browse files Browse the repository at this point in the history
The multi-pack-index tracks objects in a collection of pack-files.
Only one copy of each object is indexed, using the modified time
of the pack-files to determine tie-breakers. It is possible to
have a pack-file with no referenced objects because all objects
have a duplicate in a newer pack-file.

Introduce a new 'expire' subcommand to the multi-pack-index builtin.
This subcommand will delete these unused pack-files and rewrite the
multi-pack-index to no longer refer to those files. More details
about the specifics will follow as the method is implemented.

Add a test that verifies the 'expire' subcommand is correctly wired,
but will still be valid when the verb is implemented. Specifically,
create a set of packs that should all have referenced objects and
should not be removed during an 'expire' operation. The packs are
created carefully to ensure they have a specific order when sorted
by size. This will be important in a later test.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
  • Loading branch information
derrickstolee authored and dscho committed Jun 8, 2019
1 parent 6b2f120 commit 276c1ef
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Documentation/git-multi-pack-index.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ write::
verify::
Verify the contents of the MIDX file.

expire::
Delete the pack-files that are tracked by the MIDX file, but
have no objects referenced by the MIDX. Rewrite the MIDX file
afterward to remove all references to these pack-files.


EXAMPLES
--------
Expand Down
4 changes: 3 additions & 1 deletion builtin/multi-pack-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "trace2.h"

static char const * const builtin_multi_pack_index_usage[] = {
N_("git multi-pack-index [--object-dir=<dir>] (write|verify)"),
N_("git multi-pack-index [--object-dir=<dir>] (write|verify|expire)"),
NULL
};

Expand Down Expand Up @@ -47,6 +47,8 @@ int cmd_multi_pack_index(int argc, const char **argv,
return write_midx_file(opts.object_dir);
if (!strcmp(argv[0], "verify"))
return verify_midx_file(the_repository, opts.object_dir);
if (!strcmp(argv[0], "expire"))
return expire_midx_packs(the_repository, opts.object_dir);

die(_("unrecognized verb: %s"), argv[0]);
}
5 changes: 5 additions & 0 deletions midx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1140,3 +1140,8 @@ int verify_midx_file(struct repository *r, const char *object_dir)

return verify_midx_error;
}

int expire_midx_packs(struct repository *r, const char *object_dir)
{
return 0;
}
1 change: 1 addition & 0 deletions midx.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
int write_midx_file(const char *object_dir);
void clear_midx_file(struct repository *r);
int verify_midx_file(struct repository *r, const char *object_dir);
int expire_midx_packs(struct repository *r, const char *object_dir);

void close_midx(struct multi_pack_index *m);

Expand Down
49 changes: 49 additions & 0 deletions t/t5319-multi-pack-index.sh
Original file line number Diff line number Diff line change
Expand Up @@ -363,4 +363,53 @@ test_expect_success 'verify incorrect 64-bit offset' '
"incorrect object offset"
'

test_expect_success 'setup expire tests' '
mkdir dup &&
(
cd dup &&
git init &&
test-tool genrandom "data" 4096 >large_file.txt &&
git update-index --add large_file.txt &&
for i in $(test_seq 1 20)
do
test_commit $i
done &&
git branch A HEAD &&
git branch B HEAD~8 &&
git branch C HEAD~13 &&
git branch D HEAD~16 &&
git branch E HEAD~18 &&
git pack-objects --revs .git/objects/pack/pack-A <<-EOF &&
refs/heads/A
^refs/heads/B
EOF
git pack-objects --revs .git/objects/pack/pack-B <<-EOF &&
refs/heads/B
^refs/heads/C
EOF
git pack-objects --revs .git/objects/pack/pack-C <<-EOF &&
refs/heads/C
^refs/heads/D
EOF
git pack-objects --revs .git/objects/pack/pack-D <<-EOF &&
refs/heads/D
^refs/heads/E
EOF
git pack-objects --revs .git/objects/pack/pack-E <<-EOF &&
refs/heads/E
EOF
git multi-pack-index write
)
'

test_expect_success 'expire does not remove any packs' '
(
cd dup &&
ls .git/objects/pack >expect &&
git multi-pack-index expire &&
ls .git/objects/pack >actual &&
test_cmp expect actual
)
'

test_done

0 comments on commit 276c1ef

Please sign in to comment.