all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Ludovic Courtès" <ludo@gnu.org>
To: Christopher Baines <mail@cbaines.net>
Cc: guix-devel@gnu.org
Subject: Re: Potential for a race condition with latest-repository-commit
Date: Wed, 18 Mar 2020 17:19:05 +0100	[thread overview]
Message-ID: <871rpp8wli.fsf@gnu.org> (raw)
In-Reply-To: <87blphw0l1.fsf@cbaines.net> (Christopher Baines's message of "Sat, 29 Feb 2020 21:22:18 +0000")

Hi,

Christopher Baines <mail@cbaines.net> skribis:

> So one of the things that's currently restricted to doing by one job at
> a time in the Guix Data Service is running latest-repository-commit from
> the (guix git) module.
>
> Previously this was more of a problem for the Guix Data Service, as a
> large section of the work for loading information about a revision was
> serialised to avoid the potential for contention over the cached
> checkout this procedure uses. There's still a lock used now, but I
> realised when looking in to this further that it's only necessary to
> lock around this specific call, not the larger section that was
> restricted previously.
>
> I think that add-to-store which this procedure uses isn't atomic for a
> directory, so there's a risk of weird results if the repository is
> changed after the required revision is checked out. While it isn't
> common to run guix pull twice, I think this could happen there if you
> ran guix pull concurrently for the same repository, but two different
> profiles. I added a sleep call just prior to the add-to-store call in
> latest-repository-commit, and tested running guix pull twice at roughly
> the same time, with different branches and profiles, and I did see both
> profiles then reflecting a single branch, so one profile was mistakenly
> referring to the wrong branch.

Yes, we’ve also seen this problem with ‘static-web-site-service’¹,
whereby if several instances would try to pull from, say,
guix-artwork.git, we’d get non-deterministic results.  We worked around
it by using different cache directories…

¹ https://git.savannah.gnu.org/cgit/guix/maintenance.git/tree/hydra/modules/sysadmin/web.scm

> Is this something that is worth guarding against? Maybe
> latest-repository-commit could double check the Git repo state after
> add-to-store completes, and raise an error if it's different to what it
> expects. Or perhaps individual worktrees could be used for each process,
> which would hopefully avoid the race condition entirely.

It think it’d be worth guarding against it, yes.  What we could do is
lock the cache directory, with something like ‘with-file-lock’.

WDYT?

Thanks,
Ludo’.

  reply	other threads:[~2020-03-18 16:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-29 21:22 Potential for a race condition with latest-repository-commit Christopher Baines
2020-03-18 16:19 ` Ludovic Courtès [this message]
2020-03-29 14:10   ` Christopher Baines

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=871rpp8wli.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=guix-devel@gnu.org \
    --cc=mail@cbaines.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 external index

	https://git.savannah.gnu.org/cgit/guix.git

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.