git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stefan Beller <sbeller@google.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jonathan Nieder <jrnieder@gmail.com>,
	"git@vger.kernel.org" <git@vger.kernel.org>,
	"brian m. carlson" <sandals@crustytoothpaste.net>
Subject: Re: [PATCH 25/39] sha1_file: allow alt_odb_usable to handle arbitrary repositories
Date: Wed, 6 Sep 2017 14:59:58 -0700	[thread overview]
Message-ID: <CAGZ79kb+GDvh8+HZ6Hu8ydj6BUNY4YckvyXtvZbsxaME9zyWYQ@mail.gmail.com> (raw)
In-Reply-To: <xmqqd1734mvg.fsf@gitster.mtv.corp.google.com>

On Wed, Sep 6, 2017 at 1:01 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
>
>> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
>> Signed-off-by: Stefan Beller <sbeller@google.com>
>> ---
>>  sha1_file.c | 16 +++++++++-------
>>  1 file changed, 9 insertions(+), 7 deletions(-)
>>
>> diff --git a/sha1_file.c b/sha1_file.c
>> index e7c86e5363..b854cad970 100644
>> --- a/sha1_file.c
>> +++ b/sha1_file.c
>> @@ -25,6 +25,7 @@
>>  #include "repository.h"
>>  #include "object-store.h"
>>  #include "streaming.h"
>> +#include "path.h"
>>  #include "dir.h"
>>  #include "mru.h"
>>  #include "list.h"
>> @@ -281,17 +282,18 @@ static const char *alt_sha1_path(struct alternate_object_database *alt,
>>  /*
>>   * Return non-zero iff the path is usable as an alternate object database.
>>   */
>> -#define alt_odb_usable(r, p, n) alt_odb_usable_##r(p, n)
>> -static int alt_odb_usable_the_repository(struct strbuf *path,
>> -                                      const char *normalized_objdir)
>> +static int alt_odb_usable(struct repository *r, struct strbuf *path,
>> +                       const char *normalized_objdir)
>
> These token-pasting macros introduced in 07-24/39 were certainly
> cute but they may be rather misleading and useless.  e.g. a natural
> expectaion would be
>
>         struct repository *r = &the_repository;
>         prepare_alt_odb(r);
>
> to work, but obviously it wouldn't.  And this step and later in
> 25-39/39 corrects them one by one.

Yes. The intent was to deliver patches that are easiest to review as
that is usually the crux with long series. To do that we came up with this
way:
* patches  07-24 can be reviewed easily by only looking at
   the textual replacement, no need to think about implications.
   It should be boring(in a good way) to review these.
* patches 25-39, that allow arbitrary repositories to be handled
   only need to be reviewed inside its function bounds, because
   each function call that takes a repository argument will be verified
   by the compiler, precisely because the above won't work!
   That way the reviewer can rely on the compile output
   that the conversion was done in the correct order and no
   small function was missed. All review attention can go into
   just looking at the one function that is converted in such a
   patch. no need to double check with other parts of the code.
   We discussed we'd send the patches 25-39 with --function-context.
   The follow ups will do so.

> I suspect that you used the token-pasting cuteness because you
> thought that the callsite would not have to change in the later step
> like 25/39 that removes the trick.

No. We did these two different phases to ease review specifically.

Note how the call site is the function itself, ( --function-context would
have been really neat here)


>  I also suspect that you thought
> that it may be a good thing that prepare_alt_odb(r) does not work
> immediately after 07/39, as the callee is not prepared.  But both of
> these are misguided.
>
> If you have two functions, A and B, that we want to update to
> eventually take a "struct repository *" argument, and if A uses B in
> its implementation, the endgame would be
>
>         A(struct repository *r, ...)
>         {
>                 ...
>                 B(r, ...);
>                 ...
>         }
>
> but with the ##r approach, the call to B in A in the initial
> token-pasting phase would say B(the_repository, ...) so the call
> will need to be changed in the step you update A's implementation to
> take a caller-supplied respotory object anyway.  And the fact that a
> function's first parameter is not the_repository (i.e. leaving B()'s
> signature unchanged while it is not ready to take a repository) is
> sufficient to mark that a function is not yet prepared to take a
> caller-supplied repository object.

The absence of a repository argument is not sufficient that a function
(or any function called by it) does not rely on some global state, which
needs to be put into the repository struct.

So when converting function A (above), the careful reviewer needs to
inspect B, C, D... if they touch global state. Using the current approach,
most functions (maybe just B and C here) would take a repository struct
already, and the compiler would yell if these were not ready for anything
except the_repository. So the reviewer only has to worry about D.

> I found that this aspect of the structure of the series was somewhat
> irritating in that (1) combining the earlier ##r thing with its fix
> would have made the code that needs to be reviewed much cleaner,

agreed.

> (2) it wouldn't have made the patch that longer,

but more complicated to review (and write actually; as it was easy
to reason about functions to be ready for conversion, not using
global state)

> and most importantly
> (3) it is unclear why 24-7 != 39-25, i.e. it is hard to answer "is
> there any ##r hack still remaining after this series?  if so why?"

Jonathan is currently OOO, but last week we continued developing this
series and ended up with ca. 90 patches in the series.

> The end-result of the whole series makes me think that it is going
> in the right direction, though.

We'll revisit if we can squash commits before sending out.

