public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: lib/portage/dbapi/
Date: Wed,  3 Jan 2024 05:57:59 +0000 (UTC)	[thread overview]
Message-ID: <1704261419.6c915f3ded10c23127c33b771453d54e3f0d4915.zmedico@gentoo> (raw)

commit:     6c915f3ded10c23127c33b771453d54e3f0d4915
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Jan  3 04:26:36 2024 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Jan  3 05:56:59 2024 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6c915f3d

binarytree: Avoid unnecessary build id incrementation

When allocating a local file name for a remote package,
prefer re-using the existing build id if the file name
is unused locally, in order to avoid unnecessary build
id incrementation triggered when the _max_build_id
method counts remote build ids. Use the same file name
reservation via open with O_EXCL which has been used
during build_id incrementation since fa901a6510c.

Bug: https://bugs.gentoo.org/921208
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/dbapi/bintree.py | 39 ++++++++++++++++++++++++++++-----------
 1 file changed, 28 insertions(+), 11 deletions(-)

diff --git a/lib/portage/dbapi/bintree.py b/lib/portage/dbapi/bintree.py
index d352b6fc0e..5fc4716980 100644
--- a/lib/portage/dbapi/bintree.py
+++ b/lib/portage/dbapi/bintree.py
@@ -1,4 +1,4 @@
-# Copyright 1998-2023 Gentoo Authors
+# Copyright 1998-2024 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 __all__ = ["bindbapi", "binarytree"]
@@ -2272,16 +2272,6 @@ class binarytree:
             raise InvalidBinaryPackageFormat(binpkg_format)
 
     def _allocate_filename_multi(self, cpv, remote_binpkg_format=None):
-        # First, get the max build_id found when _populate was
-        # called.
-        max_build_id = self._max_build_id(cpv)
-
-        # A new package may have been added concurrently since the
-        # last _populate call, so use increment build_id until
-        # we locate an unused id.
-        pf = catsplit(cpv)[1]
-        build_id = max_build_id + 1
-
         if remote_binpkg_format is None:
             try:
                 binpkg_format = get_binpkg_format(cpv._metadata["PATH"])
@@ -2299,6 +2289,33 @@ class binarytree:
         else:
             raise InvalidBinaryPackageFormat(binpkg_format)
 
+        # If the preferred path is available then return
+        # that. This prevents unnecessary build_id incrementation
+        # triggered when the _max_build_id method counts remote
+        # build ids.
+        pf = catsplit(cpv)[1]
+        if getattr(cpv, "build_id", False):
+            preferred_path = f"{os.path.join(self.pkgdir, cpv.cp, pf)}-{cpv.build_id}.{binpkg_suffix}"
+            if not os.path.exists(preferred_path):
+                try:
+                    # Avoid races
+                    ensure_dirs(os.path.dirname(preferred_path))
+                    with open(preferred_path, "x") as f:
+                        pass
+                except FileExistsError:
+                    pass
+                else:
+                    return (preferred_path, cpv.build_id)
+
+        # First, get the max build_id found when _populate was
+        # called.
+        max_build_id = self._max_build_id(cpv)
+
+        # A new package may have been added concurrently since the
+        # last _populate call, so use increment build_id until
+        # we locate an unused id.
+        build_id = max_build_id + 1
+
         while True:
             filename = (
                 f"{os.path.join(self.pkgdir, cpv.cp, pf)}-{build_id}.{binpkg_suffix}"


             reply	other threads:[~2024-01-03  5:58 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-03  5:57 Zac Medico [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-01-24 21:29 [gentoo-commits] proj/portage:master commit in: lib/portage/dbapi/ Zac Medico
2025-01-09 23:35 Zac Medico
2024-06-01 19:20 Zac Medico
2024-05-27 18:13 Zac Medico
2024-03-02 22:55 Zac Medico
2024-02-25  8:25 Sam James
2024-01-16  7:52 Sam James
2024-01-16  5:26 Zac Medico
2024-01-16  5:16 Sam James
2024-01-16  5:16 Sam James
2023-12-10  1:28 Zac Medico
2023-10-24 18:37 Zac Medico
2023-10-23 14:28 Zac Medico
2023-10-22 21:30 Zac Medico
2023-10-22 20:58 Zac Medico
2023-10-22 15:53 Zac Medico
2023-10-20  0:34 Zac Medico
2023-10-15 22:02 Zac Medico
2023-10-08 19:48 Zac Medico
2023-10-05  5:45 Zac Medico
2023-10-04  4:29 Zac Medico
2023-09-26 21:09 Sam James
2023-09-23 22:49 Sam James
2023-09-23 22:38 Sam James
2023-09-23 22:31 Sam James
2023-09-20 18:02 Mike Gilbert
2023-09-15  4:28 Sam James
2023-07-29  3:57 Sam James
2023-05-23  0:26 Sam James
2023-05-23  0:26 Sam James
2023-05-23  0:26 Sam James
2022-12-21  1:30 Sam James
2022-12-21  1:28 Sam James
2022-11-08 23:07 Sam James
2022-09-25 19:12 Mike Gilbert
2022-09-09 10:16 Michał Górny
2022-08-18 19:00 Mike Gilbert
2022-04-20 20:24 Zac Medico
2022-04-13 15:34 Sam James
2022-04-13 15:34 Sam James
2021-11-26 21:09 Mike Gilbert
2021-09-21  5:51 Zac Medico
2021-09-21  5:51 Zac Medico
2021-09-21  5:51 Zac Medico
2021-06-05 18:08 Zac Medico
2021-03-07 11:42 Zac Medico
2021-02-23 21:31 Zac Medico
2021-01-18  9:20 Zac Medico
2021-01-17 13:31 Zac Medico
2021-01-17  8:49 Zac Medico
2021-01-17  8:49 Zac Medico
2020-09-08  2:52 Zac Medico
2020-08-09  0:15 Zac Medico
2020-08-04  3:16 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 21:42 Zac Medico
2020-08-03 21:42 Zac Medico
2020-08-03 19:30 Zac Medico
2020-07-22 20:14 Zac Medico
2020-07-22 19:52 Zac Medico
2020-07-22 17:46 Zac Medico
2020-06-07  3:26 Zac Medico
2020-02-20  9:55 Zac Medico
2020-02-03  3:04 Zac Medico
2019-08-24  3:15 Zac Medico
2019-06-20 19:43 Zac Medico
2019-05-11 21:16 Zac Medico
2019-01-20  6:55 Zac Medico
2019-01-11 10:14 Fabian Groffen
2018-09-24  7:30 Zac Medico
2018-09-24  0:46 Zac Medico

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=1704261419.6c915f3ded10c23127c33b771453d54e3f0d4915.zmedico@gentoo \
    --to=zmedico@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox