pack-objects: prefetch objects to be packed
When an object to be packed is noticed to be missing, prefetch all to-be-packed objects in one batch. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
8d5cf95735
commit
e00549aa9b
@ -35,6 +35,7 @@
|
||||
#include "midx.h"
|
||||
#include "trace2.h"
|
||||
#include "shallow.h"
|
||||
#include "promisor-remote.h"
|
||||
|
||||
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
|
||||
#define SIZE(obj) oe_size(&to_pack, obj)
|
||||
@ -1704,7 +1705,26 @@ static int can_reuse_delta(const struct object_id *base_oid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_object(struct object_entry *entry)
|
||||
static void prefetch_to_pack(uint32_t object_index_start) {
|
||||
struct oid_array to_fetch = OID_ARRAY_INIT;
|
||||
uint32_t i;
|
||||
|
||||
for (i = object_index_start; i < to_pack.nr_objects; i++) {
|
||||
struct object_entry *entry = to_pack.objects + i;
|
||||
|
||||
if (!oid_object_info_extended(the_repository,
|
||||
&entry->idx.oid,
|
||||
NULL,
|
||||
OBJECT_INFO_FOR_PREFETCH))
|
||||
continue;
|
||||
oid_array_append(&to_fetch, &entry->idx.oid);
|
||||
}
|
||||
promisor_remote_get_direct(the_repository,
|
||||
to_fetch.oid, to_fetch.nr);
|
||||
oid_array_clear(&to_fetch);
|
||||
}
|
||||
|
||||
static void check_object(struct object_entry *entry, uint32_t object_index)
|
||||
{
|
||||
unsigned long canonical_size;
|
||||
enum object_type type;
|
||||
@ -1843,8 +1863,16 @@ static void check_object(struct object_entry *entry)
|
||||
}
|
||||
|
||||
if (oid_object_info_extended(the_repository, &entry->idx.oid, &oi,
|
||||
OBJECT_INFO_LOOKUP_REPLACE) < 0)
|
||||
type = -1;
|
||||
OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0) {
|
||||
if (has_promisor_remote()) {
|
||||
prefetch_to_pack(object_index);
|
||||
if (oid_object_info_extended(the_repository, &entry->idx.oid, &oi,
|
||||
OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0)
|
||||
type = -1;
|
||||
} else {
|
||||
type = -1;
|
||||
}
|
||||
}
|
||||
oe_set_type(entry, type);
|
||||
if (entry->type_valid) {
|
||||
SET_SIZE(entry, canonical_size);
|
||||
@ -2065,7 +2093,7 @@ static void get_object_details(void)
|
||||
|
||||
for (i = 0; i < to_pack.nr_objects; i++) {
|
||||
struct object_entry *entry = sorted_by_offset[i];
|
||||
check_object(entry);
|
||||
check_object(entry, i);
|
||||
if (entry->type_valid &&
|
||||
oe_size_greater_than(&to_pack, entry, big_file_threshold))
|
||||
entry->no_try_delta = 1;
|
||||
|
||||
Reference in New Issue
Block a user