13593: Changes default async permission update interval. Clears cache.
[arvados.git] / services / api / lib / refresh_permission_view.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 PERMISSION_VIEW = "materialized_permission_view"
6
7 def do_refresh_permission_view
8   ActiveRecord::Base.transaction do
9     ActiveRecord::Base.connection.execute("LOCK TABLE permission_refresh_lock")
10     ActiveRecord::Base.connection.execute("REFRESH MATERIALIZED VIEW #{PERMISSION_VIEW}")
11   end
12 end
13
14 def refresh_permission_view(async=false)
15   if async and Rails.configuration.async_permissions_update_interval > 0
16     exp = Rails.configuration.async_permissions_update_interval.seconds
17     Rails.cache.fetch('AsyncRefreshPermissionView', expires_in: exp) do
18       # Schedule a new permission update and return immediately
19       Thread.new do
20         Thread.current.abort_on_exception = false
21         begin
22           sleep(exp)
23           Rails.cache.delete('AsyncRefreshPermissionView')
24           do_refresh_permission_view
25         rescue => e
26           Rails.logger.error "Updating permission view: #{e}\n#{e.backtrace.join("\n\t")}"
27         ensure
28           ActiveRecord::Base.connection.close
29         end
30       end
31       true
32     end
33   else
34     do_refresh_permission_view
35   end
36 end