[Title] Added distribution lock concept
authordonghee yang <donghee.yang@samsung.com>
Thu, 18 Oct 2012 09:05:39 +0000 (18:05 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Thu, 18 Oct 2012 09:05:39 +0000 (18:05 +0900)
package/changelog
package/pkginfo.manifest
src/build_server/DistributionManager.rb
src/build_server/SocketJobRequestListener.rb

index 8238a43d45f3a5b740b75b5c800f73a6b67f17c9..567718dd820bf41d465be6b67ccbef9890395380 100644 (file)
@@ -1,3 +1,6 @@
+* 1.2.9
+- Added distribution lock
+== hyoun jiil <jiil.hyoun@samsung.com> 2011-10-18
 * 1.2.8
 - Fixed "cancel" bug
 - Changed to remain logss about communication errors
index f3adf10f91a789b985498db5c89c12794023e25e..ae55c992e1a5fc8d6147b8e898283f27e739fdaf 100644 (file)
@@ -1,5 +1,5 @@
 Source : dibs
-Version :1.2.8
+Version :1.2.9
 Maintainer : taejun ha<taejun.ha@samsung.com>, jiil hyoun <jiil.hyoun@samsung.com>, donghyuk yang <donghyouk.yang@samsung.com>, donghee yang <donghee.yang@samsung.com>, sungmin kim <dev.sungmin.kim@samsung.com
 
 Package : dibs
index da0368fdfe508472ac200eec3c9868a1904d0e2e..e3c8e07c68856f67703785d29925fcdd8ed7f393 100644 (file)
@@ -36,7 +36,7 @@ require "RegisterPackageJob.rb"
 require "packageServer.rb"
 
 class PackageDistribution
-       attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port
+       attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port, :status
 
        def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, server )
                @server = server
@@ -44,6 +44,7 @@ class PackageDistribution
                @pkgsvr_url = pkgsvr_url
                @pkgsvr_ip = pkgsvr_ip
                @pkgsvr_port = pkgsvr_port
+               @status = "OPEN"
        end
 end
 
@@ -104,7 +105,7 @@ class DistributionManager
                        return false
                end
 
-               add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port)
+               add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, "OPEN")
                save_db()
                @server.log.info "Added a new distribution \"#{name}\""
                return true
@@ -137,62 +138,70 @@ class DistributionManager
                        db.do "DELETE FROM distributions"
                        @distributions.each do |dist|
                                dist_addr = dist.pkgsvr_ip + ":" + dist.pkgsvr_port.to_s
-                               db.do "INSERT INTO distributions VALUES('#{dist.name}','#{dist.pkgsvr_url}','#{dist_addr}')"
-                               end
-                       rescue DBI::DatabaseError => e
-                               puts "DB update failed!"
-                               puts e.errstr
-                               result = false
-                       ensure
-                               db.disconnect if db
-                       end
-                       return result
+                               db.do "INSERT INTO distributions VALUES('#{dist.name}','#{dist.pkgsvr_url}','#{dist_addr}','#{dist.status}')"
                        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
-                               @distributions = []
-
-                               sqlite_db_file = "DBI:SQLite3:#{BuildServer::CONFIG_ROOT}/#{@server.id}/server.db"
-                               begin
-                                       # open DB
-                                       db = DBI.connect(sqlite_db_file)
-
-                                       # distributions
-                                       rs = db.execute "SELECT * FROM distributions"
-                                       rs.fetch_hash do |row|
-                                               pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
-                                               pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
-                                               add_distribution_internal(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port)
-                                       end
-                                       rs.finish
-                               rescue DBI::DatabaseError => e
-                                       puts "DB loading failed!"
-                                       puts e.errstr
-                                       result = false
-                               ensure
-                                       rs.finish if not rs.finished?
-                                       db.disconnect if db
-                               end
-                               return result
-                       end
+       # load
+       def load_db()
+               result = true
+               @distributions = []
 
+               sqlite_db_file = "DBI:SQLite3:#{BuildServer::CONFIG_ROOT}/#{@server.id}/server.db"
+               begin
+                       # open DB
+                       db = DBI.connect(sqlite_db_file)
 
