From 13602cc1cee0736089f37f5a5c4dd1ab516ac8ba Mon Sep 17 00:00:00 2001 From: Ali Naqvi Date: Wed, 27 Nov 2024 14:07:39 +0800 Subject: [PATCH 1/4] feat: PPT-1635 stale driver cleanup task --- src/core-app.cr | 3 +++ src/placeos-core/driver_cleanup.cr | 43 ++++++++++++++++++++++++++++++ src/placeos-core/healthcheck.cr | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/placeos-core/driver_cleanup.cr diff --git a/src/core-app.cr b/src/core-app.cr index a235dd32..429c0fb7 100644 --- a/src/core-app.cr +++ b/src/core-app.cr @@ -102,6 +102,9 @@ Signal::TERM.trap &terminate # Wait for redis and postgres to be ready PlaceOS::Core.wait_for_resources +# Start cleaning un-used driver task +PlaceOS::Core::DriverCleanup.start_cleanup + spawn do begin PlaceOS::Core.start_managers diff --git a/src/placeos-core/driver_cleanup.cr b/src/placeos-core/driver_cleanup.cr new file mode 100644 index 00000000..e6c3fb40 --- /dev/null +++ b/src/placeos-core/driver_cleanup.cr @@ -0,0 +1,43 @@ +require "file_utils" +require "pg-orm" + +module PlaceOS::Core::DriverCleanup + def self.start_cleanup + spawn do + loop do + sleep(23.hours + rand(60).minutes) + cleanup_unused_drivers rescue nil + end + end + end + + def self.cleanup_unused_drivers + local = Dir.new(DriverStore::BINARY_PATH).children + running = running_drivers + stale = local - running + FileUtils.rm_rf(stale.map { |file| Path[DriverStore::BINARY_PATH, file] }) + end + + private def self.arch + {% if flag?(:x86_64) %} "amd64" {% elsif flag?(:aarch64) %} "arm64" {% end %} || raise("Uknown architecture") + end + + private def self.running_drivers + sql = <<-SQL + SELECT DISTINCT ON (driver.commit) + regexp_replace(regexp_replace(driver.file_name, '.cr$', '', 'g'), '[/.]', '_', 'g') || '_' || LEFT(driver.commit, 6) || '_' AS driver_file + FROM + mod, + driver + WHERE + mod.running = true + AND driver.id = mod.driver_id + ORDER BY driver.commit; + SQL + running = + ::DB.connect(Healthcheck.pg_healthcheck_url) do |db| + db.query_all sql, &.read(String) + end + running.map(&.+(arch)) + end +end diff --git a/src/placeos-core/healthcheck.cr b/src/placeos-core/healthcheck.cr index d2f832fc..883d3f50 100644 --- a/src/placeos-core/healthcheck.cr +++ b/src/placeos-core/healthcheck.cr @@ -29,7 +29,7 @@ module PlaceOS::Core::Healthcheck @@pg_healthcheck_url : String? = nil - private def self.pg_healthcheck_url(timeout = 5) + def self.pg_healthcheck_url(timeout = 5) @@pg_healthcheck_url ||= begin url = PgORM::Settings.to_uri uri = URI.parse(url) From e289253f1842fadc2b30f117baa2927f8222c85e Mon Sep 17 00:00:00 2001 From: Ali Naqvi Date: Wed, 27 Nov 2024 16:25:02 +0800 Subject: [PATCH 2/4] chore: make linter happy --- src/placeos-core/driver_cleanup.cr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/placeos-core/driver_cleanup.cr b/src/placeos-core/driver_cleanup.cr index e6c3fb40..f45f4bb3 100644 --- a/src/placeos-core/driver_cleanup.cr +++ b/src/placeos-core/driver_cleanup.cr @@ -24,13 +24,13 @@ module PlaceOS::Core::DriverCleanup private def self.running_drivers sql = <<-SQL - SELECT DISTINCT ON (driver.commit) + SELECT DISTINCT ON (driver.commit) regexp_replace(regexp_replace(driver.file_name, '.cr$', '', 'g'), '[/.]', '_', 'g') || '_' || LEFT(driver.commit, 6) || '_' AS driver_file - FROM - mod, + FROM + mod, driver - WHERE - mod.running = true + WHERE + mod.running = true AND driver.id = mod.driver_id ORDER BY driver.commit; SQL From 7f64f88c4eebffdd8a3dc651420f9924ebc120fc Mon Sep 17 00:00:00 2001 From: Ali Naqvi Date: Wed, 27 Nov 2024 17:39:51 +0800 Subject: [PATCH 3/4] minor refactoring --- src/placeos-core/driver_cleanup.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/placeos-core/driver_cleanup.cr b/src/placeos-core/driver_cleanup.cr index f45f4bb3..666d21a1 100644 --- a/src/placeos-core/driver_cleanup.cr +++ b/src/placeos-core/driver_cleanup.cr @@ -15,7 +15,7 @@ module PlaceOS::Core::DriverCleanup local = Dir.new(DriverStore::BINARY_PATH).children running = running_drivers stale = local - running - FileUtils.rm_rf(stale.map { |file| Path[DriverStore::BINARY_PATH, file] }) + FileUtils.rm_rf(stale.map { |file| Path[DriverStore::BINARY_PATH, file] }) unless stale.empty? end private def self.arch From e288fb8f538cca17780413450b18c86dc3283f18 Mon Sep 17 00:00:00 2001 From: Ali Naqvi Date: Fri, 29 Nov 2024 09:42:31 +0800 Subject: [PATCH 4/4] refactor: Added spec --- spec/driver_cleanup_spec.cr | 31 ++++++++++++++++++++++++++++++ src/placeos-core/driver_cleanup.cr | 4 ++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 spec/driver_cleanup_spec.cr diff --git a/spec/driver_cleanup_spec.cr b/spec/driver_cleanup_spec.cr new file mode 100644 index 00000000..1064b823 --- /dev/null +++ b/spec/driver_cleanup_spec.cr @@ -0,0 +1,31 @@ +require "./helper" + +module PlaceOS::Core + describe DriverCleanup do + it "get running drivers information in expected format" do + _, driver, mod = setup + module_manager = module_manager_mock + + builder = DriverResource.new(startup: true, module_manager: module_manager) + resource_manager = ResourceManager.new(driver_builder: builder) + resource_manager.start { } + + mod_id = mod.id.as(String) + + driver_path = module_manager.store.driver_binary_path(driver.file_name, driver.commit).to_s + + mod.reload! + mod.driver = mod.driver.not_nil!.reload! + + module_manager.load_module(mod) + + module_manager.local_processes.run_count.should eq(ProcessManager::Count.new(1, 1)) + + expected = ["drivers_place_private_helper_cce023_#{DriverCleanup.arch}"] + running = DriverCleanup.running_drivers + running.should eq(expected) + local = Dir.new(DriverStore::BINARY_PATH).children + running.should eq(expected) + end + end +end diff --git a/src/placeos-core/driver_cleanup.cr b/src/placeos-core/driver_cleanup.cr index 666d21a1..44f83684 100644 --- a/src/placeos-core/driver_cleanup.cr +++ b/src/placeos-core/driver_cleanup.cr @@ -18,11 +18,11 @@ module PlaceOS::Core::DriverCleanup FileUtils.rm_rf(stale.map { |file| Path[DriverStore::BINARY_PATH, file] }) unless stale.empty? end - private def self.arch + def self.arch {% if flag?(:x86_64) %} "amd64" {% elsif flag?(:aarch64) %} "arm64" {% end %} || raise("Uknown architecture") end - private def self.running_drivers + def self.running_drivers sql = <<-SQL SELECT DISTINCT ON (driver.commit) regexp_replace(regexp_replace(driver.file_name, '.cr$', '', 'g'), '[/.]', '_', 'g') || '_' || LEFT(driver.commit, 6) || '_' AS driver_file