[Title] Changed DB access method for remote-build/pkg servers
authordonghee yang <donghee.yang@samsung.com>
Wed, 24 Oct 2012 06:51:10 +0000 (15:51 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Wed, 24 Oct 2012 06:51:10 +0000 (15:51 +0900)
12 files changed:
src/build_server/BuildServer.rb
src/build_server/BuildServerController.rb
src/build_server/DistributionManager.rb
src/build_server/PackageSync.rb
src/build_server/SocketJobRequestListener.rb
src/common/ScheduledActionHandler.rb
test/build-server.basic2/build-svr-02.testcase
test/build-server.multi-svr2/01.testcase [new file with mode: 0644]
test/build-server.multi-svr2/buildsvr.init [new file with mode: 0755]
test/build-server.multi-svr2/pkgsvr1.init [new file with mode: 0755]
test/build-server.multi-svr2/pkgsvr2.init [new file with mode: 0755]
test/build-server.multi-svr2/testsuite [new file with mode: 0644]

index 7d0ee19987b21f7f270c2d04219a8a25ebdd98eb..a230ca62f874d8ffd4b613a5395b8a0e1a82f639 100644 (file)
@@ -40,7 +40,8 @@ require "ProjectManager.rb"
 require "DistributionManager.rb"
 
 class BuildServer
-       attr_accessor :id, :path, :port, :status, :friend_servers, :host_os, :log
+       attr_accessor :id, :path, :port, :status, :host_os, :log
+       attr_accessor :remote_servers
        attr_accessor :git_server_url, :git_bin_path
        attr_accessor :job_log_url
        attr_accessor :allowed_git_branch
@@ -59,11 +60,10 @@ class BuildServer
        attr_accessor :prjmgr, :distmgr
        attr_accessor :transport_path
        attr_accessor :cancel_lock
-       attr_accessor :supported_os_list
        attr_accessor :upgrade
-       attr_accessor :remote_pkg_servers
        attr_accessor :pkg_sync_period
        attr_accessor :changelog_check
+       attr_accessor :db
        attr_accessor :db_dsn, :db_user, :db_passwd
        CONFIG_ROOT = "#{Utils::HOME}/.build_tools/build_server"
        HOST_OS = Utils::HOST_OS
@@ -72,8 +72,7 @@ class BuildServer
        def initialize (id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
                @id = id
                @path = path
-               @friend_servers = []
-               @remote_pkg_servers = []
+               @remote_servers = []
                @req_listener = []
                @finish = false
                # port number
@@ -106,13 +105,13 @@ class BuildServer
                #
                @transport_path = "#{@path}/transport"
                @cancel_lock = Mutex.new
-               @supported_os_list = []
 
                @pkg_sync_period=600
                @upgrade = false
                @changelog_check = false
 
                #DB settring
+               @db = nil
                @db_dsn = "SQLite3:#{BuildServer::CONFIG_ROOT}/#{@id}/server.db"
                @db_user = nil
                @db_passwd = nil
@@ -150,11 +149,9 @@ class BuildServer
                @cleaner.start
 
                # set package server synchrontizer
-               if not @remote_pkg_servers.empty? then
-                       @log.info "Setting Package Server Synchronizer..."
-                       @pkg_sync =  PackageServerSynchronizer.new(self)
-                       @pkg_sync.start
-               end
+               @log.info "Setting Package Server Synchronizer..."
+               @pkg_sync =  PackageServerSynchronizer.new(self)
+               @pkg_sync.start
 
                # main loop
                @log.info "Entering main loop..."
@@ -163,7 +160,8 @@ class BuildServer
                        while( not @finish )
 
                                # update friend server status
-                               @friend_servers.each do |server|
+                               @remote_servers = get_remote_servers()
+                               @remote_servers.each do |server|
                                        # update state
                                        server.update_state
                                end
@@ -216,19 +214,50 @@ class BuildServer
        end
 
 
+       def get_remote_servers()
+               result = []
+               begin
+                       db = get_db_connection()
+                       rows = db.select_all("SELECT * FROM remote_build_servers")
+                       rows.each do |row|
+                               svr_ip,svr_port=row['svr_addr'].strip.split(":")
+                               result.push RemoteBuildServer.new( svr_ip, svr_port, self )
+                       end
+
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return []
+               end
+
+               return result
+       end
+
+
        # add new remote friend server
        def add_remote_server( ip, port )
 
-               # if already exit, return false
-               @friend_servers.each do |svr|
-                       if svr.ip.eql? ip and svr.port == port then
-                               return false
+               saddr="#{ip}:#{port}"
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{saddr}'")
+                               if not row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               dbh.do "INSERT INTO remote_build_servers (svr_addr) VALUES ('#{saddr}')"
                        end
-               end
+                       db['AutoCommit'] = true
 
-               # create new one, and add it into list
-               new_server = RemoteBuildServer.new( ip, port, self )
-               @friend_servers.push new_server
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return false
+               end
 
                return true
        end
@@ -236,29 +265,73 @@ class BuildServer
 
        # remove remote friend server
        def remove_remote_server( ip, port )
-               @friend_servers.each do |svr|
-                       if svr.ip.eql? ip and svr.port == port then
-                               @friend_servers.delete svr
-                               return true
+               saddr="#{ip}:#{port}"
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
+                               if row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               dbh.do("DELETE FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
                        end
+                       db['AutoCommit'] = true
+
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+
+                       return false
                end
 
-               # if not exist, return false
-               return false
+               return true
+       end
+
+
+       def get_sync_package_servers()
+               result = []
+               begin
+                       db = get_db_connection()
+                       rows = db.select_all("SELECT * FROM sync_pkg_servers")
+                       rows.each do |row|
+                               result.push [row['pkgsvr_url'], row['dist_name']]
+                       end
+
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return []
+               end
+
+               return result
        end
 
 
        # add new remote pkg server
        def add_sync_package_server( url, dist )
-
-               # if already exit, return false
-               @remote_pkg_servers.each do |e|
-                       if e[0] == url and e[1] == dist  then
-                               return false
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+                               if not row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,dist_name) VALUES('#{url}','#{@pkg_sync_period}','#{dist}')"
                        end
-               end
+                       db['AutoCommit'] = true
 
-               @remote_pkg_servers.push [url, dist]
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return false
+               end
 
                return true
        end
@@ -266,48 +339,106 @@ class BuildServer
 
        # remove remote pkg server
        def remove_sync_package_server( url, dist )
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+                               if row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               dbh.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+                       end
+                       db['AutoCommit'] = true
 
-               # if already exit, return false
-               @remote_pkg_servers.each do |e|
-                       if e[0] == url and e[1] == dist  then
-                               @remote_pkg_servers.delete e
-                               return true
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+
+                       return false
+               end
+
+               return true
+       end
+
+
+       def supported_os_list
+               result = []
+               begin
+                       db = get_db_connection()
+                       rows = db.select_all("SELECT * FROM supported_os")
+                       rows.each do |row|
+                               result.push row['name']
                        end
+
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return []
                end
 
-               return false
+               return result
        end
 
 
        # add new target OS.
        # If already exist, return false , otherwise true
-       def add_target_os( os_name )
-
-               # if already exit, return false
-               @supported_os_list.each do |os|
-                       if os.eql? os_name then
-                               return false
+       def add_supported_os( os_name )
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'")
+                               if not row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               dbh.do "INSERT OR REPLACE INTO supported_os VALUES ('#{os_name}')"
                        end
-               end
+                       db['AutoCommit'] = true
 
-               # add it into list
-               @supported_os_list.push os_name
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+                       return false
+               end
 
                return true
+               
        end
 
 
        # remove target OS.
-       def remove_target_os( os_name )
-               @supported_os_list.each do |os|
-                       if os.eql? os_name then
-                               @supported_os_list.delete os
-                               return true
+       def remove_supported_os( os_name )
+               begin
+                       db = get_db_connection()
+                       db['AutoCommit'] = false
+                       db.transaction do |dbh|
+                               row = dbh.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'")
+                               if row.nil? then
+                                       db['AutoCommit'] = true
+                                       return false
+                               end
+                               dbh.do("DELETE FROM supported_os WHERE name='#{os_name}'")
                        end
+                       db['AutoCommit'] = true
+
+               rescue DBI::DatabaseError => e
+                       @log.error "DB failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
+
+                       return false
                end
 
-               return false
+               return true
        end
+
+
        # get remote server
        def get_available_server ( job )
                candidates = []
@@ -323,7 +454,7 @@ class BuildServer
                # get availables server
                # but, job must not be "REGISTER" and "MULTIBUILD" job
                if job.type != "REGISTER" and job.type != "MULTIBUILD" then
-                       @friend_servers.each do |server|
+                       @remote_servers.each do |server|
                                if ( server.status == "RUNNING" and server.can_build?( job ) and
                                        not server.has_waiting_jobs and
                                        server.get_file_transfer_cnt() == 0 and
@@ -365,7 +496,7 @@ class BuildServer
                if can_build? job then return true end
 
                #if not found, check friends
-               @friend_servers.each do |server|
+               @remote_servers.each do |server|
                        if server.status == "RUNNING" and
                                job.can_be_built_on? server.host_os then
                                return true
@@ -428,6 +559,7 @@ class BuildServer
                rescue DBI::DatabaseError => e
                        puts "DB Creation failed!"
                        puts e.errstr
+                       @log.error e.backtrace.inspect
                        result = false
                ensure
                        db.disconnect if db
@@ -436,90 +568,23 @@ class BuildServer
        end
 
 
-       # save
-       def save_db()
-
-               result = true
-
-               begin
-                       # open DB
-                       db = DBI.connect("DBI:#{@db_dsn}", @db_user ,@db_passwd)
-
-                       # remote_build_servers
-                       db.do "DELETE FROM remote_build_servers"
-                       @friend_servers.each do  |svr|
-                               db.do "INSERT INTO remote_build_servers (svr_addr) VALUES('#{svr.ip}:#{svr.port}')"
-                       end
-
-                       # sync_pkg_servers
-                       db.do "DELETE FROM sync_pkg_servers"
-                       @remote_pkg_servers.each do  |svr|
-                               db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,dist_name) VALUES('#{svr[0]}','#{@pkg_sync_period}','#{svr[1]}')"
-                       end
-
-                       # supported_os
-                       db.do "DELETE FROM supported_os"
-                       @supported_os_list.each do  |os|
-                               db.do "INSERT INTO supported_os VALUES('#{os}')"
-                       end
-
-               rescue DBI::DatabaseError => e
-                       puts "DB update failed!"
-                       puts e.errstr
-                       result = false
-               ensure
-                       db.disconnect if db
-               end
-
-               return result
-       end
-
-
-       # load
-       def load_db()
-
-               result = true
+       def get_db_connection()
+               if not @db.nil? and @db.connected? then return @db end
 
                begin
-                       # open DB
                        db = DBI.connect("DBI:#{@db_dsn}", @db_user, @db_passwd)
-                       #db.results_as_hash = true
-
-                       # remote_build_servers
-                       @friend_servers = []
-                       sth = db.execute "SELECT * FROM remote_build_servers"
-                       sth.fetch_hash do  |row|
-                               add_remote_server(
-                                       row['svr_addr'].split(":")[0],
-                                       row['svr_addr'].split(":")[1].to_i)
-                       end
-                       sth.finish
-                       # sync_package_servers
-                       @remote_pkg_servers = []
-                       sth = db.execute "SELECT * FROM sync_pkg_servers"
-                       sth.fetch_hash do  |row|
-                               add_sync_package_server( row['pkgsvr_url'], row['dist_name'] )
-                               @pkg_sync_period = row['period'].to_i
-                       end
-                       sth.finish
 
-                       # supported_os
-                       @supported_os_list = []
-                       sth = db.execute "SELECT * FROM supported_os"
-                       sth.fetch_hash do  |row|
-                               add_target_os( row['name'] )
-                       end
-                       sth.finish
                rescue DBI::DatabaseError => e
-                       puts "DB loading failed!"
-                       puts e.errstr
-                       result = false
-               ensure
-                       sth.finish if not sth.finished?
+                       @log.error "DB loading failed!"
+                       @log.error e.errstr
+                       @log.error e.backtrace.inspect
                        db.disconnect if db
+
+                       return nil
                end
-               return result
-       end
 
+               return db
+       end
+       
 end
 
index 6fd6e70ea5db23a746ae3091d976805cffb2bca7..c3c7675106c33c3908d702a58d1c04f178e694fb 100644 (file)
@@ -259,13 +259,8 @@ class BuildServerController
 
                # add
                if server.add_remote_server( ip, port ) then
-                       if server.save_db() then
-                               puts "Friend server is added successfully!"
-                               return true
-                       else
-                               puts "Add friend server to DB is failed!"
-                               return false
-                       end
+                       puts "Friend server is added successfully!"
+                       return true
                else
                        puts "Friend server already exists in list!"
                        return false
@@ -279,13 +274,8 @@ class BuildServerController
 
                # add
                if server.remove_remote_server( ip, port ) then
-                       if server.save_db() then
-                               puts "Friend server is removed successfully!"
-                               return true
-                       else
-                               puts "Remove friend server from DB is failed!"
-                               return false
-                       end
+                       puts "Friend server is removed successfully!"
+                       return true
                else
                        puts "Friend server does not exist in list!"
                        return false
@@ -295,24 +285,13 @@ class BuildServerController
 
        # add supported target os
        def self.add_target_os( id, os_name )
-               # TODO:check os foramt
-               if os_name == "default" then
-                       puts "Cannot use \"default\" as target OS name!"
-                       return false
-               end
-
                # get server
                server = get_server(id)
 
                # add
-               if server.add_target_os( os_name ) then
-                       if server.save_db() then
-                               puts "Target OS is added successfully!"
-                               return true
-                       else
-                               puts "Add target OS to DB is failed!"
-                               return false
-                       end
+               if server.add_supported_os( os_name ) then
+                       puts "Target OS is added successfully!"
+                       return true
                else
                        puts "Target OS already exists in list!"
                        return false
@@ -326,18 +305,15 @@ class BuildServerController
                server = get_server(id)
 
                # add
-               if server.remove_target_os( os_name ) then
-                       if server.save_db() then
-                               puts "Target OS is removed successfully!"
-                               return true
-                       else
-                               puts "Remove target OS from DB failed!"
-                               return false
-                       end
+               if server.remove_supported_os( os_name ) then
+                       puts "Target OS is removed successfully!"
+                       return true
                else
                        puts "Target OS does not exist in list!"
                        return false
                end
+
+               server.quit
        end
 
 
@@ -415,13 +391,8 @@ class BuildServerController
 
                # add
                if server.add_sync_package_server( url, dist_name ) then
-                       if server.save_db() then
-                               puts "Remote package server is added!"
-                               return true
-                       else
-                               puts "Remove package server from DB is failed!"
-                               return false
-                       end
+                       puts "Remote package server is added!"
+                       return true
                else
                        puts "The server already exists in list!"
                        return false
@@ -451,13 +422,8 @@ class BuildServerController
 
                # remove
                if server.remove_sync_package_server( url, dist_name ) then
-                       if server.save_db() then
-                               puts "Remote package server is removed!"
-                               return true
-                       else
-                               puts "Remove remote package server from DB is failed!"
-                               return false
-                       end
+                       puts "Remote package server is removed!"
+                       return true
                else
                        puts "The server does not exist in list!"
                        return false
@@ -674,7 +640,7 @@ class BuildServerController
                server.prjmgr.load()
 
                puts "* REMOTE SERVER(S) *"
-               server.friend_servers.each do  |s|
+               server.get_remote_servers.each do  |s|
                        puts " * #{s.ip}:#{s.port}"
                end
                puts ""
@@ -692,7 +658,7 @@ class BuildServerController
                puts ""
 
                puts "* SYNC PACKAGE SERVER(S) *"
-               server.remote_pkg_servers.each do  |s|
+               server.get_sync_package_servers.each do  |s|
                        puts " * [#{s[1]}] #{s[0]}"
                end
                puts ""
@@ -864,7 +830,6 @@ class BuildServerController
                if not server.db_exist? then
                        server.create_db()
                end
-               server.save_db()
        end
 
 
@@ -975,9 +940,6 @@ class BuildServerController
                # set password
                obj.keep_time = keep_time
 
-               # load from DB
-               obj.load_db()
-
                # change log setting
                obj.changelog_check = changelog_check
 
index b364f455498c3b7ccfd16009b69e8fa676b4d49c..7ccccc1e3dc540ebe0823f641528c675621c6a49 100644 (file)
@@ -143,6 +143,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB loading failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                ensure
                        db.disconnect if db
                end
@@ -175,6 +176,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB update failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                        return false
 
                ensure
@@ -202,6 +204,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB update failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                        return false
 
                ensure
@@ -228,6 +231,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB loading failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                ensure
                        db.disconnect if db
                end
@@ -250,6 +254,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB loading failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                ensure
                        db.disconnect if db
                end
@@ -274,6 +279,7 @@ class DistributionManager
                rescue DBI::DatabaseError => e
                        @server.log.error "DB update failed!"
                        @server.log.error e.errstr
+                       @server.log.error e.backtrace.inspect
                        return false
 
                ensure
index 7655ccc83411e604c2843c41055779cdee21490a..a0c29b2a5ec578b5646491336a29cc92270eca02 100644 (file)
@@ -36,6 +36,7 @@ require "ScheduledActionHandler.rb"
 
 
 class PackageSyncAction < Action
+       attr_accessor :pkgsvr_url, :dist_name
        @@new_id = 0
 
        def initialize( time, url, dist_name, server )
@@ -147,11 +148,10 @@ class PackageSyncAction < Action
                        p.os_list.each do  |os|
                                # get pkg version in server
                                main_ver = @main_client.get_attr_from_pkg(pkg_name, os, "version")
-                               if main_ver.nil? then next end
                                remote_ver = @pkgsvr_client.get_attr_from_pkg(pkg_name, os, "version")
                                if remote_ver.nil? then next end
 
-                               if Version.new(main_ver) < Version.new(remote_ver) then
+                               if main_ver.nil? or Version.new(main_ver) < Version.new(remote_ver) then
                                        pkgs.push [pkg_name, os]
                                end
                        end
@@ -176,14 +176,57 @@ class PackageServerSynchronizer
        # start thread
        def start()
 
-               time = Time.new + 60
-               @server.remote_pkg_servers.each do  |entry|
-                       url=entry[0]; dist_name=entry[1]
-                       @handler.register( PackageSyncAction.new(time, url, dist_name, @server) )
-                       @server.log.info "Registered package-sync action!: #{dist_name} <= \"#{url}\""
+               # start thread for handling action
+               @handler.start
+
+               Thread.new do
+                       monitor()
                end
+       end
 
-               # start handler
-               @handler.start
+
+       private
+       def monitor()
+               while(true)
+                       # wait 10 seconds
+                       sleep 10
+
+                       # get info from DB
+                       syncs = @server.get_sync_package_servers()
+
+                       # check removal
+                       @handler.get_actions().each do |act|
+                               exist = false
+                               syncs.each do |sync|
+                                       url=sync[0]; dist_name=sync[1]
+                                       if url == act.pkgsvr_url and dist_name == act.dist_name then 
+                                               exist = true 
+                                               break
+                                       end
+                               end
+                               if not exist then
+                                       @handler.unregister(act)
+                                       @server.log.info "Unregistered package-sync action!: #{act.dist_name} <= \"#{act.pkgsvr_url}\""
+                               end
+                       end
+                       
+                       # check add/modify
+                       syncs.each do  |sync|
+                               url=sync[0]; dist_name=sync[1]
+                               exist = false
+                               @handler.get_actions().each do |act|
+                                       if act.pkgsvr_url == url and act.dist_name == dist_name then
+                                               exist = true
+                                       end     
+                               end
+                               
+                               if not exist then
+                                       new_time = Time.new + 10
+                                       @handler.register( PackageSyncAction.new(new_time, url, dist_name, @server) )
+                                       @server.log.info "Registered package-sync action!: #{dist_name} <= \"#{url}\""
+                               end
+                       end
+
+               end
        end
 end
index 9de8ed088054efb90aa8b4a344ebdcd20fa432e5..bb9b7471b93acfd2794c85ef27e6cc6457fe79e4 100644 (file)
@@ -503,7 +503,7 @@ class SocketJobRequestListener
                when "FRIEND"
                        BuildCommServer.send_begin(req)
                        # print GIT projects
-                       @parent_server.friend_servers.each do |server|
+                       @parent_server.remote_servers.each do |server|
                                BuildCommServer.send(req,"#{server.status},#{server.host_os},#{server.waiting_jobs.length},#{server.working_jobs.length},#{server.max_working_jobs},#{server.get_file_transfer_cnt}")
                        end
                        BuildCommServer.send_end(req)
index ec6b2bf873973af928aff067ac81824f3bfa1397..edbd691303c322b43cd7a58588a659d8a47c9c6f 100644 (file)
@@ -27,15 +27,17 @@ Contributors:
 =end
 
 $LOAD_PATH.unshift File.dirname(__FILE__)
+require 'thread'
 
 class ScheduledActionHandler
-       attr_accessor :quit
+       attr_accessor :quit, :thread
 
        # init
        def initialize( )
                @thread = nil
                @quit = false
                @actions = []
+               @mutex = Mutex.new
        end
 
 
@@ -44,7 +46,23 @@ class ScheduledActionHandler
                # init action
                action.init
                # add to list
-               @actions.push action
+               @mutex.synchronize do
+                       @actions.push action
+               end
+       end
+
+
+       # unregsister a action
+       def unregister( action )
+               @mutex.synchronize do
+                       @actions.delete(action)
+               end
+       end
+
+
+       # get all actions
+       def get_actions()
+               return @actions
        end
 
 
@@ -82,7 +100,7 @@ class ScheduledActionHandler
                                                        action.time = action.time  + action.period
                                                end
                                        else
-                                               @actions.delete(action)
+                                               unregister(action)
                                        end
                                end
                        end
index 1a9bac94ad87419258d33e81d63a79194227e19b..86f59edb6695c8720eb8e2393fd2baa04bebefd1 100644 (file)
@@ -19,6 +19,8 @@ add-os        Add supported OS.
 remove-os     Remove supported OS.
 add-dist      Add distribution.
 remove-dist   Remove distribution.
+lock-dist     Lock distribution.
+unlock-dist   Unlock distribution.
 add-sync      Add package repository URL to synchronize with.
 remove-sync   Remove package repository URL.
 add-prj       Add project to build.
@@ -41,6 +43,8 @@ build-svr add-os -n <server name> -o <os>
 build-svr remove-os -n <server name> -o <os>
 build-svr add-dist -n <server name> -D <distribution name> -u <package server url> -d <package server address>
 build-svr remove-dist -n <server name> -D <distribution name>
+build-svr lock-dist -n <server name> -D <distribution name>
+build-svr unlock-dist -n <server name> -D <distribution name>
 build-svr add-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]
 build-svr remove-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]
 build-svr add-prj -n <server name> -N <project name> (-g <git repository> -b <git branch>|-P <package name>) [-w <password>] [-o <os list>] [--dist <distribution>]
