Merge branch 'jk/prune-mtime' into maint
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
This commit is contained in:
commit
ebb464f0cb
9
cache.h
9
cache.h
@ -1174,6 +1174,7 @@ extern struct packed_git {
|
||||
int pack_fd;
|
||||
unsigned pack_local:1,
|
||||
pack_keep:1,
|
||||
freshened:1,
|
||||
do_not_close:1;
|
||||
unsigned char sha1[20];
|
||||
/* something like ".git/objects/pack/xxxxx.pack" */
|
||||
@ -1289,14 +1290,16 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,
|
||||
|
||||
/*
|
||||
* Iterate over loose and packed objects in both the local
|
||||
* repository and any alternates repositories.
|
||||
* repository and any alternates repositories (unless the
|
||||
* LOCAL_ONLY flag is set).
|
||||
*/
|
||||
#define FOR_EACH_OBJECT_LOCAL_ONLY 0x1
|
||||
typedef int each_packed_object_fn(const unsigned char *sha1,
|
||||
struct packed_git *pack,
|
||||
uint32_t pos,
|
||||
void *data);
|
||||
extern int for_each_loose_object(each_loose_object_fn, void *);
|
||||
extern int for_each_packed_object(each_packed_object_fn, void *);
|
||||
extern int for_each_loose_object(each_loose_object_fn, void *, unsigned flags);
|
||||
extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags);
|
||||
|
||||
struct object_info {
|
||||
/* Request */
|
||||
|
@ -142,10 +142,12 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
|
||||
data.revs = revs;
|
||||
data.timestamp = timestamp;
|
||||
|
||||
r = for_each_loose_object(add_recent_loose, &data);
|
||||
r = for_each_loose_object(add_recent_loose, &data,
|
||||
FOR_EACH_OBJECT_LOCAL_ONLY);
|
||||
if (r)
|
||||
return r;
|
||||
return for_each_packed_object(add_recent_packed, &data);
|
||||
return for_each_packed_object(add_recent_packed, &data,
|
||||
FOR_EACH_OBJECT_LOCAL_ONLY);
|
||||
}
|
||||
|
||||
void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
|
||||
|
20
sha1_file.c
20
sha1_file.c
@ -2999,7 +2999,14 @@ static int freshen_loose_object(const unsigned char *sha1)
|
||||
static int freshen_packed_object(const unsigned char *sha1)
|
||||
{
|
||||
struct pack_entry e;
|
||||
return find_pack_entry(sha1, &e) && freshen_file(e.p->pack_name);
|
||||
if (!find_pack_entry(sha1, &e))
|
||||
return 0;
|
||||
if (e.p->freshened)
|
||||
return 1;
|
||||
if (!freshen_file(e.p->pack_name))
|
||||
return 0;
|
||||
e.p->freshened = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
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
|
||||
write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
|
||||
if (returnsha1)
|
||||
hashcpy(returnsha1, sha1);
|
||||
if (freshen_loose_object(sha1) || freshen_packed_object(sha1))
|
||||
if (freshen_packed_object(sha1) || freshen_loose_object(sha1))
|
||||
return 0;
|
||||
return write_loose_object(sha1, hdr, hdrlen, buf, len, 0);
|
||||
}
|
||||
@ -3418,7 +3425,7 @@ static int loose_from_alt_odb(struct alternate_object_database *alt,
|
||||
return r;
|
||||
}
|
||||
|
||||
int for_each_loose_object(each_loose_object_fn cb, void *data)
|
||||
int for_each_loose_object(each_loose_object_fn cb, void *data, unsigned flags)
|
||||
{
|
||||
struct loose_alt_odb_data alt;
|
||||
int r;
|
||||
@ -3428,6 +3435,9 @@ int for_each_loose_object(each_loose_object_fn cb, void *data)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (flags & FOR_EACH_OBJECT_LOCAL_ONLY)
|
||||
return 0;
|
||||
|
||||
alt.cb = cb;
|
||||
alt.data = data;
|
||||
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
|
||||
return r;
|
||||
}
|
||||
|
||||
int for_each_packed_object(each_packed_object_fn cb, void *data)
|
||||
int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
|
||||
{
|
||||
struct packed_git *p;
|
||||
int r = 0;
|
||||
|
||||
prepare_packed_git();
|
||||
for (p = packed_git; p; p = p->next) {
|
||||
if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
|
||||
continue;
|
||||
r = for_each_object_in_pack(p, cb, data);
|
||||
if (r)
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user