SensitiveDataMasker: replace shared_ptr with MultiVersion

This commit is contained in:
Mikhail Koviazin 2024-01-10 09:21:06 +00:00
parent a83f6be97c
commit 5ef9478a2e
No known key found for this signature in database
GPG Key ID: 0EEAA1BF0787792F
2 changed files with 11 additions and 10 deletions

View File

@ -85,9 +85,9 @@ public:
SensitiveDataMasker::~SensitiveDataMasker() = default;
std::shared_ptr<SensitiveDataMasker> SensitiveDataMasker::sensitive_data_masker = nullptr;
SensitiveDataMasker::MaskerMultiVersion SensitiveDataMasker::sensitive_data_masker{};
void SensitiveDataMasker::setInstance(std::shared_ptr<SensitiveDataMasker> sensitive_data_masker_)
void SensitiveDataMasker::setInstance(std::unique_ptr<SensitiveDataMasker>&& sensitive_data_masker_)
{
if (!sensitive_data_masker_)
@ -95,18 +95,17 @@ void SensitiveDataMasker::setInstance(std::shared_ptr<SensitiveDataMasker> sensi
if (sensitive_data_masker_->rulesCount() > 0)
{
std::atomic_store(&sensitive_data_masker, std::move(sensitive_data_masker_));
sensitive_data_masker.set(std::move(sensitive_data_masker_));
}
else
{
std::atomic_store(&sensitive_data_masker, std::shared_ptr<SensitiveDataMasker>(nullptr));
sensitive_data_masker.set(nullptr);
}
}
std::shared_ptr<SensitiveDataMasker> SensitiveDataMasker::getInstance()
SensitiveDataMasker::MaskerMultiVersion::Version SensitiveDataMasker::getInstance()
{
// TODO: use std::atomic<std::shared_ptr> when compiler supports it
return std::atomic_load(&sensitive_data_masker);
return sensitive_data_masker.get();
}
SensitiveDataMasker::SensitiveDataMasker(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix)

View File

@ -2,6 +2,7 @@
#include <memory>
#include <vector>
#include "Common/MultiVersion.h"
namespace Poco
{
@ -44,7 +45,8 @@ class SensitiveDataMasker
private:
class MaskingRule;
std::vector<std::unique_ptr<MaskingRule>> all_masking_rules;
static std::shared_ptr<SensitiveDataMasker> sensitive_data_masker;
using MaskerMultiVersion = MultiVersion<SensitiveDataMasker>;
static MaskerMultiVersion sensitive_data_masker;
public:
SensitiveDataMasker(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix);
@ -55,8 +57,8 @@ public:
/// setInstance is not thread-safe and should be called once in single-thread mode.
/// https://github.com/ClickHouse/ClickHouse/pull/6810#discussion_r321183367
static void setInstance(std::shared_ptr<SensitiveDataMasker> sensitive_data_masker_);
static std::shared_ptr<SensitiveDataMasker> getInstance();
static void setInstance(std::unique_ptr<SensitiveDataMasker>&& sensitive_data_masker_);
static MaskerMultiVersion::Version getInstance();
/// Used in tests.
void addMaskingRule(const std::string & name, const std::string & regexp_string, const std::string & replacement_string);