13593: Adds 'async' parameter to groups create & update calls for perms updates.
[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           do_refresh_permission_view
24         rescue => e
25           Rails.logger.error "Updating permission view: #{e}\n#{e.backtrace.join("\n\t")}"
26         ensure
27           ActiveRecord::Base.connection.close
28         end
29       end
30       true
31     end
32   else
33     do_refresh_permission_view
34   end
35 end