-                       def add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port)
-                               @distributions.push PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, @server)
+                       begin
+                               db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"') 
+                       rescue DBI::DatabaseError => e
+                               # do nothing
                        end
+                       
+                       # distributions
+                       rs = db.execute "SELECT * FROM distributions"
+                       rs.fetch_hash do |row|
+                               pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
+                               pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
+                               add_distribution_internal(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port,row['status'])
+                       end
+                       rs.finish
+               rescue DBI::DatabaseError => e
+                       puts "DB loading failed!"
+                       puts e.errstr
+                       result = false
+               ensure
+                       rs.finish if not rs.finished?
+                       db.disconnect if db
+               end
+               return result
+       end
 
 
-                       def remove_distribution_internal(name)
-                               @distributions.delete get_distribution(name)
-                       end
+       def add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, status)
+               dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, @server)
+               dist.status = status
+               @distributions.push dist
+       end
 
 
-                       def get_all_distributions()
-                               return @distributions
-                       end
+       def remove_distribution_internal(name)
+               @distributions.delete get_distribution(name)
+       end
 
-                       #END
-               end
+
+       def get_all_distributions()
+               return @distributions
+       end
+
+       #END
+end
index c5cbc6344a3e6eb783d3023813a0f2433a33236c..9de8ed088054efb90aa8b4a344ebdcd20fa432e5 100644 (file)
@@ -210,6 +210,11 @@ class SocketJobRequestListener
                        dist_name = @parent_server.distmgr.get_default_distribution_name()
                end
 
+               # check distribution
+               if not check_distribution(dist_name, req) then
+                       raise "The distribution error!!"
+               end
+
                # check supported os if not internal job
                if not is_internal then
                        os_list = check_supported_os( os_list , req )
@@ -338,6 +343,11 @@ class SocketJobRequestListener
                                dist_name = @parent_server.distmgr.get_default_distribution_name()
                        end
 
+                       # check distribution
+                       if not check_distribution(dist_name, req) then
+                               raise "The distribution error!!"
+                       end
+
                        # check project
                        prj = check_project_exist(project_name, dist_name, req)
                        if prj.nil? then
@@ -617,6 +627,11 @@ class SocketJobRequestListener
                        dist_name = @parent_server.distmgr.get_default_distribution_name()
                end
 
+               # check distribution
+               if not check_distribution(dist_name, req) then
+                       raise "The distribution error!!"
+               end
+
                # check server password
                if server_passwd != @parent_server.password then
                        BuildCommServer.send_begin(req)
@@ -664,6 +679,12 @@ class SocketJobRequestListener
                        if (dist_name.nil? or dist_name.empty?) then
                                dist_name = @parent_server.distmgr.get_default_distribution_name()
                        end
+
+                       # check distribution
+                       if not check_distribution(dist_name, req) then
+                               raise "The distribution error!!"
+                       end
+
                        new_job = @parent_server.jobmgr.create_new_register_job( file_path, dist_name )
                        logger = JobLog.new( new_job, req )
                        new_job.set_logger(logger)
@@ -683,6 +704,11 @@ class SocketJobRequestListener
                                dist_name = @parent_server.distmgr.get_default_distribution_name()
                        end
 
+                       # check distribution
+                       if not check_distribution(dist_name, req) then
+                               raise "The distribution error!!"
+                       end
+
                        # check project
                        prj = check_project_for_package_file_name(filename, dist_name, req)
                        if prj.nil? then
@@ -822,6 +848,25 @@ class SocketJobRequestListener
        end
 
 
+       private
+       def check_distribution(dist_name, req)
+               dist = @parent_server.distmgr.get_distribution(dist_name)
+               if dist.nil? then
+                       BuildCommServer.send_begin(req)
+                       req.puts "Error: The distribution \"#{dist_name}\" does not exist!"
+                       BuildCommServer.send_end(req)
+                       return false
+               elsif dist.status != "OPEN" then
+                       BuildCommServer.send_begin(req)
+                       req.puts "Error: The distribution \"#{dist_name}\" is locked!"
+                       BuildCommServer.send_end(req)
+                       return false
+               end
+
+               return true
+       end
+
+
        private
        def check_supported_os(os_list, req)