mirror of
https://git.proxmox.com/git/libgit2
synced 2026-01-05 18:32:16 +00:00
odb: Prioritize alternate backends
For most real use cases, repositories with alternates use them as main object storage. Checking the alternate for objects before the main repository should result in measurable speedups. Because of this, we're changing the sorting algorithm to prioritize alternates *in cases where two backends have the same priority*. This means that the pack backend for the alternate will be checked before the pack backend for the main repository *but* both of them will be checked before any loose backends.
This commit is contained in:
parent
43820f204e
commit
a0a1b19ab0
12
src/odb.c
12
src/odb.c
@ -374,10 +374,14 @@ static int backend_sort_cmp(const void *a, const void *b)
|
||||
const backend_internal *backend_a = (const backend_internal *)(a);
|
||||
const backend_internal *backend_b = (const backend_internal *)(b);
|
||||
|
||||
if (backend_a->is_alternate == backend_b->is_alternate)
|
||||
return (backend_b->priority - backend_a->priority);
|
||||
|
||||
return backend_a->is_alternate ? 1 : -1;
|
||||
if (backend_b->priority == backend_a->priority) {
|
||||
if (backend_a->is_alternate)
|
||||
return -1;
|
||||
if (backend_b->is_alternate)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
return (backend_b->priority - backend_a->priority);
|
||||
}
|
||||
|
||||
int git_odb_new(git_odb **out)
|
||||
|
||||
@ -57,14 +57,14 @@ void test_odb_sorting__basic_backends_sorting(void)
|
||||
|
||||
void test_odb_sorting__alternate_backends_sorting(void)
|
||||
{
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(0), 5));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(2), 3));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(1), 4));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(3), 1));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(4), 5));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(6), 3));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(5), 4));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(7), 1));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(1), 5));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(5), 3));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(3), 4));
|
||||
cl_git_pass(git_odb_add_backend(_odb, new_backend(7), 1));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(0), 5));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(4), 3));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(2), 4));
|
||||
cl_git_pass(git_odb_add_alternate(_odb, new_backend(6), 1));
|
||||
|
||||
check_backend_sorting(_odb);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user