diff --git a/include/rocksdb/utilities/object_registry.h b/include/rocksdb/utilities/object_registry.h index 5a454d775..946a26705 100644 --- a/include/rocksdb/utilities/object_registry.h +++ b/include/rocksdb/utilities/object_registry.h @@ -9,10 +9,12 @@ #include #include +#include #include #include #include #include + #include "rocksdb/status.h" namespace ROCKSDB_NAMESPACE { @@ -109,6 +111,8 @@ class ObjectLibrary { // Adds the input entry to the list for the given type void AddEntry(const std::string& type, std::unique_ptr& entry); + // Protects the entry map + mutable std::mutex mu_; // ** FactoryFunctions for this loader, organized by type std::unordered_map>> entries_; diff --git a/utilities/object_registry.cc b/utilities/object_registry.cc index d74d37d17..79e4b5683 100644 --- a/utilities/object_registry.cc +++ b/utilities/object_registry.cc @@ -15,6 +15,7 @@ namespace ROCKSDB_NAMESPACE { // Otherwise, nullptr is returned const ObjectLibrary::Entry *ObjectLibrary::FindEntry( const std::string &type, const std::string &name) const { + std::unique_lock lock(mu_); auto entries = entries_.find(type); if (entries != entries_.end()) { for (const auto &entry : entries->second) { @@ -28,11 +29,13 @@ const ObjectLibrary::Entry *ObjectLibrary::FindEntry( void ObjectLibrary::AddEntry(const std::string &type, std::unique_ptr &entry) { + std::unique_lock lock(mu_); auto &entries = entries_[type]; entries.emplace_back(std::move(entry)); } size_t ObjectLibrary::GetFactoryCount(size_t *types) const { + std::unique_lock lock(mu_); *types = entries_.size(); size_t factories = 0; for (const auto &e : entries_) { @@ -42,6 +45,7 @@ size_t ObjectLibrary::GetFactoryCount(size_t *types) const { } void ObjectLibrary::Dump(Logger *logger) const { + std::unique_lock lock(mu_); for (const auto &iter : entries_) { ROCKS_LOG_HEADER(logger, " Registered factories for type[%s] ", iter.first.c_str());