X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fasyncstorageimpl.cpp;h=d9478c2a3766949fc5effd13fa8ba899cbcbd9bf;hb=e94862b3c75c10a1de57ebdb8cf9e9e2567560eb;hp=31ac713d998ee4785b7051e5ced4aa447bd91050;hpb=a0745d294dcd72f7d78ea4c3accd3b477dd668a5;p=ric-plt%2Fsdl.git diff --git a/src/asyncstorageimpl.cpp b/src/asyncstorageimpl.cpp index 31ac713..d9478c2 100644 --- a/src/asyncstorageimpl.cpp +++ b/src/asyncstorageimpl.cpp @@ -31,20 +31,38 @@ #include "private/redis/asyncredisstorage.hpp" #endif +#include +#include + using namespace shareddatalayer; using namespace shareddatalayer::redis; namespace { std::shared_ptr asyncDatabaseDiscoveryCreator(std::shared_ptr engine, + const std::string& ns, const DatabaseConfiguration& databaseConfiguration, + const boost::optional& addressIndex, std::shared_ptr logger) { return AsyncDatabaseDiscovery::create(engine, - boost::none, + ns, databaseConfiguration, + addressIndex, logger); } + + std::uint32_t crc32(const std::string& s) + { + boost::crc_32_type result; + result.process_bytes(s.data(), s.size()); + return result.checksum(); + } + + std::uint32_t getClusterHashIndex(const std::string& s, const size_t count) + { + return crc32(s)%count; + } } AsyncStorageImpl::AsyncStorageImpl(std::shared_ptr engine, @@ -78,19 +96,40 @@ AsyncStorageImpl::AsyncStorageImpl(std::shared_ptr engine, { } -AsyncStorage& AsyncStorageImpl::getRedisHandler() +void AsyncStorageImpl::setAsyncRedisStorageHandlers(const std::string& ns) +{ + for (std::size_t i = 0; i < databaseConfiguration->getServerAddresses().size(); i++) + { + auto redisHandler = std::make_shared(engine, + asyncDatabaseDiscoveryCreator( + engine, + ns, + std::ref(*databaseConfiguration), + i, + logger), + publisherId, + namespaceConfigurations, + logger); + asyncStorages.push_back(redisHandler); + } +} + +AsyncStorage& AsyncStorageImpl::getAsyncRedisStorageHandler(const std::string& ns) +{ + std::size_t handlerIndex{0}; + if (DatabaseConfiguration::DbType::SDL_CLUSTER == databaseConfiguration->getDbType()) + handlerIndex = getClusterHashIndex(ns, databaseConfiguration->getServerAddresses().size()); + return *asyncStorages.at(handlerIndex); +} + +AsyncStorage& AsyncStorageImpl::getRedisHandler(const std::string& ns) { #if HAVE_REDIS - static AsyncRedisStorage redisHandler{engine, - asyncDatabaseDiscoveryCreator( - engine, - std::ref(*databaseConfiguration), - logger), - publisherId, - namespaceConfigurations, - logger}; - - return redisHandler; + auto serverAddresses(databaseConfiguration->getServerAddresses()); + if (asyncStorages.empty()) + setAsyncRedisStorageHandlers(ns); + + return getAsyncRedisStorageHandler(ns); #else logger->error() << "Redis operations cannot be performed, Redis not enabled"; SHAREDDATALAYER_ABORT("Invalid configuration."); @@ -106,7 +145,7 @@ AsyncStorage& AsyncStorageImpl::getDummyHandler() AsyncStorage& AsyncStorageImpl::getOperationHandler(const std::string& ns) { if (namespaceConfigurations->isDbBackendUseEnabled(ns)) - return getRedisHandler(); + return getRedisHandler(ns); return getDummyHandler(); }