initial code repo
[stor4nfv.git] / src / ceph / src / compressor / Compressor.cc
diff --git a/src/ceph/src/compressor/Compressor.cc b/src/ceph/src/compressor/Compressor.cc
new file mode 100644 (file)
index 0000000..02764f4
--- /dev/null
@@ -0,0 +1,117 @@
+// -*- 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 Haomai Wang <haomaiwang@gmail.com>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software 
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include <random>
+#include <sstream>
+
+#include "CompressionPlugin.h"
+#include "Compressor.h"
+#include "common/ceph_context.h"
+#include "common/debug.h"
+#include "common/dout.h"
+
+const char * Compressor::get_comp_alg_name(int a) {
+  switch (a) {
+  case COMP_ALG_NONE: return "none";
+  case COMP_ALG_SNAPPY: return "snappy";
+  case COMP_ALG_ZLIB: return "zlib";
+  case COMP_ALG_ZSTD: return "zstd";
+#ifdef HAVE_LZ4
+  case COMP_ALG_LZ4: return "lz4";
+#endif
+  default: return "???";
+  }
+}
+
+boost::optional<Compressor::CompressionAlgorithm> Compressor::get_comp_alg_type(const std::string &s) {
+  if (s == "snappy")
+    return COMP_ALG_SNAPPY;
+  if (s == "zlib")
+    return COMP_ALG_ZLIB;
+  if (s == "zstd")
+    return COMP_ALG_ZSTD;
+#ifdef HAVE_LZ4
+  if (s == "lz4")
+    return COMP_ALG_LZ4;
+#endif
+  if (s == "" || s == "none")
+    return COMP_ALG_NONE;
+
+  return boost::optional<CompressionAlgorithm>();
+}
+
+const char *Compressor::get_comp_mode_name(int m) {
+  switch (m) {
+    case COMP_NONE: return "none";
+    case COMP_PASSIVE: return "passive";
+    case COMP_AGGRESSIVE: return "aggressive";
+    case COMP_FORCE: return "force";
+    default: return "???";
+  }
+}
+boost::optional<Compressor::CompressionMode> Compressor::get_comp_mode_type(const std::string &s) {
+  if (s == "force")
+    return COMP_FORCE;
+  if (s == "aggressive")
+    return COMP_AGGRESSIVE;
+  if (s == "passive")
+    return COMP_PASSIVE;
+  if (s == "none")
+    return COMP_NONE;
+  return boost::optional<CompressionMode>();
+}
+
+CompressorRef Compressor::create(CephContext *cct, const std::string &type)
+{
+  // support "random" for teuthology testing
+  if (type == "random") {
+    static std::random_device seed;
+    static std::default_random_engine engine(seed());
+    static Spinlock mutex;
+
+    int alg = COMP_ALG_NONE;
+    std::uniform_int_distribution<> dist(0, COMP_ALG_LAST - 1);
+    {
+      std::lock_guard<Spinlock> lock(mutex);
+      alg = dist(engine);
+    }
+    if (alg == COMP_ALG_NONE) {
+      return nullptr;
+    }
+    return create(cct, alg);
+  }
+
+  CompressorRef cs_impl = NULL;
+  std::stringstream ss;
+  PluginRegistry *reg = cct->get_plugin_registry();
+  CompressionPlugin *factory = dynamic_cast<CompressionPlugin*>(reg->get_with_load("compressor", type));
+  if (factory == NULL) {
+    lderr(cct) << __func__ << " cannot load compressor of type " << type << dendl;
+    return NULL;
+  }
+  int err = factory->factory(&cs_impl, &ss);
+  if (err)
+    lderr(cct) << __func__ << " factory return error " << err << dendl;
+  return cs_impl;
+}
+
+CompressorRef Compressor::create(CephContext *cct, int alg)
+{
+  if (alg < 0 || alg >= COMP_ALG_LAST) {
+    lderr(cct) << __func__ << " invalid algorithm value:" << alg << dendl;
+    return CompressorRef();
+  }
+  std::string type_name = get_comp_alg_name(alg);
+  return create(cct, type_name);
+}