stringstream ss;
int ret;
ceph_arch_probe();
+ string name = "jerasure";
+ if (parameters.count("jerasure-name"))
+ name = parameters.find("jerasure-name")->second;
if (ceph_arch_intel_pclmul &&
ceph_arch_intel_sse42 &&
ceph_arch_intel_sse41 &&
ceph_arch_intel_sse3 &&
ceph_arch_intel_sse2) {
dout(10) << "SSE4 plugin" << dendl;
- ret = instance.factory("jerasure_sse4", parameters, erasure_code, ss);
+ 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("jerasure_sse3", parameters, erasure_code, ss);
+ ret = instance.factory(name + "_sse3", parameters, erasure_code, ss);
} else {
dout(10) << "generic plugin" << dendl;
- ret = instance.factory("jerasure_generic", parameters, erasure_code, ss);
+ ret = instance.factory(name + "_generic", parameters, erasure_code, ss);
}
if (ret)
derr << ss.str() << dendl;
libec_fail_to_register_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*'
erasure_codelib_LTLIBRARIES += libec_fail_to_register.la
+libec_test_jerasure_sse4_la_SOURCES = test/erasure-code/TestJerasurePluginSSE4.cc
+libec_test_jerasure_sse4_la_CFLAGS = ${AM_CFLAGS}
+libec_test_jerasure_sse4_la_CXXFLAGS= ${AM_CXXFLAGS}
+libec_test_jerasure_sse4_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS)
+libec_test_jerasure_sse4_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*'
+erasure_codelib_LTLIBRARIES += libec_test_jerasure_sse4.la
+
+libec_test_jerasure_sse3_la_SOURCES = test/erasure-code/TestJerasurePluginSSE3.cc
+libec_test_jerasure_sse3_la_CFLAGS = ${AM_CFLAGS}
+libec_test_jerasure_sse3_la_CXXFLAGS= ${AM_CXXFLAGS}
+libec_test_jerasure_sse3_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS)
+libec_test_jerasure_sse3_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*'
+erasure_codelib_LTLIBRARIES += libec_test_jerasure_sse3.la
+
+libec_test_jerasure_generic_la_SOURCES = test/erasure-code/TestJerasurePluginGeneric.cc
+libec_test_jerasure_generic_la_CFLAGS = ${AM_CFLAGS}
+libec_test_jerasure_generic_la_CXXFLAGS= ${AM_CXXFLAGS}
+libec_test_jerasure_generic_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS)
+libec_test_jerasure_generic_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*'
+erasure_codelib_LTLIBRARIES += libec_test_jerasure_generic.la
+
unittest_erasure_code_plugin_SOURCES = test/erasure-code/TestErasureCodePlugin.cc
unittest_erasure_code_plugin_CXXFLAGS = $(UNITTEST_CXXFLAGS)
unittest_erasure_code_plugin_LDADD = $(LIBOSD) $(LIBCOMMON) $(UNITTEST_LDADD) $(CEPH_GLOBAL)
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
*/
#include <errno.h>
+#include "arch/probe.h"
+#include "arch/intel.h"
#include "global/global_init.h"
#include "erasure-code/ErasureCodePlugin.h"
#include "common/ceph_argparse.h"
ErasureCodeInterfaceRef erasure_code;
EXPECT_FALSE(erasure_code);
EXPECT_EQ(-ENOENT, instance.factory("jerasure", parameters,
- &erasure_code, cerr));
+ &erasure_code, cerr));
EXPECT_FALSE(erasure_code);
}
const char *techniques[] = {
parameters["technique"] = *technique;
EXPECT_FALSE(erasure_code);
EXPECT_EQ(0, instance.factory("jerasure", parameters,
- &erasure_code, cerr));
+ &erasure_code, cerr));
+ EXPECT_TRUE(erasure_code);
+ }
+}
+
+TEST(ErasureCodePlugin, select)
+{
+ ceph_arch_probe();
+ // save probe results
+ int arch_intel_pclmul = ceph_arch_intel_pclmul;
+ int arch_intel_sse42 = ceph_arch_intel_sse42;
+ int arch_intel_sse41 = ceph_arch_intel_sse41;
+ int arch_intel_ssse3 = ceph_arch_intel_ssse3;
+ int arch_intel_sse3 = ceph_arch_intel_sse3;
+ int arch_intel_sse2 = ceph_arch_intel_sse2;
+
+ ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance();
+ map<std::string,std::string> parameters;
+ // load test plugins instead of actual plugins to assert the desired side effect
+ // happens
+ parameters["jerasure-name"] = "test_jerasure";
+ parameters["directory"] = ".libs";
+ parameters["technique"] = "reed_sol_van";
+
+ // all features are available, load the SSE4 plugin
+ {
+ ceph_arch_intel_pclmul = 1;
+ ceph_arch_intel_sse42 = 1;
+ ceph_arch_intel_sse41 = 1;
+ ceph_arch_intel_ssse3 = 1;
+ ceph_arch_intel_sse3 = 1;
+ ceph_arch_intel_sse2 = 1;
+
+ ErasureCodeInterfaceRef erasure_code;
+ int sse4_side_effect = -444;
+ EXPECT_EQ(sse4_side_effect, instance.factory("jerasure", parameters,
+ &erasure_code, cerr));
+ }
+ // pclmul is missing, load the SSE3 plugin
+ {
+ ceph_arch_intel_pclmul = 0;
+ ceph_arch_intel_sse42 = 1;
+ ceph_arch_intel_sse41 = 1;
+ ceph_arch_intel_ssse3 = 1;
+ ceph_arch_intel_sse3 = 1;
+ ceph_arch_intel_sse2 = 1;
+
+ ErasureCodeInterfaceRef erasure_code;
+ int sse3_side_effect = -333;
+ EXPECT_EQ(sse3_side_effect, instance.factory("jerasure", parameters,
+ &erasure_code, cerr));
+ }
+ // pclmul and sse3 are missing, load the generic plugin
+ {
+ ceph_arch_intel_pclmul = 0;
+ ceph_arch_intel_sse42 = 1;
+ ceph_arch_intel_sse41 = 1;
+ ceph_arch_intel_ssse3 = 1;
+ ceph_arch_intel_sse3 = 0;
+ ceph_arch_intel_sse2 = 1;
+
+ ErasureCodeInterfaceRef erasure_code;
+ int generic_side_effect = -111;
+ EXPECT_EQ(generic_side_effect, instance.factory("jerasure", parameters,
+ &erasure_code, cerr));
+ }
+
+
+ // restore probe results
+ ceph_arch_intel_pclmul = arch_intel_pclmul;
+ ceph_arch_intel_sse42 = arch_intel_sse42;
+ ceph_arch_intel_sse41 = arch_intel_sse41;
+ ceph_arch_intel_ssse3 = arch_intel_ssse3;
+ ceph_arch_intel_sse3 = arch_intel_sse3;
+ ceph_arch_intel_sse2 = arch_intel_sse2;
+}
+
EXPECT_TRUE(erasure_code);
}
}
return RUN_ALL_TESTS();
}
-/*
+/*
* Local Variables:
- * compile-command: "cd ../.. ; make -j4 &&
- * make unittest_erasure_code_plugin_jerasure &&
+ * compile-command: "cd ../.. ; make -j4 &&
+ * make unittest_erasure_code_plugin_jerasure &&
* valgrind --tool=memcheck ./unittest_erasure_code_plugin_jerasure \
* --gtest_filter=*.* --log-to-stderr=true --debug-osd=20"
* End:
*/
-