Merge branch 'master' of git.curoverse.com:arvados into 13429-cwl-runner-storage...
[arvados.git] / services / api / lib / update_priority.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 module UpdatePriority
6   # Clean up after races: if container priority>0 but there are no
7   # committed container requests for it, reset priority to 0.
8   def self.update_priority
9     if !File.owned?(Rails.root.join('tmp'))
10       Rails.logger.warn("UpdatePriority: not owner of #{Rails.root}/tmp, skipping")
11       return
12     end
13     lockfile = Rails.root.join('tmp', 'update_priority.lock')
14     File.open(lockfile, File::RDWR|File::CREAT, 0600) do |f|
15       return unless f.flock(File::LOCK_NB|File::LOCK_EX)
16       ActiveRecord::Base.connection.execute("UPDATE containers AS c SET priority=0 WHERE state='Queued' AND priority>0 AND uuid NOT IN (SELECT container_uuid FROM container_requests WHERE priority>0);")
17     end
18   end
19
20   def self.run_update_thread
21     need = false
22     Rails.cache.fetch('UpdatePriority', expires_in: 5.seconds) do
23       need = true
24     end
25     return if !need
26
27     Thread.new do
28       Thread.current.abort_on_exception = false
29       begin
30         update_priority
31       rescue => e
32         Rails.logger.error "#{e.class}: #{e}\n#{e.backtrace.join("\n\t")}"
33       ensure
34         ActiveRecord::Base.connection.close
35       end
36     end
37   end
38 end