X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9429a5c85024430b96e2349f3ec36cc2161058b2..f3b8d03f7063b162355bccfd71aeb2b8b67bbdbb:/services/api/lib/update_priorities.rb diff --git a/services/api/lib/update_priorities.rb b/services/api/lib/update_priorities.rb index bd5b71b90c..94115340df 100644 --- a/services/api/lib/update_priorities.rb +++ b/services/api/lib/update_priorities.rb @@ -2,15 +2,30 @@ # # SPDX-License-Identifier: AGPL-3.0 -def update_priorities starting_container_uuid +def row_lock_for_priority_update container_uuid + # Locks all the containers under this container, and also any + # immediate parent containers. This ensures we have locked + # everything that gets touched by either a priority update or state + # update. ActiveRecord::Base.connection.exec_query %{ -update containers set priority=computed.upd_priority from (select pri_container_uuid, upd_priority from update_priorities($1) order by pri_container_uuid) as computed - where containers.uuid = computed.pri_container_uuid -}, 'update_priorities', [[nil, starting_container_uuid]] + select 1 from containers where containers.uuid in ( + select pri_container_uuid from container_tree($1) +UNION + select container_requests.requesting_container_uuid from container_requests + where container_requests.container_uuid = $1 + and container_requests.state = 'Committed' + and container_requests.requesting_container_uuid is not NULL +) + order by containers.uuid for update + }, 'select_for_update_priorities', [container_uuid] end -def row_lock_for_priority_update container_uuid +def update_priorities starting_container_uuid + # Ensure the row locks were taken in order + row_lock_for_priority_update starting_container_uuid + ActiveRecord::Base.connection.exec_query %{ - select 1 from containers where containers.uuid in (select pri_container_uuid from update_priorities($1)) order by containers.uuid for update - }, 'select_for_update_priorities', [[nil, container_uuid]] +update containers set priority=computed.upd_priority from container_tree_priorities($1) as computed + where containers.uuid = computed.pri_container_uuid and priority != computed.upd_priority +}, 'update_priorities', [starting_container_uuid] end