X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ferasure-code%2Fshec%2FErasureCodeShecTableCache.h;fp=src%2Fceph%2Fsrc%2Ferasure-code%2Fshec%2FErasureCodeShecTableCache.h;h=e4eaf0f0eaa3332098b366b1a9e594baf6240ed6;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/erasure-code/shec/ErasureCodeShecTableCache.h b/src/ceph/src/erasure-code/shec/ErasureCodeShecTableCache.h new file mode 100644 index 0000000..e4eaf0f --- /dev/null +++ b/src/ceph/src/erasure-code/shec/ErasureCodeShecTableCache.h @@ -0,0 +1,124 @@ +// -*- 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 FUJITSU LIMITED + * Copyright (C) 2014 CERN (Switzerland) + * + * Author: Takanori Nakao + * Author: Takeshi Miyamae + * Author: Andreas-Joachim Peters + * + * 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. + * + */ + +#ifndef CEPH_ERASURE_CODE_SHEC_TABLE_CACHE_H +#define CEPH_ERASURE_CODE_SHEC_TABLE_CACHE_H + +// ----------------------------------------------------------------------------- +#include "common/Mutex.h" +#include "erasure-code/ErasureCodeInterface.h" +// ----------------------------------------------------------------------------- +#include +// ----------------------------------------------------------------------------- + +class ErasureCodeShecTableCache { + // --------------------------------------------------------------------------- + // This class implements a table cache for encoding and decoding matrices. + // Encoding matrices are shared for the same (k,m,c,w) 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) + // --------------------------------------------------------------------------- + + class DecodingCacheParameter { + public: + int* decoding_matrix; // size: k*k + int* dm_row; // size: k + int* dm_column; // size: k + int* minimum; // size: k+m + DecodingCacheParameter() { + decoding_matrix = 0; + dm_row = 0; + dm_column = 0; + minimum = 0; + } + ~DecodingCacheParameter() { + if (decoding_matrix) { + delete[] decoding_matrix; + } + if (dm_row) { + delete[] dm_row; + } + if (dm_column) { + delete[] dm_column; + } + if (minimum) { + delete[] minimum; + } + } + }; + + public: + + static const int decoding_tables_lru_length = 10000; + typedef std::pair::iterator, + DecodingCacheParameter> lru_entry_t; + typedef std::map< int, int** > codec_table_t; + typedef std::map< int, codec_table_t > codec_tables_t__; + typedef std::map< int, codec_tables_t__ > codec_tables_t_; + typedef std::map< int, codec_tables_t_ > codec_tables_t; + typedef std::map< int, codec_tables_t > codec_technique_tables_t; + // int** matrix = codec_technique_tables_t[technique][k][m][c][w] + + typedef std::map< uint64_t, lru_entry_t > lru_map_t; + typedef std::list< uint64_t > lru_list_t; + + ErasureCodeShecTableCache() : + codec_tables_guard("shec-lru-cache") + { + } + + virtual ~ErasureCodeShecTableCache(); + + Mutex codec_tables_guard; // mutex used to protect modifications in encoding/decoding table maps + + bool getDecodingTableFromCache(int* matrix, + int* dm_row, int* dm_column, + int* minimum, + int technique, + int k, int m, int c, int w, + int* want, int* avails); + + void putDecodingTableToCache(int* matrix, + int* dm_row, int* dm_column, + int* minimum, + int technique, + int k, int m, int c, int w, + int* want, int* avails); + + int** getEncodingTable(int technique, int k, int m, int c, int w); + int** getEncodingTableNoLock(int technique, int k, int m, int c, int w); + int* setEncodingTable(int technique, int k, int m, int c, int w, int*); + + private: + // encoding table accessed via table[matrix][k][m][c][w] + // decoding table cache accessed via map[matrixtype] + // decoding table lru list accessed via list[matrixtype] + codec_technique_tables_t encoding_table; + std::map decoding_tables; + std::map decoding_tables_lru; + + lru_map_t* getDecodingTables(int technique); + lru_list_t* getDecodingTablesLru(int technique); + uint64_t getDecodingCacheSignature(int k, int m, int c, int w, + int *want, int *avails); + + Mutex* getLock(); +}; + +#endif