[Title] Fixed a bug that updating "latest_job" is wrong in multi-threading
authordonghee yang <donghee.yang@samsung.com>
Thu, 23 Aug 2012 03:15:22 +0000 (12:15 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Thu, 23 Aug 2012 03:15:22 +0000 (12:15 +0900)
src/build_server/BuildServer.rb
src/build_server/JobManager.rb

index f027a8ad50dd7c5ab7250adfdf8af7e11b457c22..05523b7aeb575a873ea0f4adf66f29c0b845c1fe 100644 (file)
@@ -130,6 +130,10 @@ class BuildServer
                # init project mgr
                @log.info "Setting Project Manager..."
                @prjmgr.load()
+
+               # init job mgr
+               @log.info "Intializing Job Manager..."
+               @jobmgr.init()
        
                pkgsvr_id = @id
                pkgsvr_dist = @pkgserver_url.split("/")[-1]
index 529d16eccbbbdb312391cdf1d9e254cfee346c57..d2b55dfdaf9cbdac46cfb50ca05d963963d7c7eb 100644 (file)
@@ -36,6 +36,7 @@ require "LocalBuildJob.rb"
 require "RegisterPackageJob.rb"
 require "packageServer.rb"
 
+
 class JobManager
        attr_accessor :max_working_jobs, :jobs, :internal_jobs, :reverse_build_jobs
        attr_accessor :internal_job_schedule
@@ -49,28 +50,45 @@ class JobManager
                @max_working_jobs=2
                @new_job_index = 0
                @internal_job_schedule = Mutex.new
+               @latest_job_touch = Mutex.new
+       end
+
+
+       # initialize
+       def init()
+               # load latest job idx if exist
+               file_path = "#{BuildServer::CONFIG_ROOT}/#{@parent.id}/latest_job"
+               if File.exist? file_path then
+                       latest_idx = -1
+                       File.open( file_path, "r" ) { |f|
+                               f.each_line { |l|
+                                       latest_idx = l.strip.to_i
+                                       break
+                               }
+                       }
+                       if latest_idx < 0 then latest_idx = -1 end
+                       @new_job_index = latest_idx + 1
+               else
+                       @new_job_index = 0
+               end
        end
 
 
        # get new id
        def get_new_job_id
-               # check file
-               server_dir = "#{BuildServer::CONFIG_ROOT}/#{@parent.id}"
-               if File.exist? "#{server_dir}/latest_job" then
-                       f = File.open( "#{server_dir}/latest_job", "r" )
-                       @new_job_index = f.gets.strip.to_i + 1
-                       f.close 
-               end     
-
-               # get new id
-               new_id = @new_job_index
-
-               # save it
-               f = File.open( "#{server_dir}/latest_job", "w" )
-               f.puts "#{new_id}"
-               f.close
-
-               return new_id
+               new_idx = 0
+               @latest_job_touch.synchronize {
+                       new_idx = @new_job_index
+
+                       file_path = "#{BuildServer::CONFIG_ROOT}/#{@parent.id}/latest_job"
+                       File.open( file_path, "w" ) { |f|
+                               f.puts "#{@new_job_index}"
+                       }
+
+                       @new_job_index += 1
+               }
+
+               return new_idx
        end