CWL spec -> CWL standards
[arvados.git] / services / api / lib / refresh_permission_view.rb
index 4ee45ab088af1faea093a3de5af033b68955002a..5d6081f262b25756dd7e3fcdeec42ae762c4687f 100644 (file)
@@ -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.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