]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: test jerasure SSE optimized plugins selection
authorLoic Dachary <loic@dachary.org>
Thu, 27 Mar 2014 10:06:24 +0000 (11:06 +0100)
committerLoic Dachary <loic@dachary.org>
Thu, 27 Mar 2014 13:27:23 +0000 (14:27 +0100)
Test the selection of the plugin depending on the CPU features. The
prefix of the plugin is "jerasure" by default (jerasure_generic,
jerasure_sse3, jerasure_sse4) and can be modified with the
"jerasure-name" parameter. A test plugin is created for each
variant (test_jerasure_generic, test_jerasure_sse3, test_jerasure_sse4).
The flags set by ceph_probe are modified by the test to check if the
expected plugin suffix is appended.

Signed-off-by: Loic Dachary <loic@dachary.org>
src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc
src/test/erasure-code/Makefile.am
src/test/erasure-code/TestErasureCodePluginJerasure.cc
src/test/erasure-code/TestJerasurePluginGeneric.cc [new file with mode: 0644]
src/test/erasure-code/TestJerasurePluginSSE3.cc [new file with mode: 0644]
src/test/erasure-code/TestJerasurePluginSSE4.cc [new file with mode: 0644]

index 2d35e92f094f9b667edf91185372b102f55f0824..6e2f16c116dababa29cdf6d8e9886f63f6e88757 100644 (file)
@@ -36,6 +36,9 @@ public:
     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 &&
@@ -43,15 +46,15 @@ public:
        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;
index 95065cf343c50ec0f5c0ffd247fdc0a2324c1977..fdbe003f6cec93c6caca851ff3afb07a65639de1 100644 (file)
@@ -52,6 +52,27 @@ libec_fail_to_register_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS)
 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)
index 7dd33064b129ad2044530ca89627b17841e25454..0e0e31e27f63b50ac9ef4b0901fa8d010ae2e98a 100644 (file)
@@ -1,4 +1,4 @@
-// -*- 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"
@@ -30,7 +32,7 @@ TEST(ErasureCodePlugin, factory)
     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[] = {
@@ -48,7 +50,83 @@ TEST(ErasureCodePlugin, factory)
     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);
   }
 }
@@ -65,12 +143,11 @@ int main(int argc, char **argv)
   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:
  */
-
diff --git a/src/test/erasure-code/TestJerasurePluginGeneric.cc b/src/test/erasure-code/TestJerasurePluginGeneric.cc
new file mode 100644 (file)
index 0000000..f273bd6
--- /dev/null
@@ -0,0 +1,23 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ *
+ * Author: Loic Dachary <loic@dachary.org>
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  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 "erasure-code/ErasureCodePlugin.h"
+
+int __erasure_code_init(char *plugin_name)
+{
+  return -111;
+}
diff --git a/src/test/erasure-code/TestJerasurePluginSSE3.cc b/src/test/erasure-code/TestJerasurePluginSSE3.cc
new file mode 100644 (file)
index 0000000..9d74d52
--- /dev/null
@@ -0,0 +1,23 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ *
+ * Author: Loic Dachary <loic@dachary.org>
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  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 "erasure-code/ErasureCodePlugin.h"
+
+int __erasure_code_init(char *plugin_name)
+{
+  return -333;
+}
diff --git a/src/test/erasure-code/TestJerasurePluginSSE4.cc b/src/test/erasure-code/TestJerasurePluginSSE4.cc
new file mode 100644 (file)
index 0000000..7bb6f7e
--- /dev/null
@@ -0,0 +1,23 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
+ *
+ * Author: Loic Dachary <loic@dachary.org>
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  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 "erasure-code/ErasureCodePlugin.h"
+
+int __erasure_code_init(char *plugin_name)
+{
+  return -444;
+}