X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6a544620c4d5acb0c42cd56346f74454637904cb..5b0962883553bb3573787151dafea8d92988d712:/services/api/lib/refresh_permission_view.rb diff --git a/services/api/lib/refresh_permission_view.rb b/services/api/lib/refresh_permission_view.rb index 4ee45ab088..25be3c08d4 100644 --- a/services/api/lib/refresh_permission_view.rb +++ b/services/api/lib/refresh_permission_view.rb @@ -4,9 +4,37 @@ PERMISSION_VIEW = "materialized_permission_view" -def refresh_permission_view +def do_refresh_permission_view ActiveRecord::Base.transaction do ActiveRecord::Base.connection.execute("LOCK TABLE permission_refresh_lock") ActiveRecord::Base.connection.execute("REFRESH MATERIALIZED VIEW #{PERMISSION_VIEW}") end end + +def refresh_permission_view(async=false) + if async and Rails.configuration.async_permissions_update_interval > 0 + exp = Rails.configuration.async_permissions_update_interval.seconds + need = false + Rails.cache.fetch('AsyncRefreshPermissionView', expires_in: exp) do + need = true + end + if need + # Schedule a new permission update and return immediately + Thread.new do + Thread.current.abort_on_exception = false + begin + sleep(exp) + Rails.cache.delete('AsyncRefreshPermissionView') + do_refresh_permission_view + rescue => e + Rails.logger.error "Updating permission view: #{e}\n#{e.backtrace.join("\n\t")}" + ensure + ActiveRecord::Base.connection.close + end + end + true + end + else + do_refresh_permission_view + end +end