]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: add directory to plugin init functions
authorLoic Dachary <loic-201408@dachary.org>
Thu, 21 Aug 2014 16:22:18 +0000 (18:22 +0200)
committerLoic Dachary <loic-201408@dachary.org>
Thu, 28 Aug 2014 09:09:29 +0000 (11:09 +0200)
The prototype of the init functions of erasure coded plugins is changed
from

   int __erasure_code_init(char *plugin_name)

to

   int __erasure_code_init(char *plugin_name, char *directory)

The jerasure plugin will find optimized variants in this directory and
load them. The load() and preload() functions of
ErasureCodePluginRegistry only use a directory instead of a more generic
parameters map. The parameters map was only used for the directory entry
anyway.

Signed-off-by: Loic Dachary <loic-201408@dachary.org>
15 files changed:
doc/dev/osd_internals/erasure_coding/developer_notes.rst
src/erasure-code/ErasureCodePlugin.cc
src/erasure-code/ErasureCodePlugin.h
src/erasure-code/isa/ErasureCodePluginIsa.cc
src/erasure-code/jerasure/ErasureCodePluginJerasure.cc
src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc
src/test/erasure-code/ErasureCodePluginExample.cc
src/test/erasure-code/ErasureCodePluginFailToInitialize.cc
src/test/erasure-code/ErasureCodePluginFailToRegister.cc
src/test/erasure-code/ErasureCodePluginHangs.cc
src/test/erasure-code/ErasureCodePluginMissingEntryPoint.cc
src/test/erasure-code/TestErasureCodePlugin.cc
src/test/erasure-code/TestJerasurePluginGeneric.cc
src/test/erasure-code/TestJerasurePluginSSE3.cc
src/test/erasure-code/TestJerasurePluginSSE4.cc

index 1029ac20b0a82b91c4256ef52deea256b9724c6c..cdab34ce41eebdb06881a2e20a74ba160e4e89f0 100644 (file)
@@ -177,7 +177,7 @@ key=value pairs stored in an `erasure code profile`_.
  $ ceph osd pool create ecpool 12 12 erasure myprofile
 
 The *plugin* is dynamically loaded from *directory*  and expected to
-implement the *int __erasure_code_init(char *plugin_name)* function 
+implement the *int __erasure_code_init(char *plugin_name, char *directory)* function 
 which is responsible for registering an object derived from *ErasureCodePlugin* 
 in the registry. The `ErasureCodePluginExample <https://github.com/ceph/ceph/blob/v0.78/src/test/erasure-code/ErasureCodePluginExample.cc>`_ plugin reads:
 
