Skip to content

Commit e3b199a

Browse files
committed
Merge branch 'jk/prune-mtime'
Access to objects in repositories that borrow from another one on a slow NFS server unnecessarily got more expensive due to recent code becoming more cautious in a naive way not to lose objects to pruning. * jk/prune-mtime: sha1_file: only freshen packs once per run sha1_file: freshen pack objects before loose reachable: only mark local objects as recent
2 parents 6749850 + ee1c6c3 commit e3b199a

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

cache.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,7 @@ extern struct packed_git {
12061206
int pack_fd;
12071207
unsigned pack_local:1,
12081208
pack_keep:1,
1209+
freshened:1,
12091210
do_not_close:1;
12101211
unsigned char sha1[20];
12111212
/* something like ".git/objects/pack/xxxxx.pack" */
@@ -1321,14 +1322,16 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,
13211322

13221323
/*
13231324
* Iterate over loose and packed objects in both the local
1324-
* repository and any alternates repositories.
1325+
* repository and any alternates repositories (unless the
1326+
* LOCAL_ONLY flag is set).
13251327
*/
1328+
#define FOR_EACH_OBJECT_LOCAL_ONLY 0x1
13261329
typedef int each_packed_object_fn(const unsigned char *sha1,
13271330
struct packed_git *pack,
13281331
uint32_t pos,
13291332
void *data);
1330-
extern int for_each_loose_object(each_loose_object_fn, void *);
1331-
extern int for_each_packed_object(each_packed_object_fn, void *);
1333+
extern int for_each_loose_object(each_loose_object_fn, void *, unsigned flags);
1334+
extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags);
13321335

13331336
struct object_info {
13341337
/* Request */

reachable.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,12 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
142142
data.revs = revs;
143143
data.timestamp = timestamp;
144144

145-
r = for_each_loose_object(add_recent_loose, &data);
145+
r = for_each_loose_object(add_recent_loose, &data,
146+
FOR_EACH_OBJECT_LOCAL_ONLY);
146147
if (r)
147148
return r;
148-
return for_each_packed_object(add_recent_packed, &data);
149+
return for_each_packed_object(add_recent_packed, &data,
150+
FOR_EACH_OBJECT_LOCAL_ONLY);
149151
}
150152

151153
void mark_reachable_objects(struct rev_info *revs, int mark_reflog,

sha1_file.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,7 +2999,14 @@ static int freshen_loose_object(const unsigned char *sha1)
29992999
static int freshen_packed_object(const unsigned char *sha1)
30003000
{
30013001
struct pack_entry e;
3002-
return find_pack_entry(sha1, &e) && freshen_file(e.p->pack_name);
3002+
if (!find_pack_entry(sha1, &e))
3003+
return 0;
3004+
if (e.p->freshened)
3005+
return 1;
3006+
if (!freshen_file(e.p->pack_name))
3007+
return 0;
3008+
e.p->freshened = 1;
3009+
return 1;
30033010
}
30043011

30053012
int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
@@ -3014,7 +3021,7 @@ int write_sha1_file(const void *buf, unsigned long len, const char *type, unsign
30143021
write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
30153022
if (returnsha1)
30163023
hashcpy(returnsha1, sha1);
3017-
if (freshen_loose_object(sha1) || freshen_packed_object(sha1))
3024+
if (freshen_packed_object(sha1) || freshen_loose_object(sha1))
30183025
return 0;
30193026
return write_loose_object(sha1, hdr, hdrlen, buf, len, 0);
30203027
}
@@ -3418,7 +3425,7 @@ static int loose_from_alt_odb(struct alternate_object_database *alt,
34183425
return r;
34193426
}
34203427

3421-
int for_each_loose_object(each_loose_object_fn cb, void *data)
3428+
int for_each_loose_object(each_loose_object_fn cb, void *data, unsigned flags)
34223429
{
34233430
struct loose_alt_odb_data alt;
34243431
int r;
@@ -3428,6 +3435,9 @@ int for_each_loose_object(each_loose_object_fn cb, void *data)
34283435
if (r)
34293436
return r;
34303437

3438+
if (flags & FOR_EACH_OBJECT_LOCAL_ONLY)
3439+
return 0;
3440+
34313441
alt.cb = cb;
34323442
alt.data = data;
34333443
return foreach_alt_odb(loose_from_alt_odb, &alt);
@@ -3452,13 +3462,15 @@ static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn c
34523462
return r;
34533463
}
34543464

3455-
int for_each_packed_object(each_packed_object_fn cb, void *data)
3465+
int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
34563466
{
34573467
struct packed_git *p;
34583468
int r = 0;
34593469

34603470
prepare_packed_git();
34613471
for (p = packed_git; p; p = p->next) {
3472+
if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
3473+
continue;
34623474
r = for_each_object_in_pack(p, cb, data);
34633475
if (r)
34643476
break;

0 commit comments

Comments
 (0)