This is an automated email from the ASF dual-hosted git repository.

cmcfarlen pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit b498568c202463ce89047c03fb6a26061a20a1eb
Author: Leif Hedstrom <[email protected]>
AuthorDate: Fri May 3 16:28:10 2024 -0600

    This assures that plugins in a Cript are destructed (#11314)
    
    (cherry picked from commit 9eb45b8a310e0c6e7cef3d8299d74345fca4c390)
---
 include/cripts/Epilogue.hpp                    |  2 ++
 include/cripts/Plugins.hpp                     | 15 +++++++++++++--
 plugins/experimental/rate_limit/sni_selector.h |  3 ++-
 plugins/experimental/rate_limit/txn_limiter.h  |  3 +++
 src/cripts/Instance.cc                         |  2 +-
 src/cripts/Plugins.cc                          |  9 +++++++++
 6 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/include/cripts/Epilogue.hpp b/include/cripts/Epilogue.hpp
index d535a3666a..0a710a5b99 100644
--- a/include/cripts/Epilogue.hpp
+++ b/include/cripts/Epilogue.hpp
@@ -450,6 +450,8 @@ TSRemapDeleteInstance(void *ih)
     wrap_delete_instance(&context, true, CaseArg);
   }
 
+  inst->debug("Deleted an instance for Cript = {}", inst->plugin_debug_tag);
+
   delete inst;
 }
 
diff --git a/include/cripts/Plugins.hpp b/include/cripts/Plugins.hpp
index 5cfe65c262..afde5c862b 100644
--- a/include/cripts/Plugins.hpp
+++ b/include/cripts/Plugins.hpp
@@ -31,15 +31,26 @@ class Remap
   using self_type = Remap;
 
 public:
-  Remap()              = default;
-  Remap(Remap &&)      = default;
+  Remap() = default;
+
+  Remap(Remap &&other)
+  {
+    _plugin       = other._plugin;
+    _valid        = other._valid;
+    other._plugin = nullptr;
+  }
+
   Remap(const Remap &) = delete;
 
+  ~Remap() { cleanup(); }
+
   Remap &operator=(Remap &&)      = default;
   Remap &operator=(const Remap &) = delete;
 
   void _runRemap(Cript::Context *context);
 
+  void cleanup();
+
   [[nodiscard]] bool
   valid() const
   {
diff --git a/plugins/experimental/rate_limit/sni_selector.h 
b/plugins/experimental/rate_limit/sni_selector.h
index 7015226ddf..d461da33a0 100644
--- a/plugins/experimental/rate_limit/sni_selector.h
+++ b/plugins/experimental/rate_limit/sni_selector.h
@@ -41,7 +41,7 @@ public:
   using IPReputations = std::vector<IpReputation::SieveLru *>;
   using Lists         = std::vector<List::IP *>;
 
-  SniSelector() = default;
+  SniSelector() { Dbg(dbg_ctl, "Creating SNI selector"); }
 
   SniSelector(self_type &&)               = delete;
   self_type &operator=(const self_type &) = delete;
@@ -49,6 +49,7 @@ public:
 
   virtual ~SniSelector()
   {
+    Dbg(dbg_ctl, "Destroying SNI selector");
     if (_queue_action) {
       TSActionCancel(_queue_action);
     }
diff --git a/plugins/experimental/rate_limit/txn_limiter.h 
b/plugins/experimental/rate_limit/txn_limiter.h
index 7e4bacda00..a583806605 100644
--- a/plugins/experimental/rate_limit/txn_limiter.h
+++ b/plugins/experimental/rate_limit/txn_limiter.h
@@ -26,8 +26,11 @@
 class TxnRateLimiter : public RateLimiter<TSHttpTxn>
 {
 public:
+  TxnRateLimiter() { Dbg(dbg_ctl, "Creating txn rate limiter"); }
+
   ~TxnRateLimiter() override
   {
+    Dbg(dbg_ctl, "Destroying txn rate limiter");
     if (_action) {
       TSActionCancel(_action);
     }
diff --git a/src/cripts/Instance.cc b/src/cripts/Instance.cc
index e50ee77fa4..04c39ace14 100644
--- a/src/cripts/Instance.cc
+++ b/src/cripts/Instance.cc
@@ -64,7 +64,7 @@ Cript::Instance::addPlugin(const Cript::string &tag, const 
Cript::string &plugin
   auto p = Plugin::Remap::create(tag, plugin, from_url, to_url, options);
 
   if (p.valid()) {
-    plugins[tag] = std::move(p);
+    plugins.emplace(tag, std::move(p));
 
     return true;
   } else {
diff --git a/src/cripts/Plugins.cc b/src/cripts/Plugins.cc
index d7abeb360f..6721966b2f 100644
--- a/src/cripts/Plugins.cc
+++ b/src/cripts/Plugins.cc
@@ -71,6 +71,15 @@ Plugin::Remap::create(const std::string &tag, const 
std::string &plugin, const C
   return inst; // RVO
 }
 
+void
+Plugin::Remap::cleanup()
+{
+  if (_plugin) {
+    _plugin->done();
+    _plugin = nullptr;
+  }
+}
+
 void
 Plugin::Remap::_runRemap(Cript::Context *context)
 {

Reply via email to