index b35beb0b2973aa65285e09f2af36b7794a0178e8..16e21b011a0eed6a5faa0c6d7d5f3f18e8317118 100644 (file)
@@ -78,7 +78,8 @@ int ErasureCodePluginRegistry::factory(const std::string &plugin_name,
     plugin = get(plugin_name);
     if (plugin == 0) {
       loading = true;
-      r = load(plugin_name, parameters, &plugin, ss);
+      assert(parameters.count("directory") != 0);
+      r = load(plugin_name, parameters.find("directory")->second, &plugin, ss);
       loading = false;
       if (r != 0)
        return r;
@@ -89,13 +90,11 @@ int ErasureCodePluginRegistry::factory(const std::string &plugin_name,
 }
 
 int ErasureCodePluginRegistry::load(const std::string &plugin_name,
-                                   const map<std::string,std::string> &parameters,
+                                   const std::string &directory,
                                    ErasureCodePlugin **plugin,
                                    ostream &ss)
 {
-  assert(parameters.count("directory") != 0);
-  std::string fname = parameters.find("directory")->second
-    + "/" PLUGIN_PREFIX
+  std::string fname = directory + "/" PLUGIN_PREFIX
     + plugin_name + PLUGIN_SUFFIX;
   void *library = dlopen(fname.c_str(), RTLD_NOW);
   if (!library) {
@@ -103,13 +102,14 @@ int ErasureCodePluginRegistry::load(const std::string &plugin_name,
     return -EIO;
   }
 
-  int (*erasure_code_init)(const char *) =
-    (int (*)(const char *))dlsym(library, PLUGIN_INIT_FUNCTION);
+  int (*erasure_code_init)(const char *, const char *) =
+    (int (*)(const char *, const char *))dlsym(library, PLUGIN_INIT_FUNCTION);
   if (erasure_code_init) {
     std::string name = plugin_name;
-    int r = erasure_code_init(name.c_str());
+    int r = erasure_code_init(name.c_str(), directory.c_str());
     if (r != 0) {
       ss << "erasure_code_init(" << plugin_name
+        << "," << directory 
         << "): " << cpp_strerror(r);
       dlclose(library);
       return r;
@@ -141,15 +141,13 @@ int ErasureCodePluginRegistry::preload(const std::string &plugins,
                                       const std::string &directory,
                                       ostream &ss)
 {
-  map<string,string> profile;
-  profile["directory"] = directory;
   list<string> plugins_list;
   get_str_list(plugins, plugins_list);
   for (list<string>::iterator i = plugins_list.begin();
        i != plugins_list.end();
        i++) {
     ErasureCodePlugin *plugin;
-    int r = load(*i, profile, &plugin, ss);
+    int r = load(*i, directory, &plugin, ss);
     if (r)
       return r;
   }
index 12808581a665be6d6066d31f17d0a013e22b0d98..30ced6c12a37ced6026f7ce1f3a5910fba45ef59 100644 (file)
@@ -22,7 +22,7 @@
 #include "ErasureCodeInterface.h"
 
 extern "C" {
-  int __erasure_code_init(char *plugin_name);
+  int __erasure_code_init(char *plugin_name, char *directory);
 }
 
 namespace ceph {
@@ -64,7 +64,7 @@ namespace ceph {
     ErasureCodePlugin *get(const std::string &name);
 
     int load(const std::string &plugin_name,
-            const map<std::string,std::string> &parameters,
+            const std::string &directory,
             ErasureCodePlugin **plugin,
             ostream &ss);
 
index f0d32fba7cc553fef18ffa85314a1017f6a10dc3..b83e4d2982785148fb156a5fc586f70794e5ed4f 100644 (file)
@@ -74,7 +74,7 @@ public:
 
 // -----------------------------------------------------------------------------
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
   return instance.add(plugin_name, new ErasureCodePluginIsa());
index b90a12a2784901eac85b245bcf65251084d6988a..b18b8652339d7e64c20ee1b4b49e9784e1ceb0b5 100644 (file)
@@ -70,7 +70,7 @@ extern gf_t *gfp_array[];
 extern int  gfp_is_composite[];
 }
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
   int w[] = { 4, 8, 16, 32 };
index 8181fc6c69f0ae5c27d68a8d98def12f9d35d5b5..2db453b419da70283af9d11f549a74b55b063db1 100644 (file)
@@ -69,7 +69,7 @@ public:
   }
 };
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
   return instance.add(plugin_name, new ErasureCodePluginSelectJerasure());
index 767a6ce461fee45e0a5bfa3c57698de219c2d7b7..6a478489e19e7ad50fcdf17eb2d129273164ec62 100644 (file)
@@ -29,7 +29,7 @@ public:
   }
 };
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
   return instance.add(plugin_name, new ErasureCodePluginExample());
index d4512c1a8d87399bad984b96933bd9ad29df4b21..5a51e30803412312e762aa6d5f3ea9da8d90fc78 100644 (file)
@@ -17,7 +17,7 @@
 #include <errno.h>
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   return -ESRCH;
 }
index 332d186411e7784fbafe82c6983b3ec34a3746a4..84866d606331d4b5560605d75d3f05c4f6818104 100644 (file)
@@ -16,7 +16,7 @@
 
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   return 0;
 }
index 50d657a8107a60fb3d971a677d3e65d1029677fd..87612ec7a75c96d03c70baf13a9bb6c3d8f36e26 100644 (file)
@@ -17,7 +17,7 @@
 #include <unistd.h>
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   sleep(1000);
   return 0;
index 4d8f1bafd1c9b7dda03e1beafafdefc4f6e53cf2..c7ba17231cbcd61e6d011048d01b8453cab3081c 100644 (file)
@@ -1,4 +1,4 @@
-// missing int __erasure_code_init(char *plugin_name) {}
+// missing int __erasure_code_init(char *plugin_name, char *directory) {}
 
 // avoid warnings about library containing no symbols
 int __this_is_an_used_variable_to_avoid_warnings;
index 3ebeee2f22410496bc8fa8b7095758f6087c32a9..60ade0a62dac68a2d38cf8e3445580eedc1d511f 100644 (file)
@@ -72,7 +72,8 @@ TEST_F(ErasureCodePluginRegistryTest, factory_mutex) {
 TEST_F(ErasureCodePluginRegistryTest, all)
 {
   map<std::string,std::string> parameters;
-  parameters["directory"] = ".libs";
+  string directory(".libs");
+  parameters["directory"] = directory;
   ErasureCodeInterfaceRef erasure_code;
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
   stringstream ss;
@@ -91,7 +92,7 @@ TEST_F(ErasureCodePluginRegistryTest, all)
   EXPECT_EQ(0, instance.factory("example", parameters, &erasure_code, ss));
   EXPECT_TRUE(erasure_code);
   ErasureCodePlugin *plugin = 0;
-  EXPECT_EQ(-EEXIST, instance.load("example", parameters, &plugin, ss));
+  EXPECT_EQ(-EEXIST, instance.load("example", directory, &plugin, ss));
 }
 
 int main(int argc, char **argv) {
index 1ab39605f8ed44e1c120dea7ddb1de3610cb6e70..0c0d903ff3b3bc8bea9bbbeaa166c836144e2418 100644 (file)
@@ -17,7 +17,7 @@
 #include <errno.h>
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   return -111;
 }
index ed41aee8cc1d0b3b35dba1dda885175d24bf7e79..2165f8b66a56a154c9ac59ee8ec7773f6c9297f7 100644 (file)
@@ -17,7 +17,7 @@
 #include <errno.h>
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   return -333;
 }
index 3e0258880910f1950ff80bcc81d9c9fd57561b88..ed25283f49b0f44f6cf47fa6e4895bcb35999d4f 100644 (file)
@@ -17,7 +17,7 @@
 #include <errno.h>
 #include "erasure-code/ErasureCodePlugin.h"
 
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
 {
   return -444;
 }