目录

一 引言

二 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寻址

如果需要获取某个对象的属性值,需要进行以下过程:

  1. 根据对象object id获取HOBJECT_TO_SEQ+ghobject_key(oid),根据此key值获取对应的header;
  2. 根据对应的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的实现相关推荐

  1. Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

    在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题.在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架.这对于许多TI的芯片都是通用的,这次看AM335X的代码顺 ...

  2. OMAP开发板的启动过程

    OMAP的启动过程 参考文档:http://www.omappedia.org/wiki/Bootloader_Project#u-boot_overview OMAP平台的启动初始化过程(bootl ...

  3. omap android,德州仪器基于Android 移动平台演示OMAP

    2009 年 2 月 18 日,德州仪器 (TI) 在本周世界移动通信大会  上展示运行于 TI 新推出的 OMAP 3 移动开发平台上的最新 Android 移动平台.TI 在展会中演示 Andro ...

  4. 安卓 体验linux mux,Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

    对于许多TI的芯片来说,引脚复用的配置是在Control Module(配置模块)的寄存器里配置的,(这个和三星的CPU有点不同,三星的一般在GPIO的寄存器中配置).所以当你需要配置这些寄存器的时候 ...

  5. OMAP 3 图像信号处理器 (ISP) 驱动

    V4L2 驱动框架概览 OMAP 3 图像信号处理器 (ISP) 驱动 Chinese translated version of Documentation/video4linux/omap3isp ...

  6. linux 电源管理源码分析,Linux 3.8.1 电源管理之OMAP Voltage Domain分析

    本系列文章将分析Linux对于OMAP的电源管理功能,以AM33XX作为实例(目前的硬件平台先主要关注AM335xStarterKit开发板),在必要时穿插其他相关内容. 在linux-3.8.1/a ...

  7. TI OMAP平台BSP学习笔记之 - LCD 驱动(3)

    通过前面两个系列的学习,我们已经了解DSS系统,LCD基本原理,DSS设备树的配置等基本知识.本文简单学习和梳理LCD设备驱动的代码,方便项目中快速bring up和debug. 此系列文章基于TI的 ...

  8. DAVINCI和OMAP架构的区别

    在 2002 年的第 4 季時,我以TI 公司的 OMAP(Open Mobile Application Processor,開放式行動應用處理器)平台進行了一項實做計畫,並採用了Innovator ...

  9. 触摸屏显示接口设计-用于便携式热像仪的OMAP双核处理器

    引言 近年来以美国苹果公司iPad.iPhone为代表的新一代IT产品在世界市场掀去了疯狂的购买热潮,其方便快捷的触摸屏操作模式不仅使人们充分感受到兴手拾来"信息"的快感,更代表了 ...

最新文章

  1. mkdir、rmdir命令、head、tail命令
  2. Java高并发程序设计学习笔记(十一):Jetty分析
  3. 3说明书_电子产品说明书应该怎么翻译?知行君认为需要注意这3点
  4. Office资源汇 | Office 365 微助理功能介绍 4
  5. vrrp路由器三种状态_VRRP技术详解和实战演练
  6. android中的BitMap(二)从网络和资源文件中获得一个BitMap
  7. [SSH] 传输文件
  8. 9. 设计二个函数分别计算sinx和cosx_Excel技巧篇(一):超级好用的几个函数
  9. java异常处理中的返回值
  10. 洛谷P1427 小鱼的数字游戏
  11. linux 杂项设备,浅谈 MISC杂项设备
  12. scala面向对象总结
  13. 成年人改名字要哪些步骤和手续?
  14. python游戏联机后直接掉线,怪物猎人世界联机掉线怎么办 Steam联机掉线解决办法整理(一)...
  15. 网页集成大华摄像头以及回放功能2019.11.14
  16. 造成503 service unavailable常见的原因以及解决方法
  17. Nodejs 服务端MVC架构
  18. Raspberry Pi Pico ADC配合MQ2测量可燃气体浓度
  19. 大话 AliPay踩的坑
  20. 广西科技大学计算机专业分数,广西科技大学

热门文章

  1. 无法安装net framework 3.5 的解决方法
  2. 星巴克创始人第三次重出江湖
  3. arcgis 出图背景_ArcGIS入门教程来袭,零基础的同学快看过来!
  4. 自考知识电脑图计算机组成原理,自考“计算机组成原理”考试大纲
  5. 练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
  6. 1688按关键词搜索
  7. VSCode操作小技巧
  8. android 指南针 原理,手机指南针原理是什么?安卓/苹果手机指南针app工作原理介绍...
  9. 曾仕强《领导的沟通艺术》读书笔记
  10. audio应用-外接akm7755