Skip to content

Commit fc64e3a

Browse files
authored
[dbconnector] protect db information with mutex (#423)
* [dbconnectgor] protect db information with mutex STL containers are only thread safe for reads. But not for writes. protect the db information variables with recursive mutex. Signed-off-by: Ying Xie <[email protected]>
1 parent e8a03de commit fc64e3a

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

common/dbconnector.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ void SonicDBConfig::initializeGlobalConfig(const string &file)
7474
std::unordered_map<std::string, SonicDBInfo> db_entry;
7575
std::unordered_map<std::string, RedisInstInfo> inst_entry;
7676
std::unordered_map<int, std::string> separator_entry;
77+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
7778

7879
SWSS_LOG_ENTER();
7980

@@ -155,6 +156,7 @@ void SonicDBConfig::initializeGlobalConfig(const string &file)
155156
SWSS_LOG_ERROR("Sonic database config global file doesn't exist at %s\n", file.c_str());
156157
}
157158

159+
158160
// Set it as the global config file is already parsed and init done.
159161
m_global_init = true;
160162
}
@@ -164,6 +166,7 @@ void SonicDBConfig::initialize(const string &file)
164166
std::unordered_map<std::string, SonicDBInfo> db_entry;
165167
std::unordered_map<std::string, RedisInstInfo> inst_entry;
166168
std::unordered_map<int, std::string> separator_entry;
169+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
167170

168171
SWSS_LOG_ENTER();
169172

@@ -184,6 +187,8 @@ void SonicDBConfig::initialize(const string &file)
184187

185188
void SonicDBConfig::validateNamespace(const string &netns)
186189
{
190+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
191+
187192
SWSS_LOG_ENTER();
188193

189194
// With valid namespace input and database_global.json is not loaded, ask user to initializeGlobalConfig first
@@ -206,6 +211,8 @@ void SonicDBConfig::validateNamespace(const string &netns)
206211

207212
SonicDBInfo& SonicDBConfig::getDbInfo(const std::string &dbName, const std::string &netns)
208213
{
214+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
215+
209216
SWSS_LOG_ENTER();
210217

211218
if (!m_init)
@@ -238,6 +245,8 @@ SonicDBInfo& SonicDBConfig::getDbInfo(const std::string &dbName, const std::stri
238245

239246
RedisInstInfo& SonicDBConfig::getRedisInfo(const std::string &dbName, const std::string &netns)
240247
{
248+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
249+
241250
SWSS_LOG_ENTER();
242251

243252
if (!m_init)
@@ -285,6 +294,8 @@ string SonicDBConfig::getSeparator(const string &dbName, const string &netns)
285294

286295
string SonicDBConfig::getSeparator(int dbId, const string &netns)
287296
{
297+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
298+
288299
if (!m_init)
289300
initialize(DEFAULT_SONIC_DB_CONFIG_FILE);
290301

@@ -350,6 +361,7 @@ int SonicDBConfig::getDbPort(const string &dbName, const string &netns)
350361
vector<string> SonicDBConfig::getNamespaces()
351362
{
352363
vector<string> list;
364+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
353365

354366
if (!m_global_init)
355367
initializeGlobalConfig();
@@ -365,6 +377,7 @@ vector<string> SonicDBConfig::getNamespaces()
365377

366378
std::vector<std::string> SonicDBConfig::getDbList(const std::string &netns)
367379
{
380+
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
368381
if (!m_init)
369382
{
370383
initialize();
@@ -381,6 +394,7 @@ std::vector<std::string> SonicDBConfig::getDbList(const std::string &netns)
381394

382395
constexpr const char *SonicDBConfig::DEFAULT_SONIC_DB_CONFIG_FILE;
383396
constexpr const char *SonicDBConfig::DEFAULT_SONIC_DB_GLOBAL_CONFIG_FILE;
397+
std::recursive_mutex SonicDBConfig::m_db_info_mutex;
384398
unordered_map<string, unordered_map<string, RedisInstInfo>> SonicDBConfig::m_inst_info;
385399
unordered_map<string, unordered_map<string, SonicDBInfo>> SonicDBConfig::m_db_info;
386400
unordered_map<string, unordered_map<int, string>> SonicDBConfig::m_db_separator;

common/dbconnector.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <unordered_map>
77
#include <utility>
88
#include <memory>
9+
#include <mutex>
910

1011
#include <hiredis/hiredis.h>
1112
#include "rediscommand.h"
@@ -64,6 +65,7 @@ class SonicDBConfig
6465
static bool isGlobalInit() { return m_global_init; };
6566

6667
private:
68+
static std::recursive_mutex m_db_info_mutex;
6769
// { namespace { instName, { unix_socket_path, hostname, port } } }
6870
static std::unordered_map<std::string, std::unordered_map<std::string, RedisInstInfo>> m_inst_info;
6971
// { namespace, { dbName, {instName, dbId, separator} } }

0 commit comments

Comments
 (0)