All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johan Herland <johan@herland.net>
To: Daniel Barkalow <barkalow@iabervon.org>
Cc: git@vger.kernel.org,
	"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
	"Kristian Høgsberg" <krh@redhat.com>,
	"Santi Béjar" <sbejar@gmail.com>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Linus Torvalds" <torvalds@linux-foundation.org>
Subject: Re: [PATCH] Add test for cloning with "--reference" repo being a subset of source repo
Date: Tue, 04 Mar 2008 04:02:57 +0100	[thread overview]
Message-ID: <200803040402.57993.johan@herland.net> (raw)
In-Reply-To: <alpine.LNX.1.00.0803031318000.19665@iabervon.org>

On Monday 03 March 2008, Daniel Barkalow wrote:
> On Mon, 3 Mar 2008, Johan Herland wrote:
> 
> > Not sure what's going on here, yet, but I thought I'd give you a heads up.
> 
> I figured it out, and pushed out a fix; it was doing everything correctly, 
> but it wrote to the alternates files after the library had read that file, 
> so it then didn't notice that it actually had the objects that are in the 
> second alternate repository.

Thanks. After looking a bit more at the original test repo where I found
this issue, I discovered another, similar bug. This one seems ugly; brace
yourself:

In some cases (I'm not exactly sure of all the preconditions) when
cloning with "--reference", it seems git tries to access a loose object
in the "--reference" repo instead of in the cloned repo, even if that
object is already present in the cloned repo and _missing_ in the
"--reference" repo. The symptom is this error message:
    error: Trying to write ref $ref with nonexistant object $sha1

After playing around with this in gdb, it seems the problem is all the
way down in sha1_file_name() (sha1_file.c). This function is responsible
for generating the loose object filename for a given $sha1. It keeps a
static char *base which is initially set to the object directory name,
and then calls fill_sha1_path() to copy the rest of the object filename
into the following bytes. On subsequent calls, only the fill_sha1_path()
part is done, thereby reusing the base from the previous invocation.

What I observe is that this base is not reset after accessing loose
objects in the "--reference" repo. Thus, later when accessing objects in
the cloned repo, sha1_file_name() generates incorrect filenames (pointing
to the "--reference" repo instead of the cloned repo).

Of course, this often goes undetected since the "--reference" repo often
have the same loose objects as the clone.

Unfortunately (from a builtin git-clone's POV) this seems to be
symptomatic of a deeper problem in this part of the code: Using
function-static variables as caches only works as far as the cache
is in sync with reality. Especially when switching between multiple
repositories within the same process, it seems that several of these
variables are left with invalid data in them. This needs to be fixed,
if not only for now, then at least as part of the libification effort.

I'm not sure what is the best way of fixing this issue; my initial guess
is to move these function-static variables out to file-level, and make
sure they're properly reset whenever the appropriate context is changed
(typically when set_git_dir() is called, I guess).

Here are the function-static variables I immediately found in sha1_file.c
(there may be more, both in sha1_file.c and in other files):
- sha1_file_name(): static char *base
- sha1_pack_name(): static char *base
- sha1_pack_index_name(): static char *base
- find_pack_entry(): static struct packed_git *last_found
  (not sure about this one)

I will follow up this email with two patches, one adding the failing test,
and one providing a simple fix for that specific test (although very much
insufficient as a fix for the actual issue described above).


...Johan

-- 
Johan Herland, <johan@herland.net>
www.herland.net

  reply	other threads:[~2008-03-04  3:04 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-25 21:12 [RFC] Build in clone Daniel Barkalow
2008-02-26  2:21 ` Johan Herland
2008-02-26 11:14   ` Johannes Schindelin
2008-02-26 12:19     ` Johan Herland
2008-02-26 12:58       ` Johan Herland
2008-02-26 13:37         ` Johan Herland
2008-02-26 15:35           ` [PATCH] Fix premature free of ref_lists while writing temporary refs to file Johan Herland
2008-02-26 15:42             ` Johannes Schindelin
2008-02-26 17:17               ` Johan Herland
2008-02-26 23:07               ` Daniel Barkalow
2008-02-26 23:11                 ` Johan Herland
2008-02-26 15:40   ` [PATCH] Fix premature call to git_config() causing t1020-subdirectory to fail Johan Herland
2008-02-26 15:47     ` Johannes Schindelin
2008-02-26 22:12     ` Daniel Barkalow
2008-02-26 22:40       ` Johannes Schindelin
2008-02-26 22:49         ` Daniel Barkalow
2008-02-27  0:20           ` Junio C Hamano
2008-02-27  0:53             ` Daniel Barkalow
2008-02-27  1:34               ` Junio C Hamano
2008-02-27 19:47                 ` Daniel Barkalow
2008-02-27 20:09                   ` Junio C Hamano
2008-02-27 20:31                     ` Daniel Barkalow
2008-02-26 17:36   ` [RFC] Build in clone Daniel Barkalow
2008-02-26 18:53     ` Kristian Høgsberg
2008-03-02  5:57     ` [PATCH] builtin-clone: create remotes/origin/HEAD symref, if guessed Johannes Schindelin
2008-03-02  6:25       ` [PATCH, fixed] " Johannes Schindelin
2008-03-02  7:46         ` [PATCH] builtin clone: support bundles Johannes Schindelin
2008-03-02 16:19           ` Daniel Barkalow
2008-03-03  0:04             ` Santi Béjar
2008-03-02 16:48           ` Daniel Barkalow
2008-03-02 17:34             ` Johannes Schindelin
2008-03-02 17:50               ` Junio C Hamano
2008-03-02 17:54                 ` Junio C Hamano
2008-03-03  9:04             ` [PATCH] Add test for cloning with "--reference" repo being a subset of source repo Johan Herland
2008-03-03 16:36               ` Daniel Barkalow
2008-03-03 18:21               ` Daniel Barkalow
2008-03-04  3:02                 ` Johan Herland [this message]
2008-03-04  3:04                   ` [PATCH 1/2] Add test illustrating issues with sha1_file_name() and switching repos Johan Herland
2008-03-04  3:05                   ` [PATCH 2/2] Overly simplistic fix for issue " Johan Herland
2008-03-04 23:10                   ` [PATCH] Add test for cloning with "--reference" repo being a subset of source repo Daniel Barkalow
2008-03-05  0:24                     ` Daniel Barkalow
2008-03-05 23:56                       ` Johan Herland
2008-03-03 17:05         ` [PATCH, fixed] builtin-clone: create remotes/origin/HEAD symref, if guessed Kristian Høgsberg
2008-03-03 17:09           ` Pierre Habouzit
2008-03-03 19:55             ` Johannes Schindelin
2008-03-03 17:10           ` Johannes Schindelin
2008-03-03 17:41           ` Johan Herland
  -- strict thread matches above, loose matches on Subject: below --
2008-05-22 22:03 [PATCH] Add test for cloning with "--reference" repo being a subset of source repo Daniel Barkalow
2008-05-22 22:31 ` Johan Herland

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=200803040402.57993.johan@herland.net \
    --to=johan@herland.net \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=barkalow@iabervon.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=krh@redhat.com \
    --cc=sbejar@gmail.com \
    --cc=torvalds@linux-foundation.org \
    /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.