diff --git a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h index 3a01dbdc150f90db2b8ad06fb0876d3ec193d919..fb8dc79c18b2df2589432a8758938d4b59eeb313 100644 --- a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h +++ b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h @@ -21,6 +21,7 @@ #include "concurrent_map.h" #include "serializable/serializable.h" +#include "lru_bucket.h" namespace DistributedDB { class KvStoreNbDelegate; } @@ -91,6 +92,36 @@ private: ~MetaDataManager(); API_EXPORT bool GetEntries(const std::string &prefix, std::vector &entries, bool isLocal); + + void DelCacheMeta(const std::string &key, bool isLocal) + { + if (!isLocal) { + return; + } + localdata_.Delete(key); + } + + bool LoadCacheMeta(const std::string &key, Serializable &value, bool isLocal) + { + if (!isLocal) { + return false; + } + std::string data; + if (!localdata_.Get(key, data)) { + return false; + } + Serializable::Unmarshall(data, value); + return true; + } + + void SaveCacheMeta(const std::string &key, const std::string &data, bool isLocal) + { + if (!isLocal) { + return; + } + localdata_.Set(key, data); + } + void StopSA(); bool inited_ = false; @@ -101,6 +132,7 @@ private: Syncer syncer_; CloudSyncer cloudSyncer_; std::string storeId_; + LRUBucket localdata_ {64}; }; } // namespace OHOS::DistributedData -#endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_META_DATA_MANAGER_H \ No newline at end of file +#endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_META_DATA_MANAGER_H diff --git a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp index 50453bfb60d7ec6e0531b6c4bfc8ddd8c34138ec..09bd5c24058a17552d681f4f7596983558403c62 100644 --- a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp +++ b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp @@ -213,6 +213,7 @@ bool MetaDataManager::SaveMeta(const std::string &key, const Serializable &value ZLOGE("failed! status:%{public}d isLocal:%{public}d, key:%{public}s", status, isLocal, Anonymous::Change(key).c_str()); } + DelCacheMeta(key, isLocal); return status == DistributedDB::DBStatus::OK; } @@ -228,6 +229,7 @@ bool MetaDataManager::SaveMeta(const std::vector &values, bool isLocal) entries.reserve(values.size()); for (const auto &[key, value] : values) { entries.push_back({ { key.begin(), key.end() }, { value.begin(), value.end() } }); + DelCacheMeta(key, isLocal); } auto status = isLocal ? metaStore_->PutLocalBatch(entries) : metaStore_->PutBatch(entries); if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { @@ -253,7 +255,9 @@ bool MetaDataManager::LoadMeta(const std::string &key, Serializable &value, bool if (!inited_) { return false; } - + if (LoadCacheMeta(key, value, isLocal)) { + return true; + } DistributedDB::Value data; auto status = isLocal ? metaStore_->GetLocal({ key.begin(), key.end() }, data) : metaStore_->Get({ key.begin(), key.end() }, data); @@ -267,7 +271,9 @@ bool MetaDataManager::LoadMeta(const std::string &key, Serializable &value, bool if (status != DistributedDB::DBStatus::OK) { return false; } - Serializable::Unmarshall({ data.begin(), data.end() }, value); + std::string tempdata(data.begin(), data.end()); + SaveCacheMeta(key, tempdata, isLocal); + Serializable::Unmarshall(tempdata, value); if (isLocal) { data.assign(data.size(), 0); } @@ -302,7 +308,7 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) if (!inited_) { return false; } - + DelCacheMeta(key, isLocal); auto status = isLocal ? metaStore_->DeleteLocal({ key.begin(), key.end() }) : metaStore_->Delete({ key.begin(), key.end() }); if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { @@ -333,6 +339,7 @@ bool MetaDataManager::DelMeta(const std::vector &keys, bool isLocal dbKeys.reserve(keys.size()); for (auto &key : keys) { dbKeys.emplace_back(key.begin(), key.end()); + DelCacheMeta(key, isLocal); } auto status = isLocal ? metaStore_->DeleteLocalBatch(dbKeys) : metaStore_->DeleteBatch(dbKeys); if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) {