git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Christian Couder <christian.couder@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Duy Nguyen" <pclouds@gmail.com>, git <git@vger.kernel.org>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Christian Couder" <chriscool@tuxfamily.org>
Subject: Re: [PATCH v3 14/21] read-cache: touch shared index files when used
Date: Tue, 31 Jan 2017 15:06:22 +0100	[thread overview]
Message-ID: <CAP8UFD3iWg5g-h209VDyg1U03Jmma8nTONyCYB-kN7GwspkL8Q@mail.gmail.com> (raw)
In-Reply-To: <xmqqsho6amm7.fsf@gitster.mtv.corp.google.com>

On Wed, Jan 25, 2017 at 9:52 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Christian Couder <christian.couder@gmail.com> writes:
>
>> Well, when we cannot freshen a loose file (with
>> freshen_loose_object()), we don't warn or die, we just write the loose
>> file. But here we cannot write the shared index file.
>
> I think that is an excellent point.  Let me make sure I got you
> right.  For loose object files, we may attempt to freshen and when
> it fails we stay silent and do not talk about the failure.  Instead,
> we write the same file again.  That will have two potential outcomes:
>
>  1. write fails and we fail the whole thing.  It is very clear to
>     the user that there is something wrong going on.
>
>  2. write succeeds, and because we just wrote it, we know that the
>     file is fresh and is protected from gc.
>
> So the "freshen and if fails just write" is sufficient.  It is
> absolutely the right thing to do for loose object files.
>
> When we are forking off a new split index file based on an old
> shared index file, we may attempt to "touch" the old shared one, but
> we cannot write the old shared one again, because other split index
> may be based on that, and we do not have enough information to
> recreate the old one [*1*].  The fallback safety is not available.

Yeah I agree. But note that I was talking about the case where the
shared index file does not exist anymore.
I was just saying that when the shared index file has been removed
behind us, it is equivalent as when
loose files have been removed behind us, except that we cannot write
the removed file to disk.

>> And this doesn't lead to a catastrophic failure right away.
>
> Exactly.
>
>> There
>> could be a catastrophic failure if the shared index file is needed
>> again later, but we are not sure that it's going to be needed later.
>> In fact it may have just been removed because it won't be needed
>> later.
>
> You are listing only the irrelevant cases.  The shared one may be
> used immediately, and the user can keep using it for a while without
> "touching".

Now you are talking about a case where the shared index file can be
used immediately and the user can keep using it.
This is a different case than the case I was talking about (which is
the case when the shared index file does not exist anymore).

> Perhaps the shared one was chowned to "root" while the
> user is looking the other way, and its timestamp is now frozen to
> the time of chown.  It is a ticking time-bomb that will go off when
> your expiry logic kicks in.

In the case I was talking about, the shared index file doesn't exist
anymore. So there is no time ticking bomb, because what could happen,
if we cannot freshen the shared index file, is that the shared index
file could be removed, which wouldn't make things worse as anyway it
does not exist anymore.

So the case when the shared index file doesn't exist is different than
other cases.

Now if you want to talk about the case when the shared index file has
not been removed, but just chowned to "root", then I wonder how is it
different from the case when the file system is read only.
Perhaps the admin just chowned everything to make sure that the repo
could not be changed anymore by the usual processes and users.

>> So I am not sure it's a good idea to anticipate a catastrophic failure
>> that may not happen. Perhaps we could just warn, but I am not sure it
>> will help the user. If the catastrophic failure doesn't happen because
>> the shared index file is not needed, I can't see how the warning could
>> help. And if there is a catastrophic failure, the following will be
>> displayed:
>>
>> fatal: .git/sharedindex.cbfe41352a4623d4d3e9757861fed53f3094e0ac:
>> index file open failed: No such file or directory
>
> That "fatal" is given _ONLY_ after time passes and our failure to
> "touch" the file that is still-in-use left it subject to "gc".  Of
> course, when "fatal" is given, it is too late to warn about ticking
> time bomb.
>
> At the time we notice a ticking time bomb is the only sensible time
> to warn.  Or better yet take a corrective action.

In a previous email you wrote that if the file system is read only, it
is a bad thing if we warn.
So I wonder why it would be a good thing to warn or try to do
something if the admin chowned everything to prevent usual processes
and users to change anything.

> As I expect (and you seem to agree) that a failure to "touch" would
> be a very rare event (like, sysadmin chowning it to "root" by
> mistake),

Yeah, I agree that a failure to "touch" would be a rare event. But the
thing is we often don't know if admins or users do things by mistake
or not.
If they rm -rf everything forcefully, for example, they might not like
it, if we start to rewrite stuff to try to "correct" things.

> I do not mind if the "corrective action" were "immediately
> unsplit the index, so that at least the current and the latest index
> contents will be written out safely to a new single unsplit index
> file".

If the admins or users chowned a shared index file precisely because
they want to save it from ever being garbage collected, I am not sure
that they would be happy if we decide to "correct" things.
For example they might not like it if we change the current mode to
unsplit index.

