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/6665
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Bo Gan <ganb@vmware.com>
| ... | ... |
@@ -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: |