(1)文件系统id结构:16个字符组成

struct ceph_fsid {
unsigned char fsid[16];
};
以及对应的比较函数:
static inline int ceph_fsid_compare(const struct ceph_fsid *a,
const struct ceph_fsid *b)
{
return memcmp(a, b, sizeof(*a));
}
(2)定义保留的snap的id宏
typedef __le64 ceph_snapid_t;
#define CEPH_SNAPDIR ((__u64)(-1)) /* reserved for hidden .snap dir */
#define CEPH_NOSNAP ((__u64)(-2)) /* "head", "live" revision */
#define CEPH_MAXSNAP ((__u64)(-3)) /* largest valid snapid */ struct ceph_timespec {//自定义的时间描述结构体
__le32 tv_sec;
__le32 tv_nsec;
} __attribute__ ((packed));
(3)对象布局宏:对象怎样放到放置组PG里面去(placement group)
#define CEPH_OBJECT_LAYOUT_HASH     1 //哈希
#define CEPH_OBJECT_LAYOUT_LINEAR 2 //线性
#define CEPH_OBJECT_LAYOUT_HASHINO 3 //哈希inode struct ceph_object_layout {//对象布局
struct ceph_pg ol_pgid; /* raw pg, with _full_ ps precision. */
__le32 ol_stripe_unit; /* for per-object parity, if any */
} __attribute__ ((packed));
(4)PG布局宏:PG怎样放置到存储设备上去
#define CEPH_PG_LAYOUT_CRUSH  0 //CRUSH算法,伪随机hash
#define CEPH_PG_LAYOUT_HASH 1 //hash
#define CEPH_PG_LAYOUT_LINEAR 2 //线性
#define CEPH_PG_LAYOUT_HYBRID 3 #define CEPH_PG_MAX_SIZE 16 /* max # osds in a single pg */
(5)PG编码到一个64位
struct ceph_pg {
__le16 preferred; /* preferred primary osd */参考主osd
__le16 ps; /* placement seed */放置种子
__le32 pool; /* object pool */对象池
} __attribute__ ((packed));
下面是两种对象池的宏定义:
#define CEPH_PG_TYPE_REP     1 //冗余
#define CEPH_PG_TYPE_RAID4 2 //raid
控制PG数量的函数定义:保证b小于bmask并且bmask是2的n次方的最小值
随着时间b的增加产生一个稳定的映射
static inline int ceph_stable_mod(int x, int b, int bmask)
{
if ((x & bmask) < b)
return x & bmask;
else
return x & (bmask >> 1);
}
(6)划时代和版本的组合,被用作存储层的序列化突变
struct ceph_eversion {
__le32 epoch;
__le64 version;
} __attribute__ ((packed));
(7)osd(对象存储设备)映射位的宏定义:
#define CEPH_OSD_EXISTS  (1<<0) //osd存在
#define CEPH_OSD_UP (1<<1) //
#define CEPH_OSD_AUTOOUT (1<<2) /* osd was automatically marked out */自动标出
#define CEPH_OSD_NEW (1<<3) /* osd is new, never marked in */新的,从未标记 extern const char *ceph_osd_state_name(int s);//得到对应的名字,实现如下:
const char *ceph_osd_state_name(int s)
{
switch (s) {
case CEPH_OSD_EXISTS:
return "exists";
case CEPH_OSD_UP:
return "up";
case CEPH_OSD_AUTOOUT:
return "autoout";
case CEPH_OSD_NEW:
return "new";
default:
return "???";
}
} /* osd weights. fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */
osd的权重值:最大为0x10000相当于1.0,最小为0
#define CEPH_OSD_IN 0x10000
#define CEPH_OSD_OUT 0
(8)osd映射标志位定义:
#define CEPH_OSDMAP_NEARFULL (1<<0)  /* sync writes (near ENOSPC) */
#define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC) */
#define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */暂停所有读
#define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */
#define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */ /*
* The error code to return when an OSD can't handle a write
* because it is too large.
*/因为数据太大导致OSD不能处理些时返回的错误代码
#define OSD_WRITETOOBIG EMSGSIZE
(9)osd的操作
#define CEPH_OSD_OP_MODE       0xf000 //操作模式
#define CEPH_OSD_OP_MODE_RD 0x1000 //读
#define CEPH_OSD_OP_MODE_WR 0x2000 //写
#define CEPH_OSD_OP_MODE_RMW 0x3000 //读修改写
#define CEPH_OSD_OP_MODE_SUB 0x4000 //子操作 #define CEPH_OSD_OP_TYPE 0x0f00 //操作类型
#define CEPH_OSD_OP_TYPE_LOCK 0x0100 //锁
#define CEPH_OSD_OP_TYPE_DATA 0x0200 //数据
#define CEPH_OSD_OP_TYPE_ATTR 0x0300 //属性
#define CEPH_OSD_OP_TYPE_EXEC 0x0400 //执行
#define CEPH_OSD_OP_TYPE_PG 0x0500 //PG
#define CEPH_OSD_OP_TYPE_MULTI 0x0600 /* multiobject */多对象
下面是定义操作模式与类型组合的枚举:
enum {
CEPH_OSD_OP_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1,
中间省略很多...
CEPH_OSD_OP_PGLS_FILTER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 2,
};
以及定义了判断操作是否为每一种类型或模式的操作,如判断是否为锁操作类型的函数如下:
static inline int ceph_osd_op_type_lock(int op)
{
return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_LOCK;
}
返回操作名称的函数:
extern const char *ceph_osd_op_name(int op);
(10)osd操作标志定义:有详细的英文注释了
enum {
CEPH_OSD_FLAG_ACK = 0x0001, /* want (or is) "ack" ack */
CEPH_OSD_FLAG_ONNVRAM = 0x0002, /* want (or is) "onnvram" ack */
CEPH_OSD_FLAG_ONDISK = 0x0004, /* want (or is) "ondisk" ack */
CEPH_OSD_FLAG_RETRY = 0x0008, /* resend attempt */
CEPH_OSD_FLAG_READ = 0x0010, /* op may read */
CEPH_OSD_FLAG_WRITE = 0x0020, /* op may write */
CEPH_OSD_FLAG_ORDERSNAP = 0x0040, /* EOLDSNAP if snapc is out of order */
CEPH_OSD_FLAG_PEERSTAT_OLD = 0x0080, /* DEPRECATED msg includes osd_peer_stat */
CEPH_OSD_FLAG_BALANCE_READS = 0x0100,
CEPH_OSD_FLAG_PARALLELEXEC = 0x0200, /* execute op in parallel */
CEPH_OSD_FLAG_PGOP = 0x0400, /* pg op, no object */
CEPH_OSD_FLAG_EXEC = 0x0800, /* op may exec */
CEPH_OSD_FLAG_EXEC_PUBLIC = 0x1000, /* op may exec (public) */
CEPH_OSD_FLAG_LOCALIZE_READS = 0x2000, /* read from nearby replica, if any */
CEPH_OSD_FLAG_RWORDERED = 0x4000, /* order wrt concurrent reads */
}; enum {
CEPH_OSD_OP_FLAG_EXCL = 1, /* EXCL object create */
CEPH_OSD_OP_FLAG_FAILOK = 2, /* continue despite failure */
}; #define EOLDSNAPC 85 /* ORDERSNAP flag set; writer has old snapc*/
#define EBLACKLISTED 108 /* blacklisted */
(11)扩展属性比较操作枚举定义:
enum {
CEPH_OSD_CMPXATTR_OP_NOP = 0,
CEPH_OSD_CMPXATTR_OP_EQ = 1,
CEPH_OSD_CMPXATTR_OP_NE = 2,
CEPH_OSD_CMPXATTR_OP_GT = 3,
CEPH_OSD_CMPXATTR_OP_GTE = 4,
CEPH_OSD_CMPXATTR_OP_LT = 5,
CEPH_OSD_CMPXATTR_OP_LTE = 6
}; enum {
CEPH_OSD_CMPXATTR_MODE_STRING = 1,
CEPH_OSD_CMPXATTR_MODE_U64 = 2
};
(12)osd操作结构体封装定义,可能是来至数据有效负载:
struct ceph_osd_op {
__le16 op; /* CEPH_OSD_OP_* */
__le32 flags; /* CEPH_OSD_FLAG_* */
union {//各种数据包格式定义
struct {
__le64 offset, length;//偏移量和长度
__le64 truncate_size;
__le32 truncate_seq;
} __attribute__ ((packed)) extent;
struct {
__le32 name_len;
__le32 value_len;
__u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
__u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
} __attribute__ ((packed)) xattr;
struct {
__u8 class_len;
__u8 method_len;
__u8 argc;
__le32 indata_len;
} __attribute__ ((packed)) cls;
struct {
__le64 count;
__le32 start_epoch; /* for the pgls sequence */
} __attribute__ ((packed)) pgls;
struct {
__le64 snapid;
} __attribute__ ((packed)) snap;
struct {
__le64 cookie;
__le64 ver;
__u8 flag; /* 0 = unwatch, 1 = watch */
} __attribute__ ((packed)) watch;
struct {
__le64 offset, length;
__le64 src_offset;
} __attribute__ ((packed)) clonerange;
};
__le32 payload_len;//数据长度
} __attribute__ ((packed)); struct ceph_osd_reply_head {//回复头部
__le32 client_inc; /* client incarnation */
__le32 flags;
struct ceph_object_layout layout;
__le32 osdmap_epoch;
struct ceph_eversion reassert_version; /* for replaying uncommitted */ __le32 result; /* result code */ __le32 object_len; /* length of object name */
__le32 num_ops; //操作数量
struct ceph_osd_op ops[0]; /* ops[], object */存放所有操作
} __attribute__ ((packed));

