Deletion state doesn't get rolled back when update service fails

Identified in https://gitlab.com/gitlab-com/request-for-help/-/work_items/4044+

Whenever we schedule a project for deletion and the ::Projects::UpdateService returns an error. It doesn't rollback the project's state causing succeeding requests to raise transition errors.

Steps to replicate

  1. Apply the following patch
Index: app/services/projects/update_service.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
--- a/app/services/projects/update_service.rb	(revision 97e55fb014f7cabd926a3eec80be6cff1ce5ae7b)
+++ b/app/services/projects/update_service.rb	(date 1768469120710)
@@ -10,6 +10,8 @@
     ApiError = Class.new(StandardError)
 
     def execute
+      raise ValidationError, 'Oh no, something went wrong.'
+
       build_topics
       ensure_ci_cd_settings
       remove_unallowed_params
  1. Delete a project twice.

Implementation Guide

  1. Raise an exception when the update service fails to trigger the transaction rollback in Projects::MarkForDeletionService#execute_deletion
Edited by Shane Maglangit