(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. Ext4.1 grid 多选(可无checkbox)

    转载 在Ext4.1中的grid默认只能实现单选的. 如果你想要你的grid有多选功能,需要给grid增加selModel 如果你使用了Ext.create('Ext.selection.Checkb ...

  2. Qt中widget重新setParent需要注意的问题

    有时候需要在widget中重新setParent,但会发现setParent有时候会出现问题,比如子窗口不在刷出来等等. 其实,有一点是需要注意的,就是Qt文档里说的,如果你当前widget重新设置了 ...

  3. Python list 常用操作

    测试版本: python 2.7 获取第一个.最后一个元素 list1 = ["a", "b", "c"] len1 = len(list1 ...

  4. 路由器to路由器

    本文主要介绍一个主路由器连接两个子路由器的方法: 主路由器: 设置主路由器的开始ip地址为192.168.1.100,结束ip地址为192.168.150: 子路由器A: 第一步:LAN设置 第二步: ...

  5. TP开发小技巧

    TP开发小技巧原文地址http://wp.chenyuanzhao.com/wp/2016/07/23/tp%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7/ ...

  6. Linux 下 将使用Python-Django开发的web应用布置到服务器上(亲测有效)

    写在前面: Django是一个卓越的新一代Web框架,相信使用Python的人对此并不陌生,但将我们完成的web应用布置到到服务器上并不是一件容易的事情. Django详细的教程可以参考http:// ...

  7. 30 个 Python 语言的特点技巧

    1   介绍 从我开始学习Python时我就决定维护一个经常使用的“窍门”列表.不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中.在StackOverflow.在开源码软件中,等等 ...

  8. android中的margin和padding

    Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin. 通俗的理解: Padding 为内边框,指该控件内部内容,如文本/图片 ...

  9. codevs 1107 等价表达式

    传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...

  10. UML问题

    1.在创建协作图时需要先确定参与者,而协作图的工具栏里是没有Actor的,这是需要先new Actor,然后把其拖动到工作区:实验过程中发现必须创建在用例视图下,若是创建在逻辑试图下那么根本无法继续操 ...