ceph主要数据结构解析2-Rados.h文件
(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));
}
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));
#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));
#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 */
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
static inline int ceph_stable_mod(int x, int b, int bmask)
{
if ((x & bmask) < b)
return x & bmask;
else
return x & (bmask >> 1);
}
struct ceph_eversion {
	__le32 epoch;
	__le64 version;
} __attribute__ ((packed));
#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
#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
#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);
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 */
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
};
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文件的更多相关文章
- ceph主要数据结构解析3-Ceph_fs.h文件
		(1)集群内部子版本协议类型宏定义:与公共协议保持独立性,以便消息类型和协议升级受影响 #define CEPH_OSDC_PROTOCOL 24 /* server/client */OSD服务 ... 
- Ceph源码解析:读写流程
		转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ... 
- 对于.h文件和.c文件
		C语言中.h文件和.c文件详细解析_云止水_新浪博客http://blog.sina.com.cn/s/blog_73006d600102wcx5.html 
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
		原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ... 
- .c和.h文件的区别(转载)
		一个简单的问题:.c和.h文件的区别学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼:子程序不要定义在 ... 
- 读书笔记-详解C程序开发中 .c和.h文件的区别
		一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ... 
- .c和.h文件的区别(头文件与之实现文件的的关系~ )
		.c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ... 
- 深入学习python解析并读取PDF文件内容的方法
		这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ... 
- Unity的Json解析<一>--读取Json文件
		本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50373558 作者:car ... 
随机推荐
- 访问的是A网址,但是跳转B网址的内容,地址栏还是A网址
			最近家里宽带续费,是用小区小广告的宽带,打开http://download.csdn.net/ 或其他一些设计下载.购物商城或威客网址进不去 提示 经过网上大量搜索和请教,都说是以下几点引起的 1.网 ... 
- 【转】 iOS开发数据库篇—SQLite简单介绍
			开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中 ... 
- 【转】iOS申请发布证书-图文详解
			摘要 发布产品到App Store所需证书,2013年5月26日测试 IOS 发布证书 distribution 打包程序 真机调试证书 本文讲述发布证书的申请,申请真机调试证书请参考:http:// ... 
- Mysql软删除
			所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ... 
- vim 支持gb2312
			vi /etc/vimrc 中添加如下,并保存. set termencoding=encodingset fileencodings=utf-8,gbk,ucs-bom,cp936set shif ... 
- MySQL学习-常用命令整理
			Eyes are more eloquent than lips. “眉目传情胜于甜言蜜语” 整理了一下自己遇到并且经常用到的MySQL命令,虽然官方文档上有很详细的解释,不过自己还是在这里记录一下, ... 
- javascript 键值对
			<script type="text/javascript"> var arr = new Array(); arr['cn'] = '中国'; arr['usa'] ... 
- 在jQuery.getData中renderCallback使用不同创建方式的结果
			JavaScript 中需要创建函数的话,有两种方法:函数声明.函数表达式,各自写法如下:// 方法一:函数声明function foo() {}// 方法二:函数表达式var foo = funct ... 
- 浅谈Android序列化
			序列化原因 序列化的原因基本可以归纳为以下三种情况: 永久性保存对象,保存对象的字节序列到本地文件中: 对象在网络中传递: 对象在IPC间传递. --- --- 序列化方法 在Android系统中关于 ... 
- POJ1700:Crossing River(过河问题)
			POJ1700 题目链接:http://poj.org/problem?id=1700 Time Limit:1000MS Memory Limit:10000KB 64bit IO ... 
