FileStore omap的实现
目录
一 引言
二 omap实现
三 omap寻址
四 omap属性设置
五 header ->seq的由来
一 引言
ceph分布式存储中在本地存储方面采用插件模式,支持filestore、bluestore、memstore等存储引擎。FileStore承载着数据的存储,除了要将数据写入本地文件系统外,还需要存储部分数据的属性信息,少量的元数据信息存储在文件系统的xattr中,还有一些属性信息需要存储在kv db中,我们称这些信息为object map,简称omap
二 omap实现
上图是omap的静态类图,类ObjectMap定义omap的抽象接口。KeyValueDB主要有三类,由于时间原因各版本采用的kv db并不完全一致,hammer版本采用level db,l版采用rocksdb来存储kv。
omap以key-value的形式存在,如何定义这里的key值?
最简单的设计是采用object id+xattr 作为key值,由于object id的唯一性,采用这种方式存储key值,可形成简单形象的key值。这种方式的主要弊端是当一个对象有多个KV值时, Object的name多次作为key存储, 由于Object的name一般比较长, 这样存储方式浪费空间比较大。FileStore将key值的生成分为两步,第一步根据object id生成seq,然后利用seq+xattr作为对象属性的key值,生成一个header值;第二步,根据header里的seq以及具体对应规则,生成omap值
1)
key:HOBJECT_TO_SEQ+ghobject_key(oid)
value:header
HOBJECT_TO_SEQ是一个固定的前缀标识字符串,函数ghobject_key根据oid获取对象的key字符串。
struct _Header {
uint64_t seq; //header在leveldb中的seq序号
uint64_t parent;//父对象的序号
uint64_t num_children;//子对象数量
ghobject_t oid;//对象标识
SequencerPosition spos;
}
2)对象的属性保存为key-value pair:
key: USER_PREFIX + header_key(header->seq) + XATTR_PREFIX +key
value: omap值
三 omap寻址
如果需要获取某个对象的属性值,需要进行以下过程:
- 根据对象object id获取HOBJECT_TO_SEQ+ghobject_key(oid),根据此key值获取对应的header;
- 根据对应的header中的seq值,获取leveldb中USER_PREFIX + header_key(header->seq) + XATTR_PREFIX +key对应value值
DBobjectmap.cc:
int DBObjectMap::get_xattrs(const ghobject_t &oid,
const set<string> &to_get,
map<string, bufferlist> *out)
{
MapHeaderLock hl(this, oid);//为对应的iod header加锁
Header header = lookup_map_header(hl, oid);//查找oid对应的header
if (!header)
return -ENOENT;
return db->get(xattr_prefix(header), to_get, out);//根据查找出的header值生成前缀,然后根据规则取出对应的omap值
}
四 omap属性设置
DBObjectMap.cc:
const string DBObjectMap::USER_PREFIX = "_USER_";
const string DBObjectMap::XATTR_PREFIX = "_AXATTR_";
const string DBObjectMap::SYS_PREFIX = "_SYS_";
const string DBObjectMap::COMPLETE_PREFIX = "_COMPLETE_";
const string DBObjectMap::HEADER_KEY = "HEADER";
const string DBObjectMap::USER_HEADER_KEY = "USER_HEADER";
const string DBObjectMap::GLOBAL_STATE_KEY = "HEADER";
const string DBObjectMap::HOBJECT_TO_SEQ = "_HOBJTOSEQ_";string DBObjectMap::header_key(uint64_t seq)
{
char buf[100];
snprintf(buf, sizeof(buf), "%.*" PRId64, (int)(2*sizeof(seq)), seq);
return string(buf);
}string DBObjectMap::xattr_prefix(Header header)
{
return USER_PREFIX + header_key(header->seq) + XATTR_PREFIX;
}int DBObjectMap::set_xattrs(const ghobject_t &oid,
const map<string, bufferlist> &to_set,
const SequencerPosition *spos)
{
KeyValueDB::Transaction t = db->get_transaction();
MapHeaderLock hl(this, oid);
Header header = lookup_create_map_header(hl, oid, t);//有则改之,无则创建
if (!header)
return -EINVAL;
if (check_spos(oid, header, spos))
return 0;
t->set(xattr_prefix(header), to_set);//根据header中seq值,设置属性
return db->submit_transaction(t);
}
五 header ->seq的由来
leveldb中无论是get_xattrs还是set_xattrs,起到核心作用的均是seq这个值。seq如何生成?
查找代码发现,leveldb中另外还存放一个global的key-value pair:
key: SYS_PREFIX + GLOBAL_STATE_KEY
value:state
/// persistent state for store @see generate_header
struct State {
static const __u8 CUR_VERSION = 3;
__u8 v;
uint64_t seq;
// legacy is false when complete regions never used
bool legacy;
State() : v(0), seq(1), legacy(false) {}
explicit State(uint64_t seq) : v(0), seq(seq), legacy(false) {}
该结构体负责管理seq,当有新的header生成,seq保持单调递增,写入leveldb中。
FileStore omap的实现相关推荐
- Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题.在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架.这对于许多TI的芯片都是通用的,这次看AM335X的代码顺 ...
- OMAP开发板的启动过程
OMAP的启动过程 参考文档:http://www.omappedia.org/wiki/Bootloader_Project#u-boot_overview OMAP平台的启动初始化过程(bootl ...
- omap android,德州仪器基于Android 移动平台演示OMAP
2009 年 2 月 18 日,德州仪器 (TI) 在本周世界移动通信大会 上展示运行于 TI 新推出的 OMAP 3 移动开发平台上的最新 Android 移动平台.TI 在展会中演示 Andro ...
- 安卓 体验linux mux,Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
对于许多TI的芯片来说,引脚复用的配置是在Control Module(配置模块)的寄存器里配置的,(这个和三星的CPU有点不同,三星的一般在GPIO的寄存器中配置).所以当你需要配置这些寄存器的时候 ...
- OMAP 3 图像信号处理器 (ISP) 驱动
V4L2 驱动框架概览 OMAP 3 图像信号处理器 (ISP) 驱动 Chinese translated version of Documentation/video4linux/omap3isp ...
- linux 电源管理源码分析,Linux 3.8.1 电源管理之OMAP Voltage Domain分析
本系列文章将分析Linux对于OMAP的电源管理功能,以AM33XX作为实例(目前的硬件平台先主要关注AM335xStarterKit开发板),在必要时穿插其他相关内容. 在linux-3.8.1/a ...
- TI OMAP平台BSP学习笔记之 - LCD 驱动(3)
通过前面两个系列的学习,我们已经了解DSS系统,LCD基本原理,DSS设备树的配置等基本知识.本文简单学习和梳理LCD设备驱动的代码,方便项目中快速bring up和debug. 此系列文章基于TI的 ...
- DAVINCI和OMAP架构的区别
在 2002 年的第 4 季時,我以TI 公司的 OMAP(Open Mobile Application Processor,開放式行動應用處理器)平台進行了一項實做計畫,並採用了Innovator ...
- 触摸屏显示接口设计-用于便携式热像仪的OMAP双核处理器
引言 近年来以美国苹果公司iPad.iPhone为代表的新一代IT产品在世界市场掀去了疯狂的购买热潮,其方便快捷的触摸屏操作模式不仅使人们充分感受到兴手拾来"信息"的快感,更代表了 ...
最新文章
- mkdir、rmdir命令、head、tail命令
- Java高并发程序设计学习笔记(十一):Jetty分析
- 3说明书_电子产品说明书应该怎么翻译?知行君认为需要注意这3点
- Office资源汇 | Office 365 微助理功能介绍 4
- vrrp路由器三种状态_VRRP技术详解和实战演练
- android中的BitMap(二)从网络和资源文件中获得一个BitMap
- [SSH] 传输文件
- 9. 设计二个函数分别计算sinx和cosx_Excel技巧篇(一):超级好用的几个函数
- java异常处理中的返回值
- 洛谷P1427 小鱼的数字游戏
- linux 杂项设备,浅谈 MISC杂项设备
- scala面向对象总结
- 成年人改名字要哪些步骤和手续?
- python游戏联机后直接掉线,怪物猎人世界联机掉线怎么办 Steam联机掉线解决办法整理(一)...
- 网页集成大华摄像头以及回放功能2019.11.14
- 造成503 service unavailable常见的原因以及解决方法
- Nodejs 服务端MVC架构
- Raspberry Pi Pico ADC配合MQ2测量可燃气体浓度
- 大话 AliPay踩的坑
- 广西科技大学计算机专业分数,广西科技大学
热门文章
- 无法安装net framework 3.5 的解决方法
- 星巴克创始人第三次重出江湖
- arcgis 出图背景_ArcGIS入门教程来袭,零基础的同学快看过来!
- 自考知识电脑图计算机组成原理,自考“计算机组成原理”考试大纲
- 练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 1688按关键词搜索
- VSCode操作小技巧
- android 指南针 原理,手机指南针原理是什么?安卓/苹果手机指南针app工作原理介绍...
- 曾仕强《领导的沟通艺术》读书笔记
- audio应用-外接akm7755