From: Loic Dachary Date: Thu, 21 Aug 2014 16:22:18 +0000 (+0200) Subject: erasure-code: add directory to plugin init functions X-Git-Tag: v0.86~193^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=487105df10f1f9420b29dbbda77b217c700ccae1;p=ceph.git erasure-code: add directory to plugin init functions 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 --- diff --git a/doc/dev/osd_internals/erasure_coding/developer_notes.rst b/doc/dev/osd_internals/erasure_coding/developer_notes.rst index 1029ac20b0a8..cdab34ce41ee 100644 --- a/doc/dev/osd_internals/erasure_coding/developer_notes.rst +++ b/doc/dev/osd_internals/erasure_coding/developer_notes.rst @@ -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 `_ plugin reads: diff --git a/src/erasure-code/ErasureCodePlugin.cc b/src/erasure-code/ErasureCodePlugin.cc index b35beb0b2973..16e21b011a0e 100644 --- a/src/erasure-code/ErasureCodePlugin.cc +++ b/src/erasure-code/ErasureCodePlugin.cc @@ -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 ¶meters, + 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 profile; - profile["directory"] = directory; list plugins_list; get_str_list(plugins, plugins_list); for (list::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; } diff --git a/src/erasure-code/ErasureCodePlugin.h b/src/erasure-code/ErasureCodePlugin.h index 12808581a665..30ced6c12a37 100644 --- a/src/erasure-code/ErasureCodePlugin.h +++ b/src/erasure-code/ErasureCodePlugin.h @@ -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 ¶meters, + const std::string &directory, ErasureCodePlugin **plugin, ostream &ss); diff --git a/src/erasure-code/isa/ErasureCodePluginIsa.cc b/src/erasure-code/isa/ErasureCodePluginIsa.cc index f0d32fba7cc5..b83e4d298278 100644 --- a/src/erasure-code/isa/ErasureCodePluginIsa.cc +++ b/src/erasure-code/isa/ErasureCodePluginIsa.cc @@ -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()); diff --git a/src/erasure-code/jerasure/ErasureCodePluginJerasure.cc b/src/erasure-code/jerasure/ErasureCodePluginJerasure.cc index b90a12a27849..b18b8652339d 100644 --- a/src/erasure-code/jerasure/ErasureCodePluginJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodePluginJerasure.cc @@ -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 }; diff --git a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc index 8181fc6c69f0..2db453b419da 100644 --- a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc @@ -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()); diff --git a/src/test/erasure-code/ErasureCodePluginExample.cc b/src/test/erasure-code/ErasureCodePluginExample.cc index 767a6ce461fe..6a478489e19e 100644 --- a/src/test/erasure-code/ErasureCodePluginExample.cc +++ b/src/test/erasure-code/ErasureCodePluginExample.cc @@ -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()); diff --git a/src/test/erasure-code/ErasureCodePluginFailToInitialize.cc b/src/test/erasure-code/ErasureCodePluginFailToInitialize.cc index d4512c1a8d87..5a51e3080341 100644 --- a/src/test/erasure-code/ErasureCodePluginFailToInitialize.cc +++ b/src/test/erasure-code/ErasureCodePluginFailToInitialize.cc @@ -17,7 +17,7 @@ #include #include "erasure-code/ErasureCodePlugin.h" -int __erasure_code_init(char *plugin_name) +int __erasure_code_init(char *plugin_name, char *directory) { return -ESRCH; } diff --git a/src/test/erasure-code/ErasureCodePluginFailToRegister.cc b/src/test/erasure-code/ErasureCodePluginFailToRegister.cc index 332d186411e7..84866d606331 100644 --- a/src/test/erasure-code/ErasureCodePluginFailToRegister.cc +++ b/src/test/erasure-code/ErasureCodePluginFailToRegister.cc @@ -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; } diff --git a/src/test/erasure-code/ErasureCodePluginHangs.cc b/src/test/erasure-code/ErasureCodePluginHangs.cc index 50d657a8107a..87612ec7a75c 100644 --- a/src/test/erasure-code/ErasureCodePluginHangs.cc +++ b/src/test/erasure-code/ErasureCodePluginHangs.cc @@ -17,7 +17,7 @@ #include #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; diff --git a/src/test/erasure-code/ErasureCodePluginMissingEntryPoint.cc b/src/test/erasure-code/ErasureCodePluginMissingEntryPoint.cc index 4d8f1bafd1c9..c7ba17231cbc 100644 --- a/src/test/erasure-code/ErasureCodePluginMissingEntryPoint.cc +++ b/src/test/erasure-code/ErasureCodePluginMissingEntryPoint.cc @@ -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; diff --git a/src/test/erasure-code/TestErasureCodePlugin.cc b/src/test/erasure-code/TestErasureCodePlugin.cc index 3ebeee2f2241..60ade0a62dac 100644 --- a/src/test/erasure-code/TestErasureCodePlugin.cc +++ b/src/test/erasure-code/TestErasureCodePlugin.cc @@ -72,7 +72,8 @@ TEST_F(ErasureCodePluginRegistryTest, factory_mutex) { TEST_F(ErasureCodePluginRegistryTest, all) { map 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) { diff --git a/src/test/erasure-code/TestJerasurePluginGeneric.cc b/src/test/erasure-code/TestJerasurePluginGeneric.cc index 1ab39605f8ed..0c0d903ff3b3 100644 --- a/src/test/erasure-code/TestJerasurePluginGeneric.cc +++ b/src/test/erasure-code/TestJerasurePluginGeneric.cc @@ -17,7 +17,7 @@ #include #include "erasure-code/ErasureCodePlugin.h" -int __erasure_code_init(char *plugin_name) +int __erasure_code_init(char *plugin_name, char *directory) { return -111; } diff --git a/src/test/erasure-code/TestJerasurePluginSSE3.cc b/src/test/erasure-code/TestJerasurePluginSSE3.cc index ed41aee8cc1d..2165f8b66a56 100644 --- a/src/test/erasure-code/TestJerasurePluginSSE3.cc +++ b/src/test/erasure-code/TestJerasurePluginSSE3.cc @@ -17,7 +17,7 @@ #include #include "erasure-code/ErasureCodePlugin.h" -int __erasure_code_init(char *plugin_name) +int __erasure_code_init(char *plugin_name, char *directory) { return -333; } diff --git a/src/test/erasure-code/TestJerasurePluginSSE4.cc b/src/test/erasure-code/TestJerasurePluginSSE4.cc index 3e0258880910..ed25283f49b0 100644 --- a/src/test/erasure-code/TestJerasurePluginSSE4.cc +++ b/src/test/erasure-code/TestJerasurePluginSSE4.cc @@ -17,7 +17,7 @@ #include #include "erasure-code/ErasureCodePlugin.h" -int __erasure_code_init(char *plugin_name) +int __erasure_code_init(char *plugin_name, char *directory) { return -444; }