]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: jerasure preloads the plugin variant
authorLoic Dachary <loic-201408@dachary.org>
Thu, 21 Aug 2014 16:31:02 +0000 (18:31 +0200)
committerLoic Dachary <loic-201408@dachary.org>
Thu, 28 Aug 2014 10:13:58 +0000 (12:13 +0200)
The variant selection depending on the available CPU features is
encapsulated in a helper. The helper is used in the factory() method and
in the load() method.

The factory() method may load a variant that is not the default, for
benchmark purposes. Such a variant is not preloaded by the load() method
and upgrading while running may be problematic. However, running with a
non standard variant is used for benchmarking and upgrades in this
context are not a concern.

http://tracker.ceph.com/issues/9153 Fixes: #9153

Signed-off-by: Loic Dachary <loic-201408@dachary.org>
src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc

index b59d9e5022b3ea23595b4de207175839767f0d3d..dfb609538804c1d1ac8e186f64f506b58082f7f7 100644 (file)
@@ -29,14 +29,32 @@ static ostream& _prefix(std::ostream* _dout)
   return *_dout << "ErasureCodePluginSelectJerasure: ";
 }
 
+static string get_variant() {
+  ceph_arch_probe();
+    
+  if (ceph_arch_intel_pclmul &&
+      ceph_arch_intel_sse42 &&
+      ceph_arch_intel_sse41 &&
+      ceph_arch_intel_ssse3 &&
+      ceph_arch_intel_sse3 &&
+      ceph_arch_intel_sse2) {
+    return "sse4";
+  } else if (ceph_arch_intel_ssse3 &&
+            ceph_arch_intel_sse3 &&
+            ceph_arch_intel_sse2) {
+    return "sse3";
+  } else {
+    return "generic";
+  }
+}
+
 class ErasureCodePluginSelectJerasure : public ErasureCodePlugin {
 public:
-  virtual int factory(const map<std::string,std::string> &parameters,
+  virtual int factory(const map<string,string> &parameters,
                      ErasureCodeInterfaceRef *erasure_code) {
     ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
     stringstream ss;
     int ret;
-    ceph_arch_probe();
     string name = "jerasure";
     if (parameters.count("jerasure-name"))
       name = parameters.find("jerasure-name")->second;
@@ -46,23 +64,9 @@ public:
       ret = instance.factory(name + "_" + parameters.find("jerasure-variant")->second,
                             parameters, erasure_code, ss);
     } else {
-      if (ceph_arch_intel_pclmul &&
-         ceph_arch_intel_sse42 &&
-         ceph_arch_intel_sse41 &&
-         ceph_arch_intel_ssse3 &&
-         ceph_arch_intel_sse3 &&
-         ceph_arch_intel_sse2) {
-       dout(10) << "SSE4 plugin" << dendl;
-       ret = instance.factory(name + "_sse4", parameters, erasure_code, ss);
-      } else if (ceph_arch_intel_ssse3 &&
-                ceph_arch_intel_sse3 &&
-                ceph_arch_intel_sse2) {
-       dout(10) << "SSE3 plugin" << dendl;
-       ret = instance.factory(name + "_sse3", parameters, erasure_code, ss);
-      } else {
-       dout(10) << "generic plugin" << dendl;
-       ret = instance.factory(name + "_generic", parameters, erasure_code, ss);
-      }
+      string variant = get_variant();
+      dout(10) << variant << " plugin" << dendl;
+      ret = instance.factory(name + "_" + variant, parameters, erasure_code, ss);
     }
     if (ret)
       derr << ss.str() << dendl;
@@ -73,5 +77,15 @@ public:
 int __erasure_code_init(char *plugin_name, char *directory)
 {
   ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
+  string variant = get_variant();
+  ErasureCodePlugin *plugin;
+  stringstream ss;
+  int r = instance.load(plugin_name + string("_") + variant,
+                       directory, &plugin, ss);
+  if (r) {
+    derr << ss.str() << dendl;
+    return r;
+  }
+  dout(10) << ss.str() << dendl;
   return instance.add(plugin_name, new ErasureCodePluginSelectJerasure());
 }