git-commit-vandalism/builtin
Nguyễn Thái Ngọc Duy ac77d0c370 pack-objects: shrink size field in struct object_entry
It's very very rare that an uncompressed object is larger than 4GB
(partly because Git does not handle those large files very well to
begin with). Let's optimize it for the common case where object size
is smaller than this limit.

Shrink size field down to 31 bits and one overflow bit. If the size is
too large, we read it back from disk. As noted in the previous patch,
we need to return the delta size instead of canonical size when the
to-be-reused object entry type is a delta instead of a canonical one.

Add two compare helpers that can take advantage of the overflow
bit (e.g. if the file is 4GB+, chances are it's already larger than
core.bigFileThreshold and there's no point in comparing the actual
value).

Another note about oe_get_size_slow(). This function MUST be thread
safe because SIZE() macro is used inside try_delta() which may run in
parallel. Outside parallel code, no-contention locking should be dirt
cheap (or insignificant compared to i/o access anyway). To exercise
this code, it's best to run the test suite with something like

    make test GIT_TEST_OE_SIZE=4

which forces this code on all objects larger than 3 bytes.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-16 12:38:59 +09:00
..
add.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
am.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
annotate.c
apply.c apply: move lockfile into apply_state 2017-10-06 10:07:18 +09:00
archive.c correct error messages for NULL packet_read_line() 2018-02-08 12:37:30 -08:00
bisect--helper.c bisect: mention "view" as an alternative to "visualize" 2017-11-13 10:51:14 +09:00
blame.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
branch.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
bundle.c
cat-file.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
check-attr.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
check-ignore.c check-ignore: fix mix of directories and other file types 2018-02-12 13:09:35 -08:00
check-mailmap.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
check-ref-format.c Merge branch 'jc/check-ref-format-oor' into maint 2017-11-15 12:04:57 +09:00
checkout-index.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
checkout.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
clean.c completion: use __gitcomp_builtin in _git_clean 2018-02-09 10:24:50 -08:00
clone.c object-store: close all packs upon clearing the object store 2018-03-26 10:05:55 -07:00
column.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
commit-tree.c sha1_file: convert assert_sha1_type to object_id 2018-03-14 09:23:49 -07:00
commit.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
config.c config: change default of pager.config to "on" 2018-02-21 14:27:30 -08:00
count-objects.c packfile: keep prepare_packed_git() private 2018-03-26 10:07:43 -07:00
credential.c
describe.c Merge branch 'rs/describe-unique-abbrev' into maint 2018-03-22 14:24:14 -07:00
diff-files.c submodule: remove gitmodules_config 2017-08-03 13:11:02 -07:00
diff-index.c Merge branch 'ma/builtin-unleak' 2017-10-07 16:27:55 +09:00
diff-tree.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
diff.c Switch empty tree and blob lookups to use hash abstraction 2017-11-13 13:20:44 +09:00
difftool.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
fast-export.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
fetch-pack.c fetch: inherit filter-spec from partial clone 2017-12-08 09:58:52 -08:00
fetch.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
fmt-merge-msg.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
for-each-ref.c provide --color option for all ref-filter users 2017-10-04 11:35:29 +09:00
fsck.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
gc.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
get-tar-commit-id.c distinguish error versus short read from read_in_full() 2017-09-27 15:45:24 +09:00
grep.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
hash-object.c sha1_file: rename hash_sha1_file_literally 2018-01-30 10:42:36 -08:00
help.c help: rename 'new' variables 2018-02-22 10:08:05 -08:00
index-pack.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
init-db.c init-db: rename 'template' variables 2018-02-22 10:08:05 -08:00
interpret-trailers.c Merge branch 'jk/trailers-parse' 2017-08-26 22:55:04 -07:00
log.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
ls-files.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
ls-remote.c completion: use __gitcomp_builtin in _git_ls_remote 2018-02-09 10:24:51 -08:00
ls-tree.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
mailinfo.c
mailsplit.c
merge-base.c Merge branch 'ma/reduce-heads-leakfix' 2017-11-15 12:14:32 +09:00
merge-file.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
merge-index.c
merge-ours.c Merge branch 'bw/diff-opt-impl-to-bitfields' 2017-11-09 14:31:27 +09:00
merge-recursive.c
merge-tree.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
merge.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
mktag.c Convert lookup_replace_object to struct object_id 2018-03-14 09:23:50 -07:00
mktree.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
mv.c Merge branch 'sm/mv-dry-run-update' into maint 2018-03-22 14:24:25 -07:00
name-rev.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
notes.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
pack-objects.c pack-objects: shrink size field in struct object_entry 2018-04-16 12:38:59 +09:00
pack-redundant.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
pack-refs.c
patch-id.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
prune-packed.c Merge branch 'jt/packmigrate' 2017-08-26 22:55:09 -07:00
prune.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
pull.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
push.c completion: use __gitcomp_builtin in _git_push 2018-02-09 10:24:52 -08:00
read-tree.c submodule: remove gitmodules_config 2017-08-03 13:11:02 -07:00
rebase--helper.c Merge branch 'gs/rebase-allow-empty-message' 2018-02-21 12:45:04 -08:00
receive-pack.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
reflog.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
remote-ext.c consistently use "fallthrough" comments in switches 2017-09-22 12:49:57 +09:00
remote-fd.c
remote.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
repack.c gc: do not repack promisor packfiles 2017-12-08 09:52:42 -08:00
replace.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
rerere.c avoid "write_in_full(fd, buf, len) != len" pattern 2017-09-14 15:17:59 +09:00
reset.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
rev-list.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
rev-parse.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
revert.c sequencer: improve config handling 2017-12-13 11:15:14 -08:00
rm.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
send-pack.c Merge branch 'ma/parse-maybe-bool' 2017-08-22 10:29:03 -07:00
shortlog.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
show-branch.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
show-ref.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
stripspace.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
submodule--helper.c Merge branch 'rs/status-with-removed-submodule' 2018-04-11 13:09:56 +09:00
symbolic-ref.c refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
tag.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
unpack-file.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
unpack-objects.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
update-index.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
update-ref.c refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
update-server-info.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
upload-archive.c
var.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-commit.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
verify-pack.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-tag.c Merge branch 'jk/ref-filter-colors' 2017-08-11 13:26:58 -07:00
worktree.c Merge branch 'nd/worktree-prune' 2018-04-10 08:25:45 +09:00
write-tree.c cache-tree: convert write_*_as_tree to object_id 2018-03-14 09:23:47 -07:00