X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/1962fd79f400d605c4b26e2add0157c6b504803a..6762d1501f67860180045bbce3e63ef573d07fec:/services/api/lib/refresh_permission_view.rb?ds=sidebyside diff --git a/services/api/lib/refresh_permission_view.rb b/services/api/lib/refresh_permission_view.rb index 4d3df7d4dc..5d6081f262 100644 --- a/services/api/lib/refresh_permission_view.rb +++ b/services/api/lib/refresh_permission_view.rb @@ -4,6 +4,37 @@ PERMISSION_VIEW = "materialized_permission_view" -def refresh_permission_view - ActiveRecord::Base.connection.exec_query("REFRESH MATERIALIZED VIEW #{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.API.AsyncPermissionsUpdateInterval > 0 + exp = Rails.configuration.API.AsyncPermissionsUpdateInterval.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