connected: refactor iterator to return next object ID directly
The object ID iterator used by the connectivity checks returns the next object ID via an out-parameter and then uses a return code to indicate whether an item was found. This is a bit roundabout: instead of a separate error code, we can just return the next object ID directly and use `NULL` pointers as indicator that the iterator got no items left. Furthermore, this avoids a copy of the object ID. Refactor the iterator and all its implementations to return object IDs directly. This brings a tiny performance improvement when doing a mirror-fetch of a repository with about 2.3M refs: Benchmark #1: 328dc58b49919c43897240f2eabfa30be2ce32a4~: git-fetch Time (mean ± σ): 30.110 s ± 0.148 s [User: 27.161 s, System: 5.075 s] Range (min … max): 29.934 s … 30.406 s 10 runs Benchmark #2: 328dc58b49919c43897240f2eabfa30be2ce32a4: git-fetch Time (mean ± σ): 29.899 s ± 0.109 s [User: 26.916 s, System: 5.104 s] Range (min … max): 29.696 s … 29.996 s 10 runs Summary '328dc58b49919c43897240f2eabfa30be2ce32a4: git-fetch' ran 1.01 ± 0.01 times faster than '328dc58b49919c43897240f2eabfa30be2ce32a4~: git-fetch' While this 1% speedup could be labelled as statistically insignificant, the speedup is consistent on my machine. Furthermore, this is an end to end test, so it is expected that the improvement in the connectivity check itself is more significant. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
47c61004c7
commit
9fec7b2130
15
connected.c
15
connected.c
@ -24,7 +24,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||
struct child_process rev_list = CHILD_PROCESS_INIT;
|
||||
FILE *rev_list_in;
|
||||
struct check_connected_options defaults = CHECK_CONNECTED_INIT;
|
||||
struct object_id oid;
|
||||
const struct object_id *oid;
|
||||
int err = 0;
|
||||
struct packed_git *new_pack = NULL;
|
||||
struct transport *transport;
|
||||
@ -34,7 +34,8 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||
opt = &defaults;
|
||||
transport = opt->transport;
|
||||
|
||||
if (fn(cb_data, &oid)) {
|
||||
oid = fn(cb_data);
|
||||
if (!oid) {
|
||||
if (opt->err_fd)
|
||||
close(opt->err_fd);
|
||||
return err;
|
||||
@ -73,7 +74,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||
for (p = get_all_packs(the_repository); p; p = p->next) {
|
||||
if (!p->pack_promisor)
|
||||
continue;
|
||||
if (find_pack_entry_one(oid.hash, p))
|
||||
if (find_pack_entry_one(oid->hash, p))
|
||||
goto promisor_pack_found;
|
||||
}
|
||||
/*
|
||||
@ -83,7 +84,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||
goto no_promisor_pack_found;
|
||||
promisor_pack_found:
|
||||
;
|
||||
} while (!fn(cb_data, &oid));
|
||||
} while ((oid = fn(cb_data)) != NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -132,12 +133,12 @@ no_promisor_pack_found:
|
||||
* are sure the ref is good and not sending it to
|
||||
* rev-list for verification.
|
||||
*/
|
||||
if (new_pack && find_pack_entry_one(oid.hash, new_pack))
|
||||
if (new_pack && find_pack_entry_one(oid->hash, new_pack))
|
||||
continue;
|
||||
|
||||
if (fprintf(rev_list_in, "%s\n", oid_to_hex(&oid)) < 0)
|
||||
if (fprintf(rev_list_in, "%s\n", oid_to_hex(oid)) < 0)
|
||||
break;
|
||||
} while (!fn(cb_data, &oid));
|
||||
} while ((oid = fn(cb_data)) != NULL);
|
||||
|
||||
if (ferror(rev_list_in) || fflush(rev_list_in)) {
|
||||
if (errno != EPIPE && errno != EINVAL)
|
||||
|
Reference in New Issue
Block a user