lru增加锁,增加读写dfx

Signed-off-by: zhangrn98 <zhangrunan3@huawei.com>
This commit is contained in:
zhangrn98
2026-03-19 16:57:24 +08:00
parent 1056cbf0f0
commit 1c2b2c29b0
6 changed files with 47 additions and 25 deletions
@@ -83,13 +83,14 @@ bool AppDetailsRdbDataMgr::ExecWithTrans(TransCallback cb)
}
bool AppDetailsRdbDataMgr::QueryDataByDomain(
const std::string& tableName, const std::string &domain, std::vector<AppDetailsRdbItem> &itemVec)
const std::string& tableName, const std::string& domain, std::vector<AppDetailsRdbItem>& itemVec)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call.");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] QueryDataByDomain.");
NativeRdb::AbsRdbPredicates absRdbPred(tableName);
absRdbPred.EqualTo(DETAILS_DOMAIN, domain);
std::vector<std::string> columns = {};
RdbForEachRetCb eachCb = [&itemVec](std::shared_ptr<AbsSharedResultSet> retSet)->bool {
RdbForEachRetCb eachCb = [&itemVec](std::shared_ptr<AbsSharedResultSet> retSet) -> bool {
AppDetailsRdbItem item;
if (!item.GetRdbItem(retSet)) {
return false;
@@ -129,6 +130,7 @@ void AppDetailsRdbDataMgr::PostDelayCloseTask(int32_t delayTime)
bool AppDetailsRdbDataMgr::InsertDataBatch(const std::string& tableName, std::vector<AppDetailsRdbItem>& infoVec)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] InsertDataBatch.");
auto rdbStore = GetRdbStore();
if (!rdbStore) {
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "get rdbStore fail.");
@@ -169,9 +171,10 @@ bool AppDetailsRdbDataMgr::CreateMetaData()
return true;
};
bool AppDetailsRdbDataMgr::UpdateMetaData(std::vector<MetaItem> &itemVec)
bool AppDetailsRdbDataMgr::UpdateMetaData(std::vector<MetaItem>& itemVec)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] UpdateMetaData.");
auto rdbStore = GetRdbStore();
if (!rdbStore) {
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "get rdbStore fail.");
@@ -191,9 +194,10 @@ bool AppDetailsRdbDataMgr::UpdateMetaData(std::vector<MetaItem> &itemVec)
return true;
};
bool AppDetailsRdbDataMgr::QueryMetaData(const std::string &tableName, MetaItem &info)
bool AppDetailsRdbDataMgr::QueryMetaData(const std::string& tableName, MetaItem& info)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call.");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] QueryMetaData.");
NativeRdb::AbsRdbPredicates absRdbPred(META_DATA);
absRdbPred.EqualTo(META_TABLE_NAME, tableName);
std::vector<std::string> columns = {};
@@ -203,7 +207,7 @@ bool AppDetailsRdbDataMgr::QueryMetaData(const std::string &tableName, MetaItem
return false;
}
std::vector<MetaItem> itemVec;
RdbForEachRetCb eachCb = [&itemVec](std::shared_ptr<AbsSharedResultSet> retSet)->bool {
RdbForEachRetCb eachCb = [&itemVec](std::shared_ptr<AbsSharedResultSet> retSet) -> bool {
MetaItem item;
if (!item.GetRdbItem(retSet)) {
return false;
@@ -218,7 +222,7 @@ bool AppDetailsRdbDataMgr::QueryMetaData(const std::string &tableName, MetaItem
return false;
};
bool AppDetailsRdbDataMgr::CreateTable(const std::string &tableName)
bool AppDetailsRdbDataMgr::CreateTable(const std::string& tableName)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
std::string sql = "CREATE TABLE IF NOT EXISTS " + tableName
@@ -262,7 +266,7 @@ bool AppDetailsRdbDataMgr::CreateRegularIndex(const std::string& tableName, cons
return true;
};
bool AppDetailsRdbDataMgr::DeleteTable(const std::string &tableName)
bool AppDetailsRdbDataMgr::DeleteTable(const std::string& tableName)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "Called");
std::string sql = "DROP TABLE IF EXISTS " + tableName + ";";
@@ -295,7 +299,7 @@ std::string AppDetailsRdbDataMgr::GetDbVersion()
return "";
};
bool AppDetailsRdbDataMgr::RenameTable(const std::string &oldName, const std::string &newName)
bool AppDetailsRdbDataMgr::RenameTable(const std::string& oldName, const std::string& newName)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
std::string sql = "ALTER TABLE " + oldName + " RENAME TO " + newName + ";";
@@ -349,6 +353,7 @@ bool AppDetailsRdbDataMgr::Query(const NativeRdb::AbsRdbPredicates& predicates,
const std::vector<std::string>& columns, RdbForEachRetCb cb)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] Query.");
auto rdbStore = GetRdbStore();
if (!rdbStore) {
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdb store is null");
@@ -359,10 +364,8 @@ bool AppDetailsRdbDataMgr::Query(const NativeRdb::AbsRdbPredicates& predicates,
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbStore query absSharedResultSet failed");
return false;
}
auto guard = std::unique_ptr<void, std::function<void(void*)>>(nullptr,
[&](void*) {
absSharedResultSet->Close();
});
auto guard = std::unique_ptr<void, std::function<void(void*)>>(
nullptr, [&](void*) { absSharedResultSet->Close(); });
if (!absSharedResultSet->HasBlock()) {
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "absSharedResultSet has no block");
return false;
@@ -38,6 +38,7 @@ private:
std::atomic<size_t> maxCap_ = 10;
std::list<std::pair<K, V>> cache_;
std::unordered_map<K, typename std::list<std::pair<K, V>>::iterator> lruMap_;
std::mutex mutex_;
};
template<typename K, typename V>
@@ -49,6 +50,7 @@ bool LruCacheUtil<K, V>::SetMaxCap(size_t cap)
template<typename K, typename V>
bool LruCacheUtil<K, V>::Get(const K& key, V& value)
{
std::lock_guard<std::mutex> lock(mutex_);
if (lruMap_.find(key) == lruMap_.end()) {
return false;
}
@@ -62,6 +64,7 @@ bool LruCacheUtil<K, V>::Get(const K& key, V& value)
template<typename K, typename V>
void LruCacheUtil<K, V>::Put(const K& key, const V& value)
{
std::lock_guard<std::mutex> lock(mutex_);
auto iter = lruMap_.find(key);
if (iter != lruMap_.end()) {
V val = lruMap_[key]->second;
@@ -82,6 +85,7 @@ void LruCacheUtil<K, V>::Put(const K& key, const V& value)
template<typename K, typename V>
void LruCacheUtil<K, V>::Clear()
{
std::lock_guard<std::mutex> lock(mutex_);
cache_.clear();
lruMap_.clear();
};
@@ -89,6 +93,7 @@ void LruCacheUtil<K, V>::Clear()
template<typename K, typename V>
bool LruCacheUtil<K, V>::IsEmpty()
{
std::lock_guard<std::mutex> lock(mutex_);
return lruMap_.empty();
};
}
@@ -39,6 +39,8 @@ WhiteListConfigMgr::~WhiteListConfigMgr()
}
void WhiteListConfigMgr::LoadDefault()
{
APP_DOMAIN_VERIFY_HILOGI(
APP_DOMAIN_VERIFY_MODULE_COMMON, "[AppDomainVerifyIO] operation:read default whitelist");
preferences_ = GetPreference(DEFAULT_WHITE_LIST_PRE_PATH);
if (preferences_ == nullptr) {
UNIVERSAL_ERROR_EVENT(READ_DEFAULT_WHITE_LIST_FAULT);
@@ -54,6 +56,8 @@ void WhiteListConfigMgr::LoadDefault()
}
void WhiteListConfigMgr::LoadDynamic()
{
APP_DOMAIN_VERIFY_HILOGI(
APP_DOMAIN_VERIFY_MODULE_COMMON, "[AppDomainVerifyIO] operation:read dynamic whitelist");
preferences_ = GetPreference(DYNAMIC_WHITE_LIST_PRE_PATH);
if (preferences_ == nullptr) {
UNIVERSAL_ERROR_EVENT(READ_DYNAMIC_WHITE_LIST_FAULT);
@@ -107,6 +111,8 @@ std::shared_ptr<NativePreferences::Preferences> WhiteListConfigMgr::GetPreferenc
}
bool WhiteListConfigMgr::Save()
{
APP_DOMAIN_VERIFY_HILOGI(
APP_DOMAIN_VERIFY_MODULE_COMMON, "[AppDomainVerifyIO] operation:write dynamic whitelist");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MODULE_COMMON, "called");
if (preferences_ == nullptr) {
APP_DOMAIN_VERIFY_HILOGW(APP_DOMAIN_VERIFY_MODULE_COMMON, "preferences null");
@@ -37,6 +37,7 @@ public:
AppDetailsDataMgr();
virtual ~AppDetailsDataMgr();
int QueryAppDetailsWant(const std::string& url, AAFwk::Want& want, std::string& bundleName);
private:
bool QueryAppDetailsWantByCache(const std::string& url, std::string& bundleName);
bool QueryAppDetailsWantByRdb(const std::string& url, std::string& bundleName);
@@ -44,8 +45,9 @@ private:
std::shared_ptr<LruCacheUtil<std::string, std::string>> lruCache_;
std::shared_ptr<AppDetailsRdbDataMgr> rdbMgr_;
std::shared_ptr<AppDetailsFilter> detailsFilter_;
int64_t cacheBeginTime_ = 0;
std::mutex agWantUrlMutex;
int64_t cacheBeginTime_{0};
std::mutex cacheMutex_;
std::mutex agWantUrlMutex_;
std::string agWantUrl_;
};
} // namespace AppDomainVerify
@@ -41,7 +41,7 @@ AppDetailsDataMgr::AppDetailsDataMgr()
rdbMgr_ = std::make_shared<AppDetailsRdbDataMgr>(false);
};
AppDetailsDataMgr::~AppDetailsDataMgr(){};
AppDetailsDataMgr::~AppDetailsDataMgr() {};
int AppDetailsDataMgr::QueryAppDetailsWant(const std::string& url, AAFwk::Want& want, std::string& bundleName)
{
@@ -68,15 +68,18 @@ bool AppDetailsDataMgr::QueryAppDetailsWantByCache(const std::string& url, std::
{
int64_t currTime =
std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now()).time_since_epoch().count();
if (currTime - cacheBeginTime_ > CACHE_TIME_S) {
cacheBeginTime_ = currTime;
lruCache_->Clear();
return false;
}
std::string value;
if (lruCache_->Get(url, value)) {
bundleName = value;
return true;
{
std::lock_guard<std::mutex> lock(cacheMutex_);
if (currTime - cacheBeginTime_ > CACHE_TIME_S) {
cacheBeginTime_ = currTime;
lruCache_->Clear();
return false;
}
std::string value;
if (lruCache_->Get(url, value)) {
bundleName = value;
return true;
}
}
return false;
};
@@ -118,7 +121,7 @@ bool AppDetailsDataMgr::QueryAppDetailsWantByRdb(const std::string& url, std::st
void AppDetailsDataMgr::AddInfoToWant(AAFwk::Want& want, const std::string& bundleName)
{
{
std::lock_guard<std::mutex> lock(agWantUrlMutex);
std::lock_guard<std::mutex> lock(agWantUrlMutex_);
if (agWantUrl_.empty()) {
MetaItem info;
rdbMgr_->QueryMetaData(APP_DETAILS_TABLE, info);
@@ -64,6 +64,7 @@ AppDomainVerifyRdbDataManager::~AppDomainVerifyRdbDataManager()
bool AppDomainVerifyRdbDataManager::InsertData(const RdbDataItem& rdbDataItem)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] InsertData.");
auto rdbStore = GetRdbStore();
if (!CheckRdbStoreExist(rdbStore)) {
return false;
@@ -108,6 +109,7 @@ bool AppDomainVerifyRdbDataManager::Query(const NativeRdb::AbsRdbPredicates& pre
if (!CheckRdbStoreExist(rdbStore)) {
return false;
}
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] Query.");
auto absSharedResultSet = rdbStore->Query(predicates, columns);
if (absSharedResultSet == nullptr) {
APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbStore query absSharedResultSet failed");
@@ -142,6 +144,7 @@ bool AppDomainVerifyRdbDataManager::Query(const NativeRdb::AbsRdbPredicates& pre
bool AppDomainVerifyRdbDataManager::DeleteData(const std::string& bundleName)
{
APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "[AppDomainVerifyIO] DeleteData.");
auto rdbStore = GetRdbStore();
if (!CheckRdbStoreExist(rdbStore)) {
return false;