Cache: Move key generation to module level
The key generation is dependent upon the storage implemenation, but not on a particular storage instance.
This commit is contained in:
26
server/modules/filter/cache/cache_storage_api.h
vendored
26
server/modules/filter/cache/cache_storage_api.h
vendored
@ -143,6 +143,18 @@ typedef struct cache_storage_api
|
|||||||
uint64_t max_size,
|
uint64_t max_size,
|
||||||
int argc, char* argv[]);
|
int argc, char* argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a key for a GWBUF.
|
||||||
|
*
|
||||||
|
* @param query An SQL query. Must be one contiguous buffer.
|
||||||
|
* @param key Pointer to key.
|
||||||
|
*
|
||||||
|
* @return CACHE_RESULT_OK if a key was created, otherwise some error code.
|
||||||
|
*/
|
||||||
|
cache_result_t (*getKey)(const char* default_db,
|
||||||
|
const GWBUF* query,
|
||||||
|
CACHE_KEY* key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees an CACHE_STORAGE instance earlier created with createInstance.
|
* Frees an CACHE_STORAGE instance earlier created with createInstance.
|
||||||
*
|
*
|
||||||
@ -164,20 +176,6 @@ typedef struct cache_storage_api
|
|||||||
cache_result_t (*getInfo)(CACHE_STORAGE* storage,
|
cache_result_t (*getInfo)(CACHE_STORAGE* storage,
|
||||||
uint32_t what,
|
uint32_t what,
|
||||||
json_t** info);
|
json_t** info);
|
||||||
/**
|
|
||||||
* Create a key for a GWBUF.
|
|
||||||
*
|
|
||||||
* @param storage Pointer to a CACHE_STORAGE.
|
|
||||||
* @param query An SQL query. Must be one contiguous buffer.
|
|
||||||
* @param key Pointer to key.
|
|
||||||
*
|
|
||||||
* @return CACHE_RESULT_OK if a key was created, otherwise some error code.
|
|
||||||
*/
|
|
||||||
cache_result_t (*getKey)(CACHE_STORAGE* storage,
|
|
||||||
const char* default_db,
|
|
||||||
const GWBUF* query,
|
|
||||||
CACHE_KEY* key);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a value from the cache.
|
* Get a value from the cache.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -46,6 +46,7 @@ InMemoryStorage::~InMemoryStorage()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
cache_result_t InMemoryStorage::get_key(const char* zdefault_db, const GWBUF* pquery, CACHE_KEY* pkey)
|
cache_result_t InMemoryStorage::get_key(const char* zdefault_db, const GWBUF* pquery, CACHE_KEY* pkey)
|
||||||
{
|
{
|
||||||
ss_dassert(GWBUF_IS_CONTIGUOUS(pquery));
|
ss_dassert(GWBUF_IS_CONTIGUOUS(pquery));
|
||||||
|
|||||||
@ -24,7 +24,7 @@ class InMemoryStorage
|
|||||||
public:
|
public:
|
||||||
virtual ~InMemoryStorage();
|
virtual ~InMemoryStorage();
|
||||||
|
|
||||||
cache_result_t get_key(const char* zdefault_db, const GWBUF* pquery, CACHE_KEY* pkey);
|
static cache_result_t get_key(const char* zdefault_db, const GWBUF* pquery, CACHE_KEY* pkey);
|
||||||
|
|
||||||
virtual cache_result_t get_info(uint32_t what, json_t** ppInfo) const = 0;
|
virtual cache_result_t get_info(uint32_t what, json_t** ppInfo) const = 0;
|
||||||
virtual cache_result_t get_value(const CACHE_KEY& key, uint32_t flags, GWBUF** ppresult) = 0;
|
virtual cache_result_t get_value(const CACHE_KEY& key, uint32_t flags, GWBUF** ppresult) = 0;
|
||||||
|
|||||||
@ -76,6 +76,21 @@ CACHE_STORAGE* createInstance(cache_thread_model_t model,
|
|||||||
return reinterpret_cast<CACHE_STORAGE*>(sStorage.release());
|
return reinterpret_cast<CACHE_STORAGE*>(sStorage.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache_result_t getKey(const char* zdefault_db,
|
||||||
|
const GWBUF* pquery,
|
||||||
|
CACHE_KEY* pkey)
|
||||||
|
{
|
||||||
|
// zdefault_db may be NULL.
|
||||||
|
ss_dassert(pquery);
|
||||||
|
ss_dassert(pkey);
|
||||||
|
|
||||||
|
cache_result_t result = CACHE_RESULT_ERROR;
|
||||||
|
|
||||||
|
MXS_EXCEPTION_GUARD(result = InMemoryStorage::get_key(zdefault_db, pquery, pkey));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void freeInstance(CACHE_STORAGE* pinstance)
|
void freeInstance(CACHE_STORAGE* pinstance)
|
||||||
{
|
{
|
||||||
MXS_EXCEPTION_GUARD(delete reinterpret_cast<InMemoryStorage*>(pinstance));
|
MXS_EXCEPTION_GUARD(delete reinterpret_cast<InMemoryStorage*>(pinstance));
|
||||||
@ -94,25 +109,6 @@ cache_result_t getInfo(CACHE_STORAGE* pStorage,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_result_t getKey(CACHE_STORAGE* pstorage,
|
|
||||||
const char* zdefault_db,
|
|
||||||
const GWBUF* pquery,
|
|
||||||
CACHE_KEY* pkey)
|
|
||||||
{
|
|
||||||
ss_dassert(pstorage);
|
|
||||||
// zdefault_db may be NULL.
|
|
||||||
ss_dassert(pquery);
|
|
||||||
ss_dassert(pkey);
|
|
||||||
|
|
||||||
cache_result_t result = CACHE_RESULT_ERROR;
|
|
||||||
|
|
||||||
MXS_EXCEPTION_GUARD(result = reinterpret_cast<InMemoryStorage*>(pstorage)->get_key(zdefault_db,
|
|
||||||
pquery,
|
|
||||||
pkey));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
cache_result_t getValue(CACHE_STORAGE* pstorage,
|
cache_result_t getValue(CACHE_STORAGE* pstorage,
|
||||||
const CACHE_KEY* pkey,
|
const CACHE_KEY* pkey,
|
||||||
uint32_t flags,
|
uint32_t flags,
|
||||||
@ -221,9 +217,9 @@ CACHE_STORAGE_API* CacheGetStorageAPI()
|
|||||||
{
|
{
|
||||||
initialize,
|
initialize,
|
||||||
createInstance,
|
createInstance,
|
||||||
|
getKey,
|
||||||
freeInstance,
|
freeInstance,
|
||||||
getInfo,
|
getInfo,
|
||||||
getKey,
|
|
||||||
getValue,
|
getValue,
|
||||||
putValue,
|
putValue,
|
||||||
delValue,
|
delValue,
|
||||||
|
|||||||
@ -361,32 +361,8 @@ unique_ptr<RocksDBStorage> RocksDBStorage::Create(const string& storageDirectory
|
|||||||
return sStorage;
|
return sStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_result_t RocksDBStorage::getInfo(uint32_t what, json_t** ppInfo) const
|
// static
|
||||||
{
|
cache_result_t RocksDBStorage::GetKey(const char* zDefaultDB, const GWBUF* pQuery, CACHE_KEY* pKey)
|
||||||
json_t* pInfo = json_object();
|
|
||||||
|
|
||||||
if (pInfo)
|
|
||||||
{
|
|
||||||
auto sStatistics = m_sDb->GetOptions().statistics;
|
|
||||||
|
|
||||||
for_each(rocksdb::TickersNameMap.begin(), rocksdb::TickersNameMap.end(),
|
|
||||||
[pInfo, sStatistics](const std::pair<rocksdb::Tickers, string>& tickerName) {
|
|
||||||
json_t* pValue = json_integer(sStatistics->getTickerCount(tickerName.first));
|
|
||||||
|
|
||||||
if (pValue)
|
|
||||||
{
|
|
||||||
json_object_set(pInfo, tickerName.second.c_str(), pValue);
|
|
||||||
json_decref(pValue);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
*ppInfo = pInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pInfo ? CACHE_RESULT_OK : CACHE_RESULT_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
cache_result_t RocksDBStorage::getKey(const char* zDefaultDB, const GWBUF* pQuery, CACHE_KEY* pKey)
|
|
||||||
{
|
{
|
||||||
ss_dassert(GWBUF_IS_CONTIGUOUS(pQuery));
|
ss_dassert(GWBUF_IS_CONTIGUOUS(pQuery));
|
||||||
|
|
||||||
@ -444,6 +420,31 @@ cache_result_t RocksDBStorage::getKey(const char* zDefaultDB, const GWBUF* pQuer
|
|||||||
return CACHE_RESULT_OK;
|
return CACHE_RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache_result_t RocksDBStorage::getInfo(uint32_t what, json_t** ppInfo) const
|
||||||
|
{
|
||||||
|
json_t* pInfo = json_object();
|
||||||
|
|
||||||
|
if (pInfo)
|
||||||
|
{
|
||||||
|
auto sStatistics = m_sDb->GetOptions().statistics;
|
||||||
|
|
||||||
|
for_each(rocksdb::TickersNameMap.begin(), rocksdb::TickersNameMap.end(),
|
||||||
|
[pInfo, sStatistics](const std::pair<rocksdb::Tickers, string>& tickerName) {
|
||||||
|
json_t* pValue = json_integer(sStatistics->getTickerCount(tickerName.first));
|
||||||
|
|
||||||
|
if (pValue)
|
||||||
|
{
|
||||||
|
json_object_set(pInfo, tickerName.second.c_str(), pValue);
|
||||||
|
json_decref(pValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
*ppInfo = pInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pInfo ? CACHE_RESULT_OK : CACHE_RESULT_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
cache_result_t RocksDBStorage::getValue(const CACHE_KEY* pKey, uint32_t flags, GWBUF** ppResult)
|
cache_result_t RocksDBStorage::getValue(const CACHE_KEY* pKey, uint32_t flags, GWBUF** ppResult)
|
||||||
{
|
{
|
||||||
// Use the root DB so that we get the value *with* the timestamp at the end.
|
// Use the root DB so that we get the value *with* the timestamp at the end.
|
||||||
|
|||||||
@ -28,8 +28,9 @@ public:
|
|||||||
static SRocksDBStorage Create(const char* zName, uint32_t ttl, int argc, char* argv[]);
|
static SRocksDBStorage Create(const char* zName, uint32_t ttl, int argc, char* argv[]);
|
||||||
~RocksDBStorage();
|
~RocksDBStorage();
|
||||||
|
|
||||||
|
static cache_result_t GetKey(const char* zDefaultDB, const GWBUF* pQuery, CACHE_KEY* pKey);
|
||||||
|
|
||||||
cache_result_t getInfo(uint32_t flags, json_t** ppInfo) const;
|
cache_result_t getInfo(uint32_t flags, json_t** ppInfo) const;
|
||||||
cache_result_t getKey(const char* zDefaultDB, const GWBUF* pQuery, CACHE_KEY* pKey);
|
|
||||||
cache_result_t getValue(const CACHE_KEY* pKey, uint32_t flags, GWBUF** ppResult);
|
cache_result_t getValue(const CACHE_KEY* pKey, uint32_t flags, GWBUF** ppResult);
|
||||||
cache_result_t putValue(const CACHE_KEY* pKey, const GWBUF* pValue);
|
cache_result_t putValue(const CACHE_KEY* pKey, const GWBUF* pValue);
|
||||||
cache_result_t delValue(const CACHE_KEY* pKey);
|
cache_result_t delValue(const CACHE_KEY* pKey);
|
||||||
|
|||||||
@ -80,21 +80,17 @@ cache_result_t getInfo(CACHE_STORAGE* pStorage,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_result_t getKey(CACHE_STORAGE* pStorage,
|
cache_result_t getKey(const char* zDefaultDB,
|
||||||
const char* zDefaultDB,
|
|
||||||
const GWBUF* pQuery,
|
const GWBUF* pQuery,
|
||||||
CACHE_KEY* pKey)
|
CACHE_KEY* pKey)
|
||||||
{
|
{
|
||||||
ss_dassert(pStorage);
|
|
||||||
// zDefaultDB may be NULL.
|
// zDefaultDB may be NULL.
|
||||||
ss_dassert(pQuery);
|
ss_dassert(pQuery);
|
||||||
ss_dassert(pKey);
|
ss_dassert(pKey);
|
||||||
|
|
||||||
cache_result_t result = CACHE_RESULT_ERROR;
|
cache_result_t result = CACHE_RESULT_ERROR;
|
||||||
|
|
||||||
MXS_EXCEPTION_GUARD(result = reinterpret_cast<RocksDBStorage*>(pStorage)->getKey(zDefaultDB,
|
MXS_EXCEPTION_GUARD(result = RocksDBStorage::GetKey(zDefaultDB, pQuery, pKey));
|
||||||
pQuery,
|
|
||||||
pKey));
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -206,9 +202,9 @@ CACHE_STORAGE_API* CacheGetStorageAPI()
|
|||||||
{
|
{
|
||||||
initialize,
|
initialize,
|
||||||
createInstance,
|
createInstance,
|
||||||
|
getKey,
|
||||||
freeInstance,
|
freeInstance,
|
||||||
getInfo,
|
getInfo,
|
||||||
getKey,
|
|
||||||
getValue,
|
getValue,
|
||||||
putValue,
|
putValue,
|
||||||
delValue,
|
delValue,
|
||||||
|
|||||||
@ -238,3 +238,11 @@ Storage* StorageFactory::createRawStorage(cache_thread_model_t model,
|
|||||||
|
|
||||||
return pStorage;
|
return pStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache_result_t StorageFactory::get_key(const char* zDefaultDb,
|
||||||
|
const GWBUF* pQuery,
|
||||||
|
CACHE_KEY* pKey) const
|
||||||
|
{
|
||||||
|
return m_pApi->getKey(zDefaultDb, pQuery, pKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
13
server/modules/filter/cache/storagefactory.hh
vendored
13
server/modules/filter/cache/storagefactory.hh
vendored
@ -95,6 +95,19 @@ public:
|
|||||||
uint64_t max_size,
|
uint64_t max_size,
|
||||||
int argc, char* argv[]);
|
int argc, char* argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a key for a GWBUF.
|
||||||
|
*
|
||||||
|
* @param zDefaultDb The default DB or NULL.
|
||||||
|
* @param query An SQL query. Must be one contiguous buffer.
|
||||||
|
* @param pKey Pointer to object where key will be stored.
|
||||||
|
*
|
||||||
|
* @return CACHE_RESULT_OK if a key was created, otherwise some error code.
|
||||||
|
*/
|
||||||
|
cache_result_t get_key(const char* zDefaultDb,
|
||||||
|
const GWBUF* pQuery,
|
||||||
|
CACHE_KEY* pKey) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StorageFactory(void* handle, CACHE_STORAGE_API* pApi, uint32_t capabilities);
|
StorageFactory(void* handle, CACHE_STORAGE_API* pApi, uint32_t capabilities);
|
||||||
|
|
||||||
|
|||||||
2
server/modules/filter/cache/storagereal.cc
vendored
2
server/modules/filter/cache/storagereal.cc
vendored
@ -37,7 +37,7 @@ cache_result_t StorageReal::get_key(const char* zDefaultDb,
|
|||||||
const GWBUF* pQuery,
|
const GWBUF* pQuery,
|
||||||
CACHE_KEY* pKey) const
|
CACHE_KEY* pKey) const
|
||||||
{
|
{
|
||||||
return m_pApi->getKey(m_pStorage, zDefaultDb, pQuery, pKey);
|
return m_pApi->getKey(zDefaultDb, pQuery, pKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_result_t StorageReal::get_value(const CACHE_KEY& key,
|
cache_result_t StorageReal::get_value(const CACHE_KEY& key,
|
||||||
|
|||||||
Reference in New Issue
Block a user