From: Loic Dachary Date: Thu, 21 Aug 2014 16:31:02 +0000 (+0200) Subject: erasure-code: jerasure preloads the plugin variant X-Git-Tag: v0.86~193^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=efc8bfd112dcffa02b25a361147945330c2d881e;p=ceph.git erasure-code: jerasure preloads the plugin variant 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 --- diff --git a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc index b59d9e5022b..dfb60953880 100644 --- a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc @@ -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 ¶meters, + virtual int factory(const map ¶meters, 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()); }