自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ceph中序列化的設(shè)計與實現(xiàn)

云計算
作為主要和磁盤、網(wǎng)絡(luò)打交道的分布式存儲系統(tǒng),序列化是最基礎(chǔ)的功能之一,今天我們來看一下Ceph中序列化的設(shè)計與實現(xiàn)。

作為主要和磁盤、網(wǎng)絡(luò)打交道的分布式存儲系統(tǒng),序列化是最基礎(chǔ)的功能之一,今天我們來看一下Ceph中序列化的設(shè)計與實現(xiàn)。

[[134503]]

1 Ceph序列化的方式

序列化(ceph稱之為encode)的目的是將數(shù)據(jù)結(jié)構(gòu)表示為二進(jìn)制流的方式,以便通過網(wǎng)絡(luò)傳輸或保存在磁盤等存儲介質(zhì)上,其逆過程稱之為反序列化(ceph稱之為decode)。 例如對于字符串“abc”,其序列化結(jié)果為8個字節(jié)(bytes):

03 00 00 00 61 62 63

其中頭四個字節(jié)(03 00 00 00)表示字符串的長度為3個字符,后3個字節(jié)(61 62 63)分別是字符“abc”的ASCII碼的16進(jìn)制表示。 Ceph采用little-endian的序列化方式,即低地址存放***有效字節(jié),所以32位整數(shù)0x12345678的序列化結(jié)果為78 56 34 12。

由于序列化在整個系統(tǒng)中是非?;?,非常常用的功能,Ceph將其序列化方式設(shè)計為一個同一的結(jié)構(gòu),即任意支持序列化的數(shù)據(jù)結(jié)構(gòu),都必須提供一對定義在全局命名空間上的序列化/反序列化(encode/decode)函數(shù)。例如,如果我們定義了一個結(jié)構(gòu)體inode,就必須在全局命名空間中定義以下兩個方法:

  1. encode(struct inode, bufferlist bl) 

 

  1. decode(struct inode, bufferlist::iterator bl);

在此基礎(chǔ)上,序列化的使用就變得非常容易 。 即對于任意可序列化的類型T的實例instance_T,都可以通過以下語句:

  1. ::encode(instance_T, instance_bufferlist);

將instance_T序列化并保存到bufferlist類的實例instance_bufferlist中。

以下代碼演示了將一個時間戳以及一個inode序列化到一個bufferlist中。

  1. utime_t timestamp; 
  2.  
  3. inode_t inode; 
  4.  
  5. bufferlist bl; 
  6.  
  7. ::encode(timetamp, bl) 
  8.  
  9. ::encode(inode, bl); 

bufferlist類(定義于include/buffer.h)是ceph核心的緩存類,用于保存序列化結(jié)果、數(shù)據(jù)緩存、網(wǎng)絡(luò)通訊等,可以將bufferlist理解為一個可變長度的char數(shù)組。關(guān)于bufferlist的設(shè)計與實現(xiàn),可以參考《Ceph中Bufferlist》。

序列化后的數(shù)據(jù)可以通過反序列化方法讀取,例如以下代碼片段從一個bufferlist中反序列化一個時間戳和一個inode(前提是該bl中已經(jīng)被序列化了一個utime_t和一個inode,否則會報錯)。

  1. bufferlist::iterator bl; 
  2.  
  3. ::decode(timetamp, bl) 
  4.  
  5. ::decode(inode, bl); 

#p#

2 數(shù)據(jù)結(jié)構(gòu)的序列化

Ceph為其所有用到數(shù)據(jù)類型提供了序列化方法或反序列化方法,這些數(shù)據(jù)類型包括了絕大部分基礎(chǔ)數(shù)據(jù)類型(int、bool等)、結(jié)構(gòu)體類型的序列化(ceph_mds_request_head等)、集合類型(vector、list、set、map等)、以及自定義的復(fù)雜數(shù)據(jù)類型(例如表示 inode的inode_t等),以下分別介紹不同數(shù)據(jù)類型的序列化實現(xiàn)方式。

2.1 基本數(shù)據(jù)類型的序列化

基本數(shù)據(jù)類型的序列化結(jié)果基本就是該類型在內(nèi)存中的表示形式?;緮?shù)據(jù)類型的序列化方法使用手工編寫,定義在include/encoding.h中,包括以下類型:

  • __u8, __s8, char, bool
  • ceph_le64, ceph_le32, ceph_le16,
  • float, double,
  • uint64_t, int64_t, uint32_t, int32_t, uint16_t, int16_t,
  • string, char*

在手工編寫encode方法過程中,為了避免重復(fù)代碼,借助了WRITE_RAW_ENCODER和WRITE_INTTYPE_ENCODER兩個宏。

2.2 結(jié)構(gòu)體類型的序列化

結(jié)構(gòu)體類型的序列化方法與基本數(shù)據(jù)類型的序列化方法一致,即使用結(jié)構(gòu)體的內(nèi)存布局作為序列化的形式。在結(jié)構(gòu)體定義完成后,通過調(diào)用 WRITE_RAW_ENCODER宏函數(shù)生成結(jié)構(gòu)體的全局encode方法,例如結(jié)構(gòu)體ceph_mds_request_head相關(guān)結(jié)構(gòu)實現(xiàn)如下。

  1. struct ceph_mds_request_head { 
  2.  
  3. __le64 oldest_client_tid; 
  4.  
  5. __le32 mdsmap_epoch; 
  6.  
  7. __le32 flags; 
  8.  
  9. __u8 num_retry, num_fwd; 
  10.  
  11. __le16 num_releases; 
  12.  
  13. __le32 op; 
  14.  
  15. __le32 caller_uid, caller_gid; 
  16.  
  17. __le64 ino; 
  18.  
  19. } __attribute__ ((packed)); 
  20.  
  21. WRITE_RAW_ENCODER(ceph_mds_request_head) 