So in my opinion, the safest thing, if we really want to do something,
is to just warn, perhaps once, and I am ok to do that.
If we really wanted to do our best, perhaps we could warn once only in
the case when the shared index file still exists (because otherwise
there nothing to lose anymore).

> That won't help _other_ split index files that are based on
> the same "untouchable" shared index, but I do not think that is a
> problem we need to solve---if they are still in use, the code that
> use them will notice it, and otherwise they are not in use and can
> be aged away safely.

I am not sure that I understand you correctly on this. The current
code does not age away the split index files. It only ages away shared
index files.
I think aging away the split index file is a different issue, because
when we are not in split index mode, the index files are not aged
anyway.

  reply	other threads:[~2017-01-31 14:07 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-26 10:22 [PATCH v3 00/21] Add configuration options for split-index Christian Couder
2016-12-26 10:22 ` [PATCH v3 01/21] config: mark an error message up for translation Christian Couder
2016-12-26 10:22 ` [PATCH v3 02/21] config: add git_config_get_split_index() Christian Couder
2016-12-26 10:22 ` [PATCH v3 03/21] split-index: add {add,remove}_split_index() functions Christian Couder
2016-12-26 10:22 ` [PATCH v3 04/21] read-cache: add and then use tweak_split_index() Christian Couder
2016-12-26 10:22 ` [PATCH v3 05/21] update-index: warn in case of split-index incoherency Christian Couder
2016-12-26 10:22 ` [PATCH v3 06/21] t1700: add tests for core.splitIndex Christian Couder
2016-12-27 19:04   ` Junio C Hamano
2017-01-02  8:29     ` Christian Couder
2017-01-03 12:58       ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 07/21] Documentation/config: add information " Christian Couder
2016-12-26 10:22 ` [PATCH v3 08/21] Documentation/git-update-index: talk about core.splitIndex config var Christian Couder
2016-12-27 19:07   ` Junio C Hamano
2017-01-02  9:39     ` Christian Couder
2017-01-07 21:38       ` Junio C Hamano
2017-01-09 11:18         ` Duy Nguyen
2017-01-23 15:55           ` Christian Couder
2017-01-23 19:59             ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 09/21] config: add git_config_get_max_percent_split_change() Christian Couder
2016-12-26 10:22 ` [PATCH v3 10/21] read-cache: regenerate shared index if necessary Christian Couder
2016-12-27 19:08   ` Junio C Hamano
2017-01-02 11:23     ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 11/21] t1700: add tests for splitIndex.maxPercentChange Christian Couder
2016-12-26 10:22 ` [PATCH v3 12/21] Documentation/config: add splitIndex.maxPercentChange Christian Couder
2016-12-27 19:09   ` Junio C Hamano
2017-01-02 13:50     ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 13/21] sha1_file: make check_and_freshen_file() non static Christian Couder
2016-12-27 19:09   ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 14/21] read-cache: touch shared index files when used Christian Couder
2016-12-27 19:10   ` Junio C Hamano
2017-01-02 14:09     ` Christian Couder
2017-01-07 21:46       ` Junio C Hamano
2017-01-09 10:55         ` Duy Nguyen
2017-01-09 14:34           ` Junio C Hamano
2017-01-19 12:13             ` Duy Nguyen
2017-01-19 19:00               ` Junio C Hamano
2017-01-20 10:44                 ` Duy Nguyen
2017-01-23 18:14                 ` Christian Couder
2017-01-23 18:53                   ` Junio C Hamano
2017-01-25 14:35                     ` Christian Couder
2017-01-25 20:52                       ` Junio C Hamano
2017-01-31 14:06                         ` Christian Couder [this message]
2017-01-31 19:22                           ` Junio C Hamano
2017-01-31 21:09                             ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 15/21] config: add git_config_get_expiry() from gc.c Christian Couder
2016-12-26 10:22 ` [PATCH v3 16/21] read-cache: unlink old sharedindex files Christian Couder
2016-12-26 10:22 ` [PATCH v3 17/21] t1700: test shared index file expiration Christian Couder
2016-12-26 10:22 ` [PATCH v3 18/21] read-cache: refactor read_index_from() Christian Couder
2016-12-26 10:22 ` [PATCH v3 19/21] read-cache: use freshen_shared_index() in read_index_from() Christian Couder
2016-12-26 10:22 ` [PATCH v3 20/21] Documentation/config: add splitIndex.sharedIndexExpire Christian Couder
2016-12-27 19:11   ` Junio C Hamano
2017-01-02 14:33     ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 21/21] Documentation/git-update-index: explain splitIndex.* Christian Couder
2016-12-27 19:13   ` Junio C Hamano
2017-01-02 16:04     ` Christian Couder
2016-12-26 10:29 ` [PATCH v3 00/21] Add configuration options for split-index Christian Couder

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=CAP8UFD3iWg5g-h209VDyg1U03Jmma8nTONyCYB-kN7GwspkL8Q@mail.gmail.com \
    --to=christian.couder@gmail.com \
    --cc=avarab@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=pclouds@gmail.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.
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).