1 | struct object_t { |
From: src/include/object.h
对于Ceph中的每一种需要存储的资源在进行存储前都要进行encode
操作,然后再将其写入硬盘。对于读取同样,在从硬盘获取到数据后需要进行decode
操作。而每种需要存储资源如何encode
和decode
当然要由资源自己来决定。所以在资源的class
或struct
中要实现encode
和decode
方法。
WRITE_CLASS_ENCODER(object_t)
干了些啥呢。。。
1 | // see denc.h for ENCODE_DUMP_PATH discussion and definition. |
From: src/include/encoding.h
看了上面的代码应该能了解到WRITE_CLASS_ENCODER(object_t)
是对encode
和decode
函数的重载。这是入口,然后再调用其资源自身encode
或decode
方法。
那么对于一些基础类型(如:int、string等)是如果encode
和decode
的呢?
int类型
1 | // int types |
From: src/include/encoding.h
int类型的encode
和decode
又调用了encode_raw
和decode_raw
。真是一层套一层啊~(俄罗斯套娃嘛)~
1 | // base types |
From: src/include/encoding.h
base比较简单,就是无论int几个字节,都是从低到高一个字节一个字节的写下去,再一个字节一个字节的读出来。。。
float类型
1 |
|
From: src/include/encoding.h
float类型关键在于reinterpret_cast
将一个浮点数转换为整数。更多关于reinterpret_cast
的内容
string
1 | // string |
From: src/include/encoding.h
string的encode
和decode
分两种,一种是有“害的”(head),一种是无“害的”。有“害的”需要先记录string的长度,再记录string的内容;无“害的”直接记录内容,单再decode
过程中需要制定长度。总之这个长度总要有个人来记。好鸡肋!
整个的encode
和decode
的过程用到了一个bufferlist
类型,那么这个bufferlist
又是个什么结构呢,详细请见ceph中的buffer