From 0ddf61e5c1768c9931a2a02208a2e437d1c36ac2 Mon Sep 17 00:00:00 2001 From: wq <2332054245@qq.com> Date: Mon, 1 Sep 2025 20:35:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=83=8C=E6=99=AF=EF=BC=9A=20issue?= =?UTF-8?q?=EF=BC=9Ahttps://gitee.com/openeuler/compass-ci/issues/ICLIAM?= =?UTF-8?q?=3Ffrom=3Dproject-issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vm报错信息:qemu-kvm: cannot create PID file: Cannot lock pid file: Resource temporarily unavailable dc报错信息:docker: Error response from daemon: Conflict. The container name "/dc-1" is already in use by container 处理方案,pid文件重复,则每次生成pid名称的hostname不能和已经使用的相同,通过和已经生成的pid文件比对确保新的pid文件唯一,docker也是如此 1. 使用docker ps命令检查容器名称是否存在,确保唯一 2. 检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 --- providers/lib/job_tracker.rb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/providers/lib/job_tracker.rb b/providers/lib/job_tracker.rb index 48d2aee7..c504db50 100644 --- a/providers/lib/job_tracker.rb +++ b/providers/lib/job_tracker.rb @@ -88,7 +88,19 @@ class JobTracker def find_hostname(tbox_group) 1.upto(100000) do |i| hostname = tbox_group + "-#{i}" - return hostname unless has_hostname(hostname) + + # 检查jobs中是否已存在该hostname + next if has_hostname(hostname) + + if tbox_group.start_with?("dc") + # 检查docker容器名称是否冲突 + next if docker_container_exists?(hostname) + elsif tbox_group.start_with?("vm") + # 检查vm的pid文件是否已存在 + next if vm_pid_file_exists?(hostname) + end + + return hostname end raise "Cannot find non-conflict hostname for #{tbox_group}" end @@ -101,6 +113,20 @@ class JobTracker end end + def docker_container_exists?(hostname) + #docker ps命令检查容器名称是否存在 + container_names = `docker ps --format '{{.Names}}' 2>/dev/null`.split("\n") + container_names.include?(hostname) + rescue + false + end + + def vm_pid_file_exists?(hostname) + #检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 + pid_file_path = "/var/lib/docker/compass-ci/providers/pids/#{hostname}" + File.exist?(pid_file_path) + end + def job_file_path(job_id) File.join(ENV["JOBS_DIR"], "#{job_id}.yaml") end -- Gitee From 2d52c3336a81847ad22f3a7aa8c14c1608218477 Mon Sep 17 00:00:00 2001 From: wq <2332054245@qq.com> Date: Mon, 1 Sep 2025 20:35:41 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=83=8C=E6=99=AF=EF=BC=9A=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=9C=BA=E5=AE=B9=E5=99=A8=E8=B5=84=E6=BA=90=E6=88=96?= =?UTF-8?q?=E8=80=85=E8=99=9A=E6=8B=9F=E6=9C=BA=E8=B5=84=E6=BA=90=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=20issue=EF=BC=9Ahttps://gitee.com/openeuler/?= =?UTF-8?q?compass-ci/issues/ICLIAM=3Ffrom=3Dproject-issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vm报错信息:qemu-kvm: cannot create PID file: Cannot lock pid file: Resource temporarily unavailable dc报错信息:docker: Error response from daemon: Conflict. The container name "/dc-1" is already in use by container 处理方案,pid文件重复,则每次生成pid名称的hostname不能和已经使用的相同,通过和已经生成的pid文件比对确保新的pid文件唯一,docker也是如此 1. 使用docker ps命令检查容器名称是否存在,确保唯一 2. 检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 --- providers/lib/job_tracker.rb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/providers/lib/job_tracker.rb b/providers/lib/job_tracker.rb index 48d2aee7..c504db50 100644 --- a/providers/lib/job_tracker.rb +++ b/providers/lib/job_tracker.rb @@ -88,7 +88,19 @@ class JobTracker def find_hostname(tbox_group) 1.upto(100000) do |i| hostname = tbox_group + "-#{i}" - return hostname unless has_hostname(hostname) + + # 检查jobs中是否已存在该hostname + next if has_hostname(hostname) + + if tbox_group.start_with?("dc") + # 检查docker容器名称是否冲突 + next if docker_container_exists?(hostname) + elsif tbox_group.start_with?("vm") + # 检查vm的pid文件是否已存在 + next if vm_pid_file_exists?(hostname) + end + + return hostname end raise "Cannot find non-conflict hostname for #{tbox_group}" end @@ -101,6 +113,20 @@ class JobTracker end end + def docker_container_exists?(hostname) + #docker ps命令检查容器名称是否存在 + container_names = `docker ps --format '{{.Names}}' 2>/dev/null`.split("\n") + container_names.include?(hostname) + rescue + false + end + + def vm_pid_file_exists?(hostname) + #检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 + pid_file_path = "/var/lib/docker/compass-ci/providers/pids/#{hostname}" + File.exist?(pid_file_path) + end + def job_file_path(job_id) File.join(ENV["JOBS_DIR"], "#{job_id}.yaml") end -- Gitee From 0e1f3311567d48423e134c71b650069fb40d98d0 Mon Sep 17 00:00:00 2001 From: wq <2332054245@qq.com> Date: Wed, 24 Sep 2025 10:27:49 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=8B=86=E5=88=86=E6=A3=80=E6=B5=8Bvm?= =?UTF-8?q?=E5=92=8Cdc=E9=87=8D=E5=A4=8D=E7=9A=84=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0vm-pid=E6=96=87=E4=BB=B6=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Adocker=E5=86=B2=E7=AA=81=E6=97=B6=E7=9A=84=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0=EF=BC=8Cdocker=20ps=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E6=94=B9=E4=B8=BAinspect=E6=9D=A5=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- providers/lib/job_tracker.rb | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/providers/lib/job_tracker.rb b/providers/lib/job_tracker.rb index c504db50..7e9f7ac1 100644 --- a/providers/lib/job_tracker.rb +++ b/providers/lib/job_tracker.rb @@ -92,13 +92,7 @@ class JobTracker # 检查jobs中是否已存在该hostname next if has_hostname(hostname) - if tbox_group.start_with?("dc") - # 检查docker容器名称是否冲突 - next if docker_container_exists?(hostname) - elsif tbox_group.start_with?("vm") - # 检查vm的pid文件是否已存在 - next if vm_pid_file_exists?(hostname) - end + next if hostname_conflict?(tbox_group, hostname) return hostname end @@ -107,6 +101,18 @@ class JobTracker private + def hostname_conflict?(tbox_group, hostname) + if tbox_group.start_with?("dc") + # 检查docker容器名称是否冲突 + docker_container_exists?(hostname) + elsif tbox_group.start_with?("vm") + # 检查vm的pid文件是否已存在 + vm_pid_file_exists?(hostname) + else + false + end + end + def has_hostname(hostname) @jobs.any? do |_, v| v[:hostname] == hostname @@ -114,9 +120,12 @@ class JobTracker end def docker_container_exists?(hostname) - #docker ps命令检查容器名称是否存在 - container_names = `docker ps --format '{{.Names}}' 2>/dev/null`.split("\n") - container_names.include?(hostname) + # 使用docker inspect检查容器是否存在 + exists = system("docker inspect #{hostname} > /dev/null 2>&1") + if exists + puts "WARNING: Docker container #{hostname} already exists" + end + exists rescue false end @@ -124,7 +133,11 @@ class JobTracker def vm_pid_file_exists?(hostname) #检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 pid_file_path = "/var/lib/docker/compass-ci/providers/pids/#{hostname}" - File.exist?(pid_file_path) + exists = File.exist?(pid_file_path) + if exists + puts "WARNING: VM PID file #{pid_file_path} already exists" + end + exists end def job_file_path(job_id) -- Gitee