Thanks for the feedback,
Stefan

  reply	other threads:[~2017-09-06 22:00 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-30  6:46 [PATCH 00/39] per-repository object store, part 1 Jonathan Nieder
2017-08-30  6:48 ` [PATCH 01/39] pack: make packed_git_mru global a value instead of a pointer Jonathan Nieder
2017-08-30 19:44   ` Jeff King
2017-09-06 19:51     ` Junio C Hamano
2017-08-30  6:52 ` [PATCH 02/39] repository: introduce object store field Jonathan Nieder
2017-08-30  6:53 ` [PATCH 03/39] object-store: move alt_odb_list and alt_odb_tail to object store Jonathan Nieder
2017-08-30  6:54 ` [PATCH 04/39] object-store: move packed_git and packed_git_mru " Jonathan Nieder
2017-08-30  6:54 ` [PATCH 05/39] pack: move prepare_packed_git_run_once " Jonathan Nieder
2017-08-30  6:55 ` [PATCH 06/39] pack: move approximate object count " Jonathan Nieder
2017-08-30  6:56 ` [PATCH 07/39] sha1_file: add repository argument to alt_odb_usable Jonathan Nieder
2017-08-30 22:40   ` Brandon Williams
2017-08-30  6:57 ` [PATCH 08/39] sha1_file: add repository argument to link_alt_odb_entry Jonathan Nieder
2017-08-30  6:58 ` [PATCH 09/39] sha1_file: add repository argument to read_info_alternates Jonathan Nieder
2017-08-30  6:58 ` [PATCH 10/39] sha1_file: add repository argument to link_alt_odb_entries Jonathan Nieder
2017-08-30  6:59 ` [PATCH 11/39] sha1_file: add repository argument to stat_sha1_file Jonathan Nieder
2017-08-30  6:59 ` [PATCH 12/39] sha1_file: add repository argument to open_sha1_file Jonathan Nieder
2017-08-30  7:00 ` [PATCH 13/39] sha1_file: add repository argument to map_sha1_file_1 Jonathan Nieder
2017-08-30  7:01 ` [PATCH 14/39] sha1_file: add repository argument to sha1_loose_object_info Jonathan Nieder
2017-08-30  7:01 ` [PATCH 15/39] object-store: add repository argument to prepare_alt_odb Jonathan Nieder
2017-08-30  7:02 ` [PATCH 16/39] object-store: add repository argument to foreach_alt_odb Jonathan Nieder
2017-08-30  7:02 ` [PATCH 17/39] pack: add repository argument to install_packed_git Jonathan Nieder
2017-08-30  7:03 ` [PATCH 18/39] pack: add repository argument to prepare_packed_git_one Jonathan Nieder
2017-08-30  7:03 ` [PATCH 19/39] pack: add repository argument to rearrange_packed_git Jonathan Nieder
2017-08-30  7:04 ` [PATCH 20/39] pack: add repository argument to prepare_packed_git_mru Jonathan Nieder
2017-08-30  7:05 ` [PATCH 21/39] pack: add repository argument to prepare_packed_git Jonathan Nieder
2017-08-30  7:06 ` [PATCH 22/39] pack: add repository argument to reprepare_packed_git Jonathan Nieder
2017-08-30  7:06 ` [PATCH 23/39] pack: add repository argument to sha1_file_name Jonathan Nieder
2017-08-30  7:07 ` [PATCH 24/39] pack: add repository argument to map_sha1_file Jonathan Nieder
2017-08-30  7:08 ` [PATCH 25/39] sha1_file: allow alt_odb_usable to handle arbitrary repositories Jonathan Nieder
2017-09-06 20:01   ` Junio C Hamano
2017-09-06 21:59     ` Stefan Beller [this message]
2017-08-30  7:10 ` [PATCH 26/39] object-store: allow prepare_alt_odb " Jonathan Nieder
2017-08-30  7:11 ` [PATCH 27/39] object-store: allow foreach_alt_odb " Jonathan Nieder
2017-08-30  7:11 ` [PATCH 28/39] pack: allow install_packed_git " Jonathan Nieder
2017-08-30  7:12 ` [PATCH 29/39] pack: allow rearrange_packed_git " Jonathan Nieder
2017-08-30  7:12 ` [PATCH 30/39] pack: allow prepare_packed_git_mru " Jonathan Nieder
2017-08-30  7:13 ` [PATCH 31/39] pack: allow prepare_packed_git_one " Jonathan Nieder
2017-08-30  7:13 ` [PATCH 32/39] pack: allow prepare_packed_git " Jonathan Nieder
2017-08-30  7:14 ` [PATCH 33/39] pack: allow reprepare_packed_git " Jonathan Nieder
2017-08-30  7:14 ` [PATCH 34/39] pack: allow sha1_file_name " Jonathan Nieder
2017-08-30  7:15 ` [PATCH 35/39] pack: allow stat_sha1_file " Jonathan Nieder
2017-08-30  7:16 ` [PATCH 36/39] pack: allow open_sha1_file " Jonathan Nieder
2017-08-30  7:16 ` [PATCH 37/39] pack: allow map_sha1_file_1 " Jonathan Nieder
2017-08-30  7:16 ` [PATCH 38/39] pack: allow map_sha1_file " Jonathan Nieder
2017-08-30  7:18 ` [PATCH 39/39] pack: allow sha1_loose_object_info " Jonathan Nieder
2017-08-30 23:07 ` [PATCH 00/39] per-repository object store, part 1 Brandon Williams

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=CAGZ79kb+GDvh8+HZ6Hu8ydj6BUNY4YckvyXtvZbsxaME9zyWYQ@mail.gmail.com \
    --to=sbeller@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=sandals@crustytoothpaste.net \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).