]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
src/erasure-code: support statically-linked (built-in) plugins
authorShraddha Agrawal <shraddha.agrawal000@gmail.com>
Fri, 24 Jul 2026 08:21:36 +0000 (13:51 +0530)
committerShraddha Agrawal <shraddha.agrawal000@gmail.com>
Fri, 24 Jul 2026 08:21:36 +0000 (13:51 +0530)
This commit adds the functionality in EC plugin registry to support
built in (statically linked) plugins. This is done by 2 main changes:

1. introducing a new map, builtin_plugins, where plugins can register
a factory for itself at startup.
2. load() now first checks if the plugin is builtin and instantiates it,
otherwise it falls back to dynamically linking the plugin.

Signed-off-by: Shraddha Agrawal <shraddha.agrawal000@gmail.com>
src/erasure-code/ErasureCodePlugin.cc
src/erasure-code/ErasureCodePlugin.h

index c7aacce3a0631b626e59e15d7fd5ba22ac7343a5..acf4e75932584ac45bb2321a8511edaff88fad5e 100644 (file)
@@ -46,7 +46,7 @@ ErasureCodePluginRegistry::~ErasureCodePluginRegistry()
     assert(plugin);
     void *library = plugin->library;
     delete plugin;
-    if (!disable_dlclose) {
+    if (library && !disable_dlclose) {
       dlclose(library);
     }
   }
@@ -60,7 +60,9 @@ int ErasureCodePluginRegistry::remove(const std::string &name)
   std::map<std::string,ErasureCodePlugin*>::iterator plugin = plugins.find(name);
   void *library = plugin->second->library;
   delete plugin->second;
-  dlclose(library);
+  if (library) {
+    dlclose(library);
+  }
   plugins.erase(plugin);
   return 0;
 }
@@ -84,6 +86,21 @@ ErasureCodePlugin *ErasureCodePluginRegistry::get(const std::string &name)
     return 0;
 }
 
+static std::map<std::string, std::function<ErasureCodePlugin*()>>&
+builtin_plugins()
+{
+  static std::map<std::string, std::function<ErasureCodePlugin*()>> reg;
+  return reg;
+}
+
+int ErasureCodePluginRegistry::register_builtin(
+  const std::string &name,
+  std::function<ErasureCodePlugin*()> create)
+{
+  builtin_plugins()[name] = std::move(create);
+  return 0;
+}
+
 int ErasureCodePluginRegistry::factory(const std::string &plugin_name,
                                       const std::string &directory,
                                       ErasureCodeProfile &profile,
@@ -124,6 +141,16 @@ int ErasureCodePluginRegistry::load(const std::string &plugin_name,
                                    ostream *ss)
 {
   ceph_assert(ceph_mutex_is_locked(lock));
+
+  if (auto it = builtin_plugins().find(plugin_name);
+      it != builtin_plugins().end()) {
+    int r = add(plugin_name, it->second());
+    if (r == 0) {
+      *plugin = get(plugin_name);
+    }
+    return r;
+  }
+
   std::string fname = directory + "/" PLUGIN_PREFIX
     + plugin_name + PLUGIN_SUFFIX;
   void *library = dlopen(fname.c_str(), RTLD_NOW);
index f85b9246dcdc0362c193eb5f9e60c4d2895501e7..7f4ce5e695eba804d2c0d36291f9522d5b40cbc9 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef CEPH_ERASURE_CODE_PLUGIN_H
 #define CEPH_ERASURE_CODE_PLUGIN_H
 
+#include <functional>
+
 #include "common/ceph_mutex.h"
 #include "ErasureCodeInterface.h"
 
@@ -69,6 +71,10 @@ namespace ceph {
     int remove(const std::string &name);
     ErasureCodePlugin *get(const std::string &name);
 
+    static int register_builtin(
+      const std::string &name,
+      std::function<ErasureCodePlugin*()> create);
+
     int load(const std::string &plugin_name,
             const std::string &directory,
             ErasureCodePlugin **plugin,