From fb5ef3422cb5e581c20ac55489a388471de9b186 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 12 Jun 2024 19:09:40 +0800 Subject: [PATCH] commit the delete query for each user in the loop to reduce lock time --- .../0181.do.batch_delete_trash_items.sql | 24 +++++++++++++++++-- .../0181.undo.batch_delete_trash_items.sql | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/db/migrations/0181.do.batch_delete_trash_items.sql b/packages/db/migrations/0181.do.batch_delete_trash_items.sql index 07b38d538..3657610ae 100755 --- a/packages/db/migrations/0181.do.batch_delete_trash_items.sql +++ b/packages/db/migrations/0181.do.batch_delete_trash_items.sql @@ -4,7 +4,9 @@ BEGIN; -CREATE OR REPLACE FUNCTION batch_delete_trash_items() +CREATE OR REPLACE PROCEDURE batch_delete_trash_items( + minimum_items INT +) RETURNS VOID AS $$ DECLARE user_record RECORD; @@ -17,14 +19,32 @@ DECLARE status = 'ACTIVE'; BEGIN FOR user_record IN user_cursor LOOP + BEGIN; + -- For Row Level Security PERFORM omnivore.set_claims(user_record.id, 'omnivore_user'); + -- keep the minimum number of items in trash DELETE FROM omnivore.library_item WHERE user_id = user_record.id AND state = 'DELETED' - AND deleted_at < NOW() - INTERVAL '14 days'; + AND deleted_at < NOW() - INTERVAL '14 days' + AND id NOT IN ( + SELECT + id + FROM + omnivore.library_item + WHERE + user_id = user_record.id + AND state = 'DELETED' + AND deleted_at < NOW() - INTERVAL '14 days' + ORDER BY + deleted_at DESC + LIMIT minimum_items + ); + + COMMIT; END LOOP; END; $$ LANGUAGE plpgsql; diff --git a/packages/db/migrations/0181.undo.batch_delete_trash_items.sql b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql index 836f8e533..3851c057b 100755 --- a/packages/db/migrations/0181.undo.batch_delete_trash_items.sql +++ b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql @@ -4,6 +4,6 @@ BEGIN; -DROP FUNCTION IF EXISTS batch_delete_trash_items(); +DROP PROCEDURE IF EXISTS batch_delete_trash_items(); COMMIT;