diff --git a/test/build-server.multi-svr2/01.testcase b/test/build-server.multi-svr2/01.testcase
new file mode 100644 (file)
index 0000000..f813f07
--- /dev/null
@@ -0,0 +1,12 @@
+#PRE-EXEC
+#EXEC
+../../pkg-svr register -n pkgsvr02 -d unstable -P bin/bin_0.0.1_ubuntu-32.zip
+sleep 25
+../../pkg-cli list-rpkg -P bin -u `pwd`/pkgsvr02/unstable
+#POST-EXEC
+#EXPECT
+Archive:  bin/bin_0.0.1_ubuntu-32.zip
+inflating:
+snapshot is generated :
+package registed successfully
+bin  (0.0.1)
diff --git a/test/build-server.multi-svr2/buildsvr.init b/test/build-server.multi-svr2/buildsvr.init
new file mode 100755 (executable)
index 0000000..d0199b5
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+if [ "x${RUBY}" = "x" ] ;then
+    RUBY="ruby -d"
+fi
+
+rm -rf buildsvr01
+rm -rf git01
+rm -rf bin
+rm -rf ~/.build_tools/build_server/testserver3
+
+../../build-svr remove -n testserver3
+mkdir buildsvr01
+cd buildsvr01
+${RUBY} ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+cd ..
+
+${RUBY} ../../build-svr add-dist -n testserver3 -D unstable -u `pwd`/pkgsvr01/unstable -d 127.0.0.1:3333
+${RUBY} ../../build-svr add-os -n testserver3 -o ubuntu-32
+${RUBY} ../../build-svr add-os -n testserver3 -o windows-32
+${RUBY} ../../build-svr add-prj -n testserver3 -N teste -P bin -D unstable -o ubuntu-32
+${RUBY} ../../build-svr add-sync -n testserver3 -u `pwd`/pkgsvr02/unstable -D unstable
+
+mkdir -p bin
+cp ../bin/*.zip ./bin/
+
+${RUBY} ../../build-svr start -n testserver3 -p 2223 --CHILD
diff --git a/test/build-server.multi-svr2/pkgsvr1.init b/test/build-server.multi-svr2/pkgsvr1.init
new file mode 100755 (executable)
index 0000000..0cc21e3
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+if [ "x${RUBY}" = "x" ] ;then
+    RUBY="ruby -d"
+fi
+rm -rf ~/.build_tools/pkg_server/pkgsvr01
+rm -rf `pwd`/pkgsvr01
+${RUBY} ../../pkg-svr create -n pkgsvr01 -d unstable
+${RUBY} ../../pkg-svr add-os -n pkgsvr01 -d unstable -o ubuntu-32
+${RUBY} ../../pkg-svr add-os -n pkgsvr01 -d unstable -o windows-32
+${RUBY} ../../pkg-svr start -n pkgsvr01 -p 3333
diff --git a/test/build-server.multi-svr2/pkgsvr2.init b/test/build-server.multi-svr2/pkgsvr2.init
new file mode 100755 (executable)
index 0000000..46ec0a7
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+if [ "x${RUBY}" = "x" ] ;then
+    RUBY="ruby -d"
+fi
+rm -rf ~/.build_tools/pkg_server/pkgsvr02
+rm -rf `pwd`/pkgsvr02
+${RUBY} ../../pkg-svr create -n pkgsvr02 -d unstable
+${RUBY} ../../pkg-svr add-os -n pkgsvr02 -d unstable -o ubuntu-32
+${RUBY} ../../pkg-svr add-os -n pkgsvr02 -d unstable -o windows-32
+${RUBY} ../../pkg-svr start -n pkgsvr02 -p 3334
diff --git a/test/build-server.multi-svr2/testsuite b/test/build-server.multi-svr2/testsuite
new file mode 100644 (file)
index 0000000..1bb2eb2
--- /dev/null
@@ -0,0 +1 @@
+01.testcase