From dea32fc3f98b448288cbcb5a974507f0168969a8 Mon Sep 17 00:00:00 2001
From: Varik Matevosyan <varikmatevosyan@gmail.com>
Date: Thu, 21 Nov 2024 18:11:11 +0400
Subject: [PATCH] disable logical subscription before deleting

---
 model/lantern/lantern_resource.rb           | 13 ++++++++++++-
 spec/model/lantern/lantern_resource_spec.rb |  4 ++--
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/model/lantern/lantern_resource.rb b/model/lantern/lantern_resource.rb
index 5059a7784..e0e02a4ed 100644
--- a/model/lantern/lantern_resource.rb
+++ b/model/lantern/lantern_resource.rb
@@ -233,7 +233,18 @@ def create_and_enable_subscription
   end
 
   def delete_logical_subscription(name)
-    representative_server.run_query_all("DROP SUBSCRIPTION IF EXISTS #{name}")
+    commands = <<SQL
+DO $$
+BEGIN
+    IF EXISTS (SELECT FROM pg_subscription WHERE subname='#{name}') THEN
+      ALTER SUBSCRIPTION #{name} DISABLE;
+      ALTER SUBSCRIPTION #{name} SET (slot_name=NONE);
+      DROP SUBSCRIPTION #{name};
+    END IF;
+END
+$$;
+SQL
+    representative_server.run_query_all(commands)
   end
 
   def mark_switchover_start
diff --git a/spec/model/lantern/lantern_resource_spec.rb b/spec/model/lantern/lantern_resource_spec.rb
index f4b615d71..b2e48c22a 100644
--- a/spec/model/lantern/lantern_resource_spec.rb
+++ b/spec/model/lantern/lantern_resource_spec.rb
@@ -238,7 +238,7 @@
     it "drops subscription" do
       representative_server = instance_double(LanternServer)
       expect(lantern_resource).to receive(:representative_server).and_return(representative_server).at_least(:once)
-      expect(lantern_resource.representative_server).to receive(:run_query_all).with("DROP SUBSCRIPTION IF EXISTS test")
+      expect(lantern_resource.representative_server).to receive(:run_query_all).with(a_string_matching(/DROP SUBSCRIPTION test/m))
       expect { lantern_resource.delete_logical_subscription("test") }.not_to raise_error
     end
   end
@@ -286,7 +286,7 @@
         logical_replication: true,
         lantern_version: representative_server.lantern_version,
         extras_version: representative_server.extras_version,
-        minor_version: representative_server.minor_version,
+        minor_version: representative_server.minor_version
       ))
       expect { lantern_resource.create_logical_replica }.not_to raise_error
     end