ceph主要数据结构解析2-Rados.h文件的更多相关文章

  1. ceph主要数据结构解析3-Ceph_fs.h文件

    (1)集群内部子版本协议类型宏定义:与公共协议保持独立性,以便消息类型和协议升级受影响 #define CEPH_OSDC_PROTOCOL   24 /* server/client */OSD服务 ...

  2. Ceph源码解析:读写流程

    转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ...

  3. 对于.h文件和.c文件

    C语言中.h文件和.c文件详细解析_云止水_新浪博客http://blog.sina.com.cn/s/blog_73006d600102wcx5.html

  4. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

    原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++  C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...

  5. .c和.h文件的区别(转载)

    一个简单的问题:.c和.h文件的区别学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼:子程序不要定义在 ...

  6. 读书笔记-详解C程序开发中 .c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  7. .c和.h文件的区别(头文件与之实现文件的的关系~ )

     .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...

  8. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  9. Unity的Json解析<一>--读取Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50373558 作者:car ...

随机推荐

  1. (转)如何将ecshop首页主广告位的flash轮播替换为js轮播

    转之--http://www.ecshoptemplate.com/article-1710.html 这个ecshop很常见,因为现在比起flash难以修改,js更加符合人们的使用习惯,而默认ecs ...

  2. C#基础知识01(continue、break 和 return、ref 和 out)

    break[跳出循环或者退出一个switch语句]由于它是用来退出循环或者switch语句的,所以只有当它出现在这些语句中时才是合法的. continue 语句和break语句相似,只是它不是退出一个 ...

  3. Delphi 封装Frame到Dll文件

    做项目的时候,发现这个Frame很好用,为了省空间.调用和修改方便,就将Frame封装到dll(动态链接库)里面,确实很好使. 效果图如下: 上图是临时测试用的,忘了将Frame的align设置成al ...

  4. cocos2dx 资源合并.

    文件合并之前 文件合并之后 吐槽 我们项目比较奇葩, ui用cocostudio做, 这项光荣的任务由美术接手. 这个美术是个新手, 经过我长时间的观察, 她似乎不用怎么画画. 至少在很长一段时间里, ...

  5. 二叉树中序遍历 (C语言实现)

    在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...

  6. 模仿qq音乐播放字母效果

    html <div class="cont"> <ul class="cont_ul" id="cont_ul"> ...

  7. Delphi-Copy 函数

    函数名称 Copy 所在单元 System 函数原型 1  function Copy ( Source : string; StartChar, Count : Integer ) : string ...

  8. JS 操作Dom节点之样式

    为了提高用户体验,我们经常会动态修改Dom节点的样式,各种浏览器差异比较大,我们如何应对?不断尝试,不断总结~! 1. style.getComputedStyle.currentStyle 内嵌样式 ...

  9. Pyhon + Django 1.7.2 tutorial + virtualenv简单使用

    最近工作中要用到python,先前没怎么接触过,把python本身的语法以及特性撸过一边之后,这两天按着django官方的文档倒腾了几天, 文档非常详细,本人英语水平也就那样,大体没什么压力,建议像我 ...

  10. 仿微博——MJExtension之字典转模型

    1.模型类中定义好属性 2.用AFN请求下来的数据保存到字典中 3.从字典中取出微博字典数组 //微博字典数组 NSArray *restrictArray = responseObject[@&qu ...