目录
1.Per架构
2.Per初始化
3.Per错误处理
4.多进程访问
5.冗余存储
6.安装和更新per数据
7. Key-Value 方式
8. file storage 方式
9.典型使用代码
Persistency模块对比 CP 中的nvm模块,以下简称per。
1.Per架构
两种方式访问存储内存,包括键值对方式,以及文件存储方式;
在manifest中定义好,PersistencyKeyValueStorageInterface 和 PersistencyFileStorageInterface 以及部署信息 PersistencyKeyValueStorage 和 PersistencyFileStorage。
每个key-value, 通过应用设计 的 port口,定义在 PersistencyKeyValueStorageInterface,同样对于file storage 一样,对应的是PersistencyFileStorageInterface 。
2.Per初始化
初始化,调用 ara::core::Initialize ,当初始化调用了,文件同步到内存,键值准备好,所有的访问结构都准备好。
3.Per错误处理
出错时,定义的ara::per::PerErrc故障码通过 ara::core::Result 获取;
故障码创建:ara::per::MakeErrorCode.
故障码获取: ara::per::GetPerDomain
4.多进程访问
每个Per data 仅仅属于一个进程,但提供 同一个进程下 多线程的访问。
因为针对键值方式 ara::per::KeyValueStorage::GetValue 和ara::per::KeyValueStorage::SetValue 等接口是原子型操作。
但是对于file storage方式,则无法支持多线程访问,因为同步读和写无法做到。
5.冗余存储
主要考虑安全以及防止数据丢失,具体措施是在 PersistencyDeployment.redundancyHandling 配置。每当访问时,会进行检查,如果损坏则应尝试从可用的存储块中进行恢复。
6.安装和更新per数据
主要考虑以下场景,
- 安装新的软件
- 更新已存在的软件
- 完成软件更新
- 更新失败,回滚软件
- 移除安装的软件
应用模块应在验证阶段,显示调用ara::per::UpdatePersistency 。此时Per会比较manifest版本,以做出必要的措施。
具体包括:
- 已存在的数据,保持不变,根据部署和设计需要
- 已存在的数据进行替换,根据部署和设计需要
- 已存储的数据进行移除,根据部署和设计需要
- 新增已增加的数据,根据部署和设计需要
具体定义到 PersistencyDeploymentElement.updateStrategy 和 PersistencyInterfaceElement.updateStrategy
per会 创建一个新的 key-value 或 file storage 根据新的安装软件的manifest要求。
per会 比较 manifest的版本,当版本更高时,则会更新对应的per data。
当更新失败,需要回滚时,per会根据backup数据,找到对应的manifest版本进行恢复;
per不会自己移除自己的数据,UCM模块应根据manifest,获取per data 并删除它。
7. Key-Value 方式
访问时,打开 ara::per::OpenKeyValueStorage;
更新数据到内存,ara::per::KeyValueStorage::SyncToStorage
reset 上一次存储,ara::per::KeyValueStorage::DiscardPendingChanges
获取value,ara::per::KeyValueStorage::GetValue
写入value,ara::per::KeyValueStorage::SetValue
移除key-value, ara::per::KeyValueStorage::RemoveKey
清空key-value,ara::per::KeyValueStorage::RemoveAllKey
8. file storage 方式
访问时,打开 ara::per::OpenFileStorage
文件是否存储,ara::per::FileStorage::FileExists 或 ara::per::FileStorage::GetAllFileNames;
创建新文件,ara::per::FileStorage::OpenFileReadWrite 或ara::per::FileStorage::OpenFileWriteOnly;
删除文件,ara::per::FileStorage::DeleteFile;
同步到存储文件,ara::per::ReadWriteAccessor::SyncToFile
获取当前文件访问位置,ara::per::ReadAccessor::GetPosition 类似 linux seek
获取文件大小,ara::per::ReadAccessor::GetSize
获取当前文件位置内容,ara::per::ReadAccessor::ReadText
获取行内容,ara::per::ReadAccessor::ReadLine
写入内容,ara::per::ReadWriteAccessor::WriteText
写入二进制,ara::per:-:ReadWriteAccessor::WriteBinary
获取文件信息,ara::per::FileStorage::GetFileInfo,类似 linux ls
9.典型使用代码
#include <chrono>
#include <thread>
#include <ara/log/logging.h>
#include <ara/per/file_storage.h>
#include <ara/per/key_value_storage.h>
#include <execution_client.h>
using namespace ara::core;
using namespace ara::per;
/*注意,需在对应 interface 和manifest中定义好*/
const ara::core::String NameData("DATA_R_PORT");
const ara::core::String NameFile("FILE_R_PORT");
const ara::core::String file_name("per.log");
void Write2Data(const ara::core::String data_name,
const ara::core::String key,
const ara::core::String value)
{
InstanceSpecifier instSpec(data_name);
auto kvsh = OpenKeyValueStorage(instSpec);
auto kvs = std::move(kvsh.Value());
kvs->RemoveAllKeys();
auto result = kvs->SetValue(key,value);
kvs->SyncToStorage();
}
int main(int argc,char *argv[])
{
ara::exec::ExecutionClient exeClient;
exeClient.ReportExecutionState(ara::exec::ExecutionState::kRunning);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
Write2Data(NameData,"test_key","test_value");
exeClient.ReportExecutionState(ara::exec::ExecutionState::kTerminating);
return EXIT_SUCCESS;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)