X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9429a5c85024430b96e2349f3ec36cc2161058b2..a38f5a5d70f836904690bcfac911b9765af479a7:/services/api/db/structure.sql diff --git a/services/api/db/structure.sql b/services/api/db/structure.sql index 1b0eab5f67..6e8b128c9e 100644 --- a/services/api/db/structure.sql +++ b/services/api/db/structure.sql @@ -197,16 +197,85 @@ $$; CREATE FUNCTION public.container_priority(for_container_uuid character varying, inherited bigint, inherited_from character varying) RETURNS bigint LANGUAGE sql AS $$ -select coalesce(max(case when container_requests.priority = 0 then 0 - when containers.uuid = inherited_from then inherited +/* Determine the priority of an individual container. + The "inherited" priority comes from the path we followed from the root, the parent container + priority hasn't been updated in the table yet but we need to behave it like it has been. +*/ +select coalesce(max(case when containers.uuid = inherited_from then inherited when containers.priority is not NULL then containers.priority else container_requests.priority * 1125899906842624::bigint - (extract(epoch from container_requests.created_at)*1000)::bigint end), 0) from container_requests left outer join containers on container_requests.requesting_container_uuid = containers.uuid - where container_requests.container_uuid = for_container_uuid and container_requests.state = 'Committed' and container_requests.priority > 0; + where container_requests.container_uuid = for_container_uuid and + container_requests.state = 'Committed' and + container_requests.priority > 0 and + container_requests.owner_uuid not in (select group_uuid from trashed_groups); +$$; + + +-- +-- Name: container_tree(character varying); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.container_tree(for_container_uuid character varying) RETURNS TABLE(pri_container_uuid character varying) + LANGUAGE sql + AS $$ +/* A lighter weight version of the update_priorities query that only returns the containers in a tree, + used by SELECT FOR UPDATE. +*/ +with recursive tab(upd_container_uuid) as ( + select for_container_uuid +union + select containers.uuid + from (tab join container_requests on tab.upd_container_uuid = container_requests.requesting_container_uuid) as child_requests + join containers on child_requests.container_uuid = containers.uuid + where containers.state in ('Queued', 'Locked', 'Running') +) +select upd_container_uuid from tab; +$$; + + +-- +-- Name: container_tree_priorities(character varying); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.container_tree_priorities(for_container_uuid character varying) RETURNS TABLE(pri_container_uuid character varying, upd_priority bigint) + LANGUAGE sql + AS $$ +/* Calculate the priorities of all containers starting from for_container_uuid. + This traverses the process tree downward and calls container_priority for each container + and returns a table of container uuids and their new priorities. +*/ +with recursive tab(upd_container_uuid, upd_priority) as ( + select for_container_uuid, container_priority(for_container_uuid, 0, '') +union + select containers.uuid, container_priority(containers.uuid, child_requests.upd_priority, child_requests.upd_container_uuid) + from (tab join container_requests on tab.upd_container_uuid = container_requests.requesting_container_uuid) as child_requests + join containers on child_requests.container_uuid = containers.uuid + where containers.state in ('Queued', 'Locked', 'Running') +) +select upd_container_uuid, upd_priority from tab; $$; +-- +-- Name: jsonb_exists_all_inline_op(jsonb, text[]); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.jsonb_exists_all_inline_op(jsonb, text[]) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 ?& $2$_$; + + +-- +-- Name: jsonb_exists_inline_op(jsonb, text); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.jsonb_exists_inline_op(jsonb, text) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 ? $2$_$; + + -- -- Name: project_subtree_with_is_frozen(character varying, boolean); Type: FUNCTION; Schema: public; Owner: - -- @@ -269,28 +338,33 @@ select starting_uuid like '_____-j7d0g-_______________' or $$; --- --- Name: update_priorities(character varying); Type: FUNCTION; Schema: public; Owner: - --- +SET default_tablespace = ''; -CREATE FUNCTION public.update_priorities(for_container_uuid character varying) RETURNS TABLE(pri_container_uuid character varying, upd_priority bigint) - LANGUAGE sql - AS $$ -with recursive tab(upd_container_uuid, upd_priority) as ( - select for_container_uuid, container_priority(for_container_uuid, 0, '') -union - select containers.uuid, container_priority(containers.uuid, child_requests.upd_priority, child_requests.upd_container_uuid) - from (tab join container_requests on tab.upd_container_uuid = container_requests.requesting_container_uuid) as child_requests - join containers on child_requests.container_uuid = containers.uuid - where containers.state in ('Queued', 'Locked', 'Running') -) -select upd_container_uuid, upd_priority from tab; -$$; +SET default_with_oids = false; +-- +-- Name: groups; Type: TABLE; Schema: public; Owner: - +-- -SET default_tablespace = ''; +CREATE TABLE public.groups ( + id bigint NOT NULL, + uuid character varying(255), + owner_uuid character varying(255), + created_at timestamp without time zone NOT NULL, + modified_by_client_uuid character varying(255), + modified_by_user_uuid character varying(255), + modified_at timestamp without time zone, + name character varying(255) NOT NULL, + description character varying(524288), + updated_at timestamp without time zone NOT NULL, + group_class character varying(255), + trash_at timestamp without time zone, + is_trashed boolean DEFAULT false NOT NULL, + delete_at timestamp without time zone, + properties jsonb DEFAULT '{}'::jsonb, + frozen_by_uuid character varying +); -SET default_with_oids = false; -- -- Name: api_client_authorizations; Type: TABLE; Schema: public; Owner: - @@ -616,30 +690,6 @@ CREATE TABLE public.frozen_groups ( ); --- --- Name: groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.groups ( - id bigint NOT NULL, - uuid character varying(255), - owner_uuid character varying(255), - created_at timestamp without time zone NOT NULL, - modified_by_client_uuid character varying(255), - modified_by_user_uuid character varying(255), - modified_at timestamp without time zone, - name character varying(255) NOT NULL, - description character varying(524288), - updated_at timestamp without time zone NOT NULL, - group_class character varying(255), - trash_at timestamp without time zone, - is_trashed boolean DEFAULT false NOT NULL, - delete_at timestamp without time zone, - properties jsonb DEFAULT '{}'::jsonb, - frozen_by_uuid character varying -); - - -- -- Name: groups_id_seq; Type: SEQUENCE; Schema: public; Owner: - -- @@ -3241,6 +3291,8 @@ INSERT INTO "schema_migrations" (version) VALUES ('20221219165512'), ('20221230155924'), ('20230421142716'), -('20230503224107'); +('20230503224107'), +('20230815160000'), +('20230821000000');