From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id E7C7A59CA3 for ; Wed, 9 Mar 2016 21:57:37 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id B4D0721C00E; Wed, 9 Mar 2016 21:57:35 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 3885E21C00A for ; Wed, 9 Mar 2016 21:57:35 +0000 (UTC) Received: from x51r2.ad.gaikai.biz (unknown [100.42.98.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: zmedico) by smtp.gentoo.org (Postfix) with ESMTPSA id D11B4340CD8; Wed, 9 Mar 2016 21:57:33 +0000 (UTC) From: Zac Medico To: gentoo-portage-dev@lists.gentoo.org Cc: Zac Medico Subject: [gentoo-portage-dev] [PATCH] dblink.treewalk: lock for parallel-install with blockers (bug 576888) Date: Wed, 9 Mar 2016 13:57:23 -0800 Message-Id: <1457560643-21014-1-git-send-email-zmedico@gentoo.org> X-Mailer: git-send-email 2.4.10 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@lists.gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org X-Archives-Salt: e2bd0be3-667e-498f-8195-31fad70df749 X-Archives-Hash: 442aa64e558ed17d25ab6078704fc5cf For parallel-install, lock when interacting with blocked packages, in order to account for blocked packages being removed or replaced concurrently. X-Gentoo-Bug: 576888 X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=576888 --- pym/portage/dbapi/vartree.py | 45 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index e7effca..6d4514c 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -3932,9 +3932,25 @@ class dblink(object): blockers = self._blockers if blockers is None: blockers = [] - collisions, dirs_ro, symlink_collisions, plib_collisions = \ - self._collision_protect(srcroot, destroot, - others_in_slot + blockers, filelist, linklist) + + # For parallel-install, acquire a lock to interact + # with blocked packages. + with_lock = bool(blockers) and "parallel-install" in self.settings.features + + if with_lock: + self.lockdb() + self.vartree.dbapi._fs_lock() + # Filter out any blocked packages that may have + # been uninstalled concurrently. + blockers = [blocker for blocker in blockers if blocker.exists()] + try: + collisions, dirs_ro, symlink_collisions, plib_collisions = \ + self._collision_protect(srcroot, destroot, + others_in_slot + blockers, filelist, linklist) + finally: + if with_lock: + self.vartree.dbapi._fs_unlock() + self.unlockdb() # Check for read-only filesystems. ro_checker = get_ro_checker() @@ -4290,13 +4306,22 @@ class dblink(object): self._clear_contents_cache() contents = self.getcontents() destroot_len = len(destroot) - 1 - self.lockdb() - try: - for blocker in blockers: - self.vartree.dbapi.removeFromContents(blocker, iter(contents), - relative_paths=False) - finally: - self.unlockdb() + + if blockers: + self.lockdb() + self.vartree.dbapi._fs_lock() + try: + for blocker in blockers: + # Blocked packages may have been removed + # or replaced concurrently, so check if + # they still exist, and clear contents cache. + if blocker.exists(): + blocker._clear_contents_cache() + self.vartree.dbapi.removeFromContents(blocker, + iter(contents), relative_paths=False) + finally: + self.vartree.dbapi._fs_unlock() + self.unlockdb() plib_registry = self.vartree.dbapi._plib_registry if plib_registry: -- 2.4.10