Accept :py3 modifier for any Python suite in interactive mode.
[arvados.git] / services / api / lib / refresh_permission_view.rb
index 4d3df7d4dcb4af8239154a4ceb15ab1b66e58d53..25be3c08d4d40d8f7dbc7307e76bc7d2423997a6 100644 (file)
@@ -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.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