diff options
author | Neeraj Singh <neerajsi@microsoft.com> | 2022-04-05 05:20:13 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-04-06 20:13:26 (GMT) |
commit | 425d290ce564ada84a5322545dbbd1866f2a29c4 (patch) | |
tree | f7178f2707631a4b316d557418a258fa1831049f /builtin/unpack-objects.c | |
parent | 23a3a303ab9bfec2321ac4d1ae9f4df279f3a20c (diff) | |
download | git-425d290ce564ada84a5322545dbbd1866f2a29c4.zip git-425d290ce564ada84a5322545dbbd1866f2a29c4.tar.gz git-425d290ce564ada84a5322545dbbd1866f2a29c4.tar.bz2 |
unpack-objects: use the bulk-checkin infrastructure
The unpack-objects functionality is used by fetch, push, and fast-import
to turn the transfered data into object database entries when there are
fewer objects than the 'unpacklimit' setting.
By enabling an odb-transaction when unpacking objects, we can take advantage
of batched fsyncs.
Here are some performance numbers to justify batch mode for
unpack-objects, collected on a WSL2 Ubuntu VM.
Fsync Mode | Time for 90 objects (ms)
-------------------------------------
Off | 170
On,fsync | 760
On,batch | 230
Note that the default unpackLimit is 100 objects, so there's a 3x
benefit in the worst case. The non-batch mode fsync scales linearly
with the number of objects, so there are significant benefits even with
smaller numbers of objects.
Signed-off-by: Neeraj Singh <neerajsi@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/unpack-objects.c')
-rw-r--r-- | builtin/unpack-objects.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 4a94662..c76a812 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -1,5 +1,6 @@ #include "builtin.h" #include "cache.h" +#include "bulk-checkin.h" #include "config.h" #include "object-store.h" #include "object.h" @@ -503,10 +504,12 @@ static void unpack_all(void) if (!quiet) progress = start_progress(_("Unpacking objects"), nr_objects); CALLOC_ARRAY(obj_list, nr_objects); + begin_odb_transaction(); for (i = 0; i < nr_objects; i++) { unpack_one(i); display_progress(progress, i + 1); } + end_odb_transaction(); stop_progress(&progress); if (delta_list) |