From 0344730a1623285bcb414455f08aa2bc3f1bded4 Mon Sep 17 00:00:00 2001 From: donghee yang Date: Thu, 23 Aug 2012 12:15:22 +0900 Subject: [PATCH] [Title] Fixed a bug that updating "latest_job" is wrong in multi-threading --- src/build_server/BuildServer.rb | 4 +++ src/build_server/JobManager.rb | 52 ++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/build_server/BuildServer.rb b/src/build_server/BuildServer.rb index f027a8a..05523b7 100644 --- a/src/build_server/BuildServer.rb +++ b/src/build_server/BuildServer.rb @@ -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] diff --git a/src/build_server/JobManager.rb b/src/build_server/JobManager.rb index 529d16e..d2b55df 100644 --- a/src/build_server/JobManager.rb +++ b/src/build_server/JobManager.rb @@ -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 -- 2.34.1