$ 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:
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;
}
int ErasureCodePluginRegistry::load(const std::string &plugin_name,
- const map<std::string,std::string> ¶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) {
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;
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;
}
#include "ErasureCodeInterface.h"
extern "C" {
- int __erasure_code_init(char *plugin_name);
+ int __erasure_code_init(char *plugin_name, char *directory);
}
namespace ceph {
ErasureCodePlugin *get(const std::string &name);
int load(const std::string &plugin_name,
- const map<std::string,std::string> ¶meters,
+ const std::string &directory,
ErasureCodePlugin **plugin,
ostream &ss);
// -----------------------------------------------------------------------------
-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());
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 };
}
};
-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());
}
};
-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());
#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;
}
#include "erasure-code/ErasureCodePlugin.h"
-int __erasure_code_init(char *plugin_name)
+int __erasure_code_init(char *plugin_name, char *directory)
{
return 0;
}
#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;
-// 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;
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;
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) {
#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;
}
#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;
}
#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;
}