Browse code

PackageBuilder: use doneList as sign of available RPMS

It fixes racing condition during stage 2 (toolchain build), when
one build is trying to use RPMS from another build which are not
yet fully written.

Change-Id: Iaa654f640d3413d9c471b68e6203a630a323b764
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6643
Tested-by: michellew <michellew@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

Alexey Makhalov authored on 2019/02/05 06:22:00
Showing 2 changed files
... ...
@@ -51,7 +51,7 @@ class PackageBuilder(object):
51 51
             if self.sandbox.hasToolchain():
52 52
                 tUtils.installExtraToolchainRPMS(self.sandbox, self.package, self.version)
53 53
             else:
54
-                tUtils.installToolchainRPMS(self.sandbox, self.package, self.version)
54
+                tUtils.installToolchainRPMS(self.sandbox, self.package, self.version, availablePackages=self.doneList)
55 55
 
56 56
             listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs = (
57 57
                 self._findDependentPackagesAndInstalledRPM(self.sandbox))
... ...
@@ -52,10 +52,12 @@ class ToolChainUtils(object):
52 52
         try:
53 53
             pkgUtils = PackageUtils(self.logName, self.logPath)
54 54
             coreToolChainYetToBuild = []
55
+            doneList = []
55 56
             for package in constants.listCoreToolChainPackages:
56 57
                 version = SPECS.getData().getHighestVersion(package)
57 58
                 rpmPkg = pkgUtils.findRPMFile(package, version)
58 59
                 if rpmPkg is not None:
60
+                    doneList.append(package+'-'+version)
59 61
                     continue
60 62
                 else:
61 63
                     coreToolChainYetToBuild.append(package)
... ...
@@ -73,11 +75,12 @@ class ToolChainUtils(object):
73 73
                     CommandUtils.runCommandInShell("mkdir -p " + destLogPath)
74 74
                 chroot = Chroot(self.logger)
75 75
                 chroot.create(package + "-" + version)
76
-                self.installToolchainRPMS(chroot, package, version)
76
+                self.installToolchainRPMS(chroot, package, version, availablePackages=doneList)
77 77
                 pkgUtils.adjustGCCSpecs(chroot, package, version)
78 78
                 pkgUtils.buildRPMSForGivenPackage(chroot, package, version, destLogPath)
79 79
                 pkgCount += 1
80 80
                 chroot.destroy()
81
+                doneList.append(package+'-'+version)
81 82
             self.logger.debug("Successfully built toolchain")
82 83
             self.logger.info("-" * 45 + "\n")
83 84
         except Exception as e:
... ...
@@ -113,8 +116,13 @@ class ToolChainUtils(object):
113 113
             if not version:
114 114
                 version = SPECS.getData().getHighestVersion(package)
115 115
 
116
-            basePkg = SPECS.getData().getSpecName(package)+"-"+version
117
-            isAvailable = (availablePackages and basePkg in availablePackages)
116
+            if availablePackages is not None:
117
+                basePkg = SPECS.getData().getSpecName(package)+"-"+version
118
+                isAvailable = basePkg in availablePackages
119
+            else:
120
+                # if availablePackages is not provided (rear case) it is safe
121
+                # to use findRPMFile()
122
+                isAvailable = True
118 123
 
119 124
             if constants.rpmCheck:
120 125
                 rpmFile = pkgUtils.findRPMFile(package, version)
... ...
@@ -130,7 +138,7 @@ class ToolChainUtils(object):
130 130
                     constants.listToolChainRPMsToInstall.index(packageName) <
131 131
                         constants.listToolChainRPMsToInstall.index(package)):
132 132
                     isAvailable = False
133
-                else:
133
+                if isAvailable:
134 134
                     rpmFile = pkgUtils.findRPMFile(package, version)
135 135
 
136 136
             if rpmFile is None: