1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
5 PERMISSION_VIEW = "materialized_permissions"
6 TRASHED_GROUPS = "trashed_groups"
8 def do_refresh_permission_view
9 ActiveRecord::Base.transaction do
10 ActiveRecord::Base.connection.execute("LOCK TABLE permission_refresh_lock")
11 ActiveRecord::Base.connection.execute("DELETE FROM #{PERMISSION_VIEW}")
12 ActiveRecord::Base.connection.execute %{
13 INSERT INTO #{PERMISSION_VIEW}
14 select users.uuid, g.target_uuid, g.val, g.traverse_owned
15 from users, lateral search_permission_graph(users.uuid, 3) as g
20 def refresh_permission_view(async=false)
21 if async and Rails.configuration.API.AsyncPermissionsUpdateInterval > 0
22 exp = Rails.configuration.API.AsyncPermissionsUpdateInterval.seconds
24 Rails.cache.fetch('AsyncRefreshPermissionView', expires_in: exp) do
28 # Schedule a new permission update and return immediately
30 Thread.current.abort_on_exception = false
33 Rails.cache.delete('AsyncRefreshPermissionView')
34 do_refresh_permission_view
36 Rails.logger.error "Updating permission view: #{e}\n#{e.backtrace.join("\n\t")}"
38 ActiveRecord::Base.connection.close
44 do_refresh_permission_view