summaryrefslogtreecommitdiffstats
path: root/src/erasure-code/isa/ErasureCodeIsaTableCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/erasure-code/isa/ErasureCodeIsaTableCache.h')
-rw-r--r--src/erasure-code/isa/ErasureCodeIsaTableCache.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/erasure-code/isa/ErasureCodeIsaTableCache.h b/src/erasure-code/isa/ErasureCodeIsaTableCache.h
new file mode 100644
index 000000000..8110a4660
--- /dev/null
+++ b/src/erasure-code/isa/ErasureCodeIsaTableCache.h
@@ -0,0 +1,103 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 CERN (Switzerland)
+ *
+ * Author: Andreas-Joachim Peters <Andreas.Joachim.Peters@cern.ch>
+ *
+ * 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.
+ *
+ */
+
+/**
+ * @file ErasureCodeIsaTableCache.h
+ *
+ * @brief Erasure Code Isa CODEC Table Cache
+ *
+ * The INTEL ISA-L library supports two pre-defined encoding matrices (cauchy = default, reed_sol_van = default)
+ * The default CODEC implementation using these two matrices is implemented in class ErasureCodeIsaDefault.
+ * ISA-L allows to use custom matrices which might be added later as implementations deriving from the base class ErasoreCodeIsa.
+ */
+
+#ifndef CEPH_ERASURE_CODE_ISA_TABLE_CACHE_H
+#define CEPH_ERASURE_CODE_ISA_TABLE_CACHE_H
+
+// -----------------------------------------------------------------------------
+#include "common/ceph_mutex.h"
+#include "erasure-code/ErasureCodeInterface.h"
+// -----------------------------------------------------------------------------
+#include <list>
+// -----------------------------------------------------------------------------
+
+class ErasureCodeIsaTableCache {
+ // ---------------------------------------------------------------------------
+ // This class implements a table cache for encoding and decoding matrices.
+ // Encoding matrices are shared for the same (k,m) combination. It supplies
+ // a decoding matrix lru cache which is shared for identical
+ // matrix types e.g. there is one cache (lru-list + lru-map) for Cauchy and
+ // one for Vandermonde matrices!
+ // ---------------------------------------------------------------------------
+
+public:
+
+ // the cache size is sufficient up to (12,4) decodings
+
+ static const int decoding_tables_lru_length = 2516;
+
+ typedef std::pair<std::list<std::string>::iterator, ceph::buffer::ptr> lru_entry_t;
+ typedef std::map< int, unsigned char** > codec_table_t;
+ typedef std::map< int, codec_table_t > codec_tables_t;
+ typedef std::map< int, codec_tables_t > codec_technique_tables_t;
+
+ typedef std::map< std::string, lru_entry_t > lru_map_t;
+ typedef std::list< std::string > lru_list_t;
+
+ ErasureCodeIsaTableCache() = default;
+
+ virtual ~ErasureCodeIsaTableCache();
+
+ // mutex used to protect modifications in encoding/decoding table maps
+ ceph::mutex codec_tables_guard = ceph::make_mutex("isa-lru-cache");
+
+ bool getDecodingTableFromCache(std::string &signature,
+ unsigned char* &table,
+ int matrixtype,
+ int k,
+ int m);
+
+ void putDecodingTableToCache(std::string&,
+ unsigned char*&,
+ int matrixtype,
+ int k,
+ int m);
+
+ unsigned char** getEncodingTable(int matrix, int k, int m);
+ unsigned char** getEncodingCoefficient(int matrix, int k, int m);
+
+ unsigned char** getEncodingTableNoLock(int matrix, int k, int m);
+ unsigned char** getEncodingCoefficientNoLock(int matrix, int k, int m);
+
+ unsigned char* setEncodingTable(int matrix, int k, int m, unsigned char*);
+ unsigned char* setEncodingCoefficient(int matrix, int k, int m, unsigned char*);
+
+ int getDecodingTableCacheSize(int matrixtype = 0);
+
+private:
+ codec_technique_tables_t encoding_coefficient; // encoding coefficients accessed via table[matrix][k][m]
+ codec_technique_tables_t encoding_table; // encoding coefficients accessed via table[matrix][k][m]
+
+ std::map<int, lru_map_t*> decoding_tables; // decoding table cache accessed via map[matrixtype]
+ std::map<int, lru_list_t*> decoding_tables_lru; // decoding table lru list accessed via list[matrixtype]
+
+ lru_map_t* getDecodingTables(int matrix_type);
+
+ lru_list_t* getDecodingTablesLru(int matrix_type);
+
+ ceph::mutex* getLock();
+
+};
+
+#endif