其中:

  • ceph_mds_request_head結(jié)構(gòu)體定義在include/ceph_fs.h
  • WRITE_RAW_ENCODER(ceph_mds_request_head)語句位于include/types.h
  • WRITE_RAW_ENCODER宏函數(shù)定義在include/encoding.h

WRITE_RAW_ENCODER宏函數(shù)實際上是通過調(diào)用encode_raw實現(xiàn)的,而encode_raw調(diào)用bufferlist的append的方法,通過內(nèi)存拷貝,將數(shù)據(jù)結(jié)構(gòu)放入到bufferlist中。相關(guān)代碼為:

  1. template 
  2.  
  3. inline void encode_raw(const T& t, bufferlist& bl) 
  4.  
  5.  
  6. bl.append((char*)&t, sizeof(t)); 
  7.  
  8.  
  9. template 
  10.  
  11. inline void decode_raw(T& t, bufferlist::iterator &p) 
  12.  
  13.  
  14. p.copy(sizeof(t), (char*)&t); 
  15.  

2.3 集合數(shù)據(jù)類型的序列化

集合數(shù)據(jù)類型序列化的基本思路包括兩步:

  1. 序列化集合大小,
  2. 序列化集合內(nèi)的所有元素

例如vector& v的序列化方法:

  1. template 
  2.  
  3. inline void encode(const std::vector& v, bufferlist& bl) 
  4.  
  5.  
  6. __u32 n = v.size(); 
  7.  
  8. encode(n, bl); 
  9.  
  10. for (typename std::vector::const_iterator p = v.begin(); p != v.end(); ++p) 
  11.  
  12. encode(*p, bl); 
  13.  

其中元素的序列化通過調(diào)用該元素的encode方法實現(xiàn)。

常用集合數(shù)據(jù)類型的序列化已經(jīng)由Ceph實現(xiàn),位于include/encoding.h中,包括以下集合類型:

  • pair, triple
  • list, set, vector, map, multimap
  • hash_map, hash_set
  • deque

集合類型的序列化方法皆為基于泛型(模板類)的實現(xiàn)方式,適用于所有泛型派生類。

2.4 復(fù)雜數(shù)據(jù)類型的序列化

除以上兩種業(yè)務(wù)無關(guān)的數(shù)據(jù)類型外,其它數(shù)據(jù)類型的序列化實現(xiàn)包括兩部分:

在類型內(nèi)部現(xiàn)實encode方法,

將類型內(nèi)部的encode方法重定義為全局方法。

以下以utime_t類為例:

  1. class utime_t { 
  2.  
  3. struct { 
  4.  
  5. __u32 tv_sec, tv_nsec; 
  6.  
  7. } tv; 
  8.  
  9. void encode(bufferlist &bl) const { 
  10.  
  11. ::encode(tv.tv_sec, bl); 
  12.  
  13. ::encode(tv.tv_nsec, bl); 
  14.  
  15.  
  16. void decode(bufferlist::iterator &p) { 
  17.  
  18. ::decode(tv.tv_sec, p); 
  19.  
  20. ::decode(tv.tv_nsec, p); 
  21.  
  22.  
  23. }; 
  24.  
  25. WRITE_CLASS_ENCODER(utime_t) 
  26.  
  27. utime_t內(nèi)部實現(xiàn)了encode和decode兩個方法,WRITE_CLASS_ENCODER宏函數(shù)將這兩個方法轉(zhuǎn)化為全局方法。 
  28.  
  29. WRITE_CLASS_ENCODER宏函數(shù)定義于include/encoding.h中,其定義如下: 
  30.  
  31. #define WRITE_CLASS_ENCODER(cl) \ 
  32.  
  33. inline void encode(const cl &c, bufferlist &bl, uint64_t features=0) { \ 
  34.  
  35. ENCODE_DUMP_PRE(); c.encode(bl); ENCODE_DUMP_POST(cl); } \ 
  36.  
  37. inline void decode(cl &c, bufferlist::iterator &p) { c.decode(p); } 

復(fù)雜數(shù)據(jù)結(jié)構(gòu)內(nèi)部的encode方法的實現(xiàn)方式通常是調(diào)用其內(nèi)部主要數(shù)據(jù)結(jié)構(gòu)的encode方法,例如utime_t類的encode方法實際上是序列化內(nèi)部的tv.tv_sec和tv.tv_nsec兩個成員。

原文鏈接:https://www.ustack.com/blog/cephxuliehua/
 

責(zé)任編輯:Ophira 來源: ustack博客
相關(guān)推薦

2023-12-13 13:49:52

Python序列化模塊

2018-03-19 10:20:23

Java序列化反序列化

2012-04-13 10:45:59

XML

2013-03-11 13:55:03

JavaJSON

2011-06-01 14:26:11

序列化

2011-06-01 15:05:02

序列化反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2023-11-20 08:44:18

數(shù)據(jù)序列化反序列化

2011-04-02 13:47:01

2009-06-14 22:01:27

Java對象序列化反序列化

2009-08-24 17:14:08

C#序列化

2023-12-26 07:26:07

Java序列化反序列化機制

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2024-09-10 08:28:22

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 16:53:49

C# XmlSeria序列化

2009-09-09 16:30:59

C# BinaryFo

2024-01-30 13:32:51

JSON反序列化序列化
點贊
收藏

51CTO技術(shù)棧公眾號