All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Jonathan Tan <jonathantanmy@google.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/2] sha1_file: remove read_packed_sha1()
Date: Fri, 11 Aug 2017 15:06:54 -0700	[thread overview]
Message-ID: <xmqqa835zrlt.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <557fbeeac6a0f65d48ba0902f20c0650e75ae332.1502483486.git.jonathantanmy@google.com> (Jonathan Tan's message of "Fri, 11 Aug 2017 13:36:15 -0700")

Jonathan Tan <jonathantanmy@google.com> writes:

> Use read_object() in its place instead. This avoids duplication of code.
>
> This makes force_object_loose() slightly slower (because of a redundant
> check of loose object storage), but only in the error case.
>
> Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
> ---
>  sha1_file.c | 26 +-------------------------
>  1 file changed, 1 insertion(+), 25 deletions(-)

The original code insisted on reading from pack and never from a
loose object, because it knew it would return early when it found a
loose version.  Now we allow a loose one to appear in the middle of
force_object_loose() operation and happily read from it when we do
not see a pack entry for the object---presumably because we are
racing with another simultanous repack process, or something?---and
then write it out as a new (and identical) loose object, which would
not do any harm.

So this is not strictly a no-op conversion; I have a gut feeling
that it would make it more robust, not less, in the presence of
another racing repack process, but I haven't really thought through
race scenarios that may make difference in its behaviour.


> diff --git a/sha1_file.c b/sha1_file.c
> index 910109fd9..0f758eabf 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -3062,30 +3062,6 @@ int sha1_object_info(const unsigned char *sha1, unsigned long *sizep)
>  	return type;
>  }
>  
> -static void *read_packed_sha1(const unsigned char *sha1,
> -			      enum object_type *type, unsigned long *size)
> -{
> -	struct pack_entry e;
> -	void *data;
> -
> -	if (!find_pack_entry(sha1, &e))
> -		return NULL;
> -	data = cache_or_unpack_entry(e.p, e.offset, size, type);
> -	if (!data) {
> -		/*
> -		 * We're probably in deep shit, but let's try to fetch
> -		 * the required object anyway from another pack or loose.
> -		 * This should happen only in the presence of a corrupted
> -		 * pack, and is better than failing outright.
> -		 */
> -		error("failed to read object %s at offset %"PRIuMAX" from %s",
> -		      sha1_to_hex(sha1), (uintmax_t)e.offset, e.p->pack_name);
> -		mark_bad_packed_object(e.p, sha1);
> -		data = read_object(sha1, type, size);
> -	}
> -	return data;
> -}
> -
>  int pretend_sha1_file(void *buf, unsigned long len, enum object_type type,
>  		      unsigned char *sha1)
>  {
> @@ -3468,7 +3444,7 @@ int force_object_loose(const unsigned char *sha1, time_t mtime)
>  
>  	if (has_loose_object(sha1))
>  		return 0;
> -	buf = read_packed_sha1(sha1, &type, &len);
> +	buf = read_object(sha1, &type, &len);
>  	if (!buf)
>  		return error("cannot read sha1_file for %s", sha1_to_hex(sha1));
>  	hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;

  reply	other threads:[~2017-08-11 22:07 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-08 19:32 [RFC PATCH 00/10] An attempt to move packfile funcs to its own file Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 01/10] pack: move pack name-related functions Jonathan Tan
2017-08-08 20:36   ` Stefan Beller
2017-08-08 20:50     ` Jonathan Tan
2017-08-09 12:00       ` Christian Couder
2017-08-09 17:16         ` Jonathan Tan
2017-08-11 19:38           ` Ben Peart
2017-08-11 21:34             ` Junio C Hamano
2017-08-16 22:53               ` Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 02/10] pack: move static state variables Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 03/10] pack: move pack_report() Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 04/10] pack: move open_pack_index(), parse_pack_index() Jonathan Tan
2017-08-08 20:19   ` Junio C Hamano
2017-08-08 20:45     ` Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 05/10] pack: move release_pack_memory() Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 06/10] pack: move pack-closing functions Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 07/10] pack: move use_pack() Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 08/10] pack: move unuse_pack() Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 09/10] pack: move add_packed_git() Jonathan Tan
2017-08-08 19:32 ` [RFC PATCH 10/10] pack: move install_packed_git() Jonathan Tan
2017-08-08 20:05 ` [RFC PATCH 00/10] An attempt to move packfile funcs to its own file Junio C Hamano
2017-08-08 20:43   ` Jonathan Tan
2017-08-08 21:04     ` Junio C Hamano
2017-08-09  1:22 ` [PATCH v2 00/25] Move exported " Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 01/25] pack: move pack name-related functions Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 02/25] pack: move static state variables Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 03/25] pack: move pack_report() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 04/25] pack: move open_pack_index(), parse_pack_index() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 05/25] pack: move release_pack_memory() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 06/25] pack: move pack-closing functions Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 07/25] pack: move use_pack() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 08/25] pack: move unuse_pack() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 09/25] pack: move add_packed_git() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 10/25] pack: move install_packed_git() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 11/25] pack: move {,re}prepare_packed_git and approximate_object_count Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 12/25] pack: move unpack_object_header() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 13/25] pack: move get_size_from_delta() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 14/25] pack: move unpack_object_header() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 15/25] sha1_file: set whence in storage-specific info fn Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 16/25] sha1_file: remove read_packed_sha1() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 17/25] pack: move packed_object_info(), unpack_entry() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 18/25] pack: move nth_packed_object_{sha1,oid} Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 19/25] pack: move check_pack_index_ptr(), nth_packed_object_offset() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 20/25] pack: move find_pack_entry_one(), is_pack_valid() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 21/25] pack: move find_sha1_pack() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 22/25] pack: move find_pack_entry() and make it global Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 23/25] pack: move has_sha1_pack() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 24/25] pack: move has_pack_index() Jonathan Tan
2017-08-09  1:22   ` [PATCH v2 25/25] pack: move for_each_packed_object() Jonathan Tan
2017-08-10 17:21   ` [PATCH v2 00/25] Move exported packfile funcs to its own file Stefan Beller
2017-08-10 21:19   ` Junio C Hamano
2017-08-10 21:59     ` Jonathan Tan
2017-08-10 22:40       ` Junio C Hamano
2017-08-11 20:36         ` [PATCH 0/2] non-move patches in preparation for packfile.c Jonathan Tan
2017-08-11 20:36           ` [PATCH 1/2] sha1_file: set whence in storage-specific info fn Jonathan Tan
2017-08-11 21:52             ` Junio C Hamano
2017-08-11 20:36           ` [PATCH 2/2] sha1_file: remove read_packed_sha1() Jonathan Tan
2017-08-11 22:06             ` Junio C Hamano [this message]
2017-08-11 19:41   ` [PATCH v2 00/25] Move exported packfile funcs to its own file Ben Peart
2017-08-18 23:36     ` Jonathan Tan
2017-08-18 22:20 ` [PATCH v3 00/23] " Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 01/23] pack: move pack name-related functions Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 02/23] pack: move static state variables Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 03/23] pack: move pack_report() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 04/23] pack: move open_pack_index(), parse_pack_index() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 05/23] pack: move release_pack_memory() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 06/23] pack: move pack-closing functions Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 07/23] pack: move use_pack() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 08/23] pack: move unuse_pack() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 09/23] pack: move add_packed_git() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 10/23] pack: move install_packed_git() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 11/23] pack: move {,re}prepare_packed_git and approximate_object_count Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 12/23] pack: move unpack_object_header_buffer() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 13/23] pack: move get_size_from_delta() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 14/23] pack: move unpack_object_header() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 15/23] pack: move clear_delta_base_cache(), packed_object_info(), unpack_entry() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 16/23] pack: move nth_packed_object_{sha1,oid} Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 17/23] pack: move check_pack_index_ptr(), nth_packed_object_offset() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 18/23] pack: move find_pack_entry_one(), is_pack_valid() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 19/23] pack: move find_sha1_pack() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 20/23] pack: move find_pack_entry() and make it global Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 21/23] pack: move has_sha1_pack() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 22/23] pack: move has_pack_index() Jonathan Tan
2017-08-18 22:20   ` [PATCH v3 23/23] pack: move for_each_packed_object() Jonathan Tan
2017-08-19  7:33   ` [PATCH v3 00/23] Move exported packfile funcs to its own file Junio C Hamano
2017-08-20  6:40     ` Junio C Hamano
2017-08-21 18:40       ` Jonathan Tan
2017-08-21 22:55         ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqa835zrlt.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=jonathantanmy@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.