Browse code

Using locks in with statement and remove extra threads.

Change-Id: Ibef4f51ccd600eee0a7de24a006056d1cb20d809
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/4659
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>

xiaolin-vmware authored on 2018/01/18 10:17:46
Showing 3 changed files
... ...
@@ -12,7 +12,7 @@ import docker
12 12
 class PackageBuilderBase(object):
13 13
     def __init__(self, mapPackageToCycles, listAvailableCyclicPackages,
14 14
                  listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType):
15
-        # will be initialized in buildPackageThreadAPI()
15
+        # will be initialized in buildPackageFunction()
16 16
         self.logName = None
17 17
         self.logPath = None
18 18
         self.logger = None
... ...
@@ -26,7 +26,7 @@ class PackageBuilderBase(object):
26 26
         self.pkgBuildOptionFile = pkgBuildOptionFile
27 27
         self.pkgBuildType = pkgBuildType
28 28
 
29
-    def buildPackageThreadAPIPrepare(self, package, outputMap, threadName):
29
+    def buildPackagePrepareFunction(self, package, outputMap, threadName):
30 30
         self.package = package
31 31
         self.logName = "build-" + package
32 32
         self.logPath = constants.logPath + "/build-" + package
... ...
@@ -130,8 +130,8 @@ class PackageBuilderContainer(object):
130 130
         self.base = PackageBuilderBase(mapPackageToCycles, listAvailableCyclicPackages,
131 131
                                        listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType)
132 132
 
133
-    def buildPackageThreadAPI(self, package, outputMap, threadName):
134
-        self.base.buildPackageThreadAPIPrepare(package, outputMap, threadName)
133
+    def buildPackageFunction(self, package, outputMap, threadName):
134
+        self.base.buildPackagePrepareFunction(package, outputMap, threadName)
135 135
         try:
136 136
             self.buildPackage()
137 137
             outputMap[threadName] = True
... ...
@@ -298,8 +298,8 @@ class PackageBuilderChroot(object):
298 298
         self.base = PackageBuilderBase(mapPackageToCycles, listAvailableCyclicPackages,
299 299
                                        listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType)
300 300
 
301
-    def buildPackageThreadAPI(self, package, outputMap, threadName):
302
-        self.base.buildPackageThreadAPIPrepare(package, outputMap, threadName)
301
+    def buildPackageFunction(self, package, outputMap, threadName):
302
+        self.base.buildPackagePrepareFunction(package, outputMap, threadName)
303 303
         try:
304 304
             self.buildPackage()
305 305
             outputMap[threadName] = True
... ...
@@ -184,52 +184,45 @@ class Scheduler(object):
184 184
     @staticmethod
185 185
     def getNextPackageToBuild():
186 186
         Scheduler.logger.info("Waiting to acquire scheduler lock")
187
-        Scheduler.lock.acquire()
187
+        with Scheduler.lock:
188 188
 
189
-        if Scheduler.stopScheduling:
190
-            Scheduler.logger.info("Released scheduler lock")
191
-            Scheduler.lock.release()
192
-            return None
193
-
194
-        if len(Scheduler.listOfPackagesToBuild) == 0:
195
-            if Scheduler.event is not None:
196
-                Scheduler.event.set()
197
-
198
-        try:
199
-            if Scheduler.listOfPackagesNextToBuild.qsize() == 0:
200
-                listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
201
-                Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
202
-        except:
203
-            if len(Scheduler.listOfPackagesNextToBuild) == 0:
204
-                listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
205
-                Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
189
+            if Scheduler.stopScheduling:
190
+                Scheduler.logger.info("Released scheduler lock")
191
+                return None
206 192
 
207
-        if Scheduler.listOfPackagesNextToBuild.qsize() == 0:
208
-            Scheduler.logger.info("Released scheduler lock")
209
-            Scheduler.lock.release()
210
-            return None
193
+            if len(Scheduler.listOfPackagesToBuild) == 0:
194
+                if Scheduler.event is not None:
195
+                    Scheduler.event.set()
211 196
 
212
-        packageTup = Scheduler.listOfPackagesNextToBuild.get()
197
+            try:
198
+                if Scheduler.listOfPackagesNextToBuild.qsize() == 0:
199
+                    listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
200
+                    Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
201
+            except:
202
+                if len(Scheduler.listOfPackagesNextToBuild) == 0:
203
+                    listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
204
+                    Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
213 205
 
214
-        if packageTup[0] == 0 and Scheduler.isPriorityScheduler == 1:
215
-            listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
216
-            Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
217 206
             if Scheduler.listOfPackagesNextToBuild.qsize() == 0:
218
-                Scheduler.logger.info("Released scheduler lock")
219
-                Scheduler.lock.release()
220 207
                 return None
208
+
221 209
             packageTup = Scheduler.listOfPackagesNextToBuild.get()
222 210
 
223
-        package = packageTup[1]
224
-        Scheduler.logger.info("PackagesNextToBuild " + str(packageTup))
225
-        if Scheduler.listOfPackagesNextToBuild.qsize() > 0:
226
-            ThreadPool.ThreadPool.activateWorkerThreads(
227
-                Scheduler.listOfPackagesNextToBuild.qsize())
228
-        Scheduler.logger.info("Released scheduler lock")
229
-        Scheduler.lock.release()
230
-        Scheduler.listOfPackagesCurrentlyBuilding.append(package)
231
-        Scheduler.listOfPackagesToBuild.remove(package)
232
-        return package
211
+            if packageTup[0] == 0 and Scheduler.isPriorityScheduler == 1:
212
+                listOfPackagesNextToBuild = Scheduler.__getListNextPackagesReadyToBuild()
213
+                Scheduler.listOfPackagesNextToBuild = listOfPackagesNextToBuild
214
+                if Scheduler.listOfPackagesNextToBuild.qsize() == 0:
215
+                    return None
216
+                packageTup = Scheduler.listOfPackagesNextToBuild.get()
217
+
218
+            package = packageTup[1]
219
+            Scheduler.logger.info("PackagesNextToBuild " + str(packageTup))
220
+            if Scheduler.listOfPackagesNextToBuild.qsize() > 0:
221
+                ThreadPool.ThreadPool.activateWorkerThreads(
222
+                    Scheduler.listOfPackagesNextToBuild.qsize())
223
+            Scheduler.listOfPackagesCurrentlyBuilding.append(package)
224
+            Scheduler.listOfPackagesToBuild.remove(package)
225
+            return package
233 226
 
234 227
     #can be synchronized TODO
235 228
     @staticmethod
... ...
@@ -40,10 +40,7 @@ class WorkerThread(threading.Thread):
40 40
                                                      self.listBuildOptionPackages,
41 41
                                                      self.pkgBuildOptionFile,
42 42
                                                      self.pkgBuildType)
43
-            t = threading.Thread(target=pkgBuilder.buildPackageThreadAPI,
44
-                                 args=(pkg, outputMap, pkg))
45
-            t.start()
46
-            t.join()
43
+            pkgBuilder.buildPackageFunction(pkg, outputMap, pkg)
47 44
             if pkg not in outputMap or outputMap[pkg] == False:
48 45
                 buildThreadFailed = True
49 46
                 Scheduler.Scheduler.notifyPackageBuildFailed(pkg)