ceph struct3

本文详细解析了Ceph文件系统中的关键数据结构,包括集群内部子版本协议类型宏定义、文件布局结构及加密算法等。通过具体的数据结构定义,介绍了文件到对象的映射、PG到磁盘的布局等内容,并提供了文件布局有效性的判断函数。

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

(1)集群内部子版本协议类型宏定义:与公共协议保持独立性,以便消息类型和协议升级受影响

#define CEPH_OSDC_PROTOCOL   24 /* server/client */OSD服务器集群与客户端协议版本
#define CEPH_MDSC_PROTOCOL   32 /* server/client */MDS与客户端
#define CEPH_MONC_PROTOCOL   15 /* server/client */监控与客户端

#define CEPH_INO_ROOT  1 //根目录节点的inode号
#define CEPH_INO_CEPH  2        /* hidden .ceph dir */隐藏目录.ceph的inode节点号

/* arbitrary limit on max # of monitors (cluster of 3 is typical) */
#define CEPH_MAX_MON   31 //最大的监控集群数量
(2)文件布局:描述一个文件(inode)的数据布局
struct ceph_file_layout {
/* file -> object mapping */文件到对象的映射
__le32 fl_stripe_unit;     /* stripe unit, in bytes.  must be multiple
      of page size. */条带大小,必须是页的多倍
__le32 fl_stripe_count;    /* over this many objects */
__le32 fl_object_size;     /* until objects are this big, then move to
      new objects */
__le32 fl_cas_hash;        /* UNUSED.  0 = none; 1 = sha256 */

/* pg -> disk layout */PG到磁盘的布局
__le32 fl_object_stripe_unit;  /* UNUSED.  for per-object parity, if any */

/* object -> pg layout */对象到PG的布局
__le32 fl_pg_preferred; /* preferred primary for pg (-1 for none) */
__le32 fl_pg_pool;      /* namespace, crush ruleset, rep level */
} __attribute__ ((packed));

#define CEPH_MIN_STRIPE_UNIT 65536//最小的条带单位
//判断文件布局是否有效的函数
int ceph_file_layout_is_valid(const struct ceph_file_layout *layout)
{
__u32 su = le32_to_cpu(layout->fl_stripe_unit);//大小端转换
__u32 sc = le32_to_cpu(layout->fl_stripe_count);
__u32 os = le32_to_cpu(layout->fl_object_size);

/* stripe unit, object size must be non-zero, 64k increment */条带单元和对象大小非零
if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1)))
return 0;
if (!os || (os & (CEPH_MIN_STRIPE_UNIT-1)))
return 0;
/* object size must be a multiple of stripe unit */对象大小必须是条带的整数倍
if (os < su || os % su)
return 0;
/* stripe count must be non-zero */条带数量非零
if (!sc)
return 0;
return 1;
}

struct ceph_dir_layout {//目录的布局
__u8   dl_dir_hash;   /* see ceph_hash.h for ids */
__u8   dl_unused1;
__u16  dl_unused2;
__u32  dl_unused3;
} __attribute__ ((packed));

(3)加密算法和安全权限协议宏定义:
#define CEPH_CRYPTO_NONE 0x0 //没有加密
#define CEPH_CRYPTO_AES  0x1 //AES加密

#define CEPH_AES_IV "cephsageyudagreg"

#define CEPH_AUTH_UNKNOWN 0x0 //不知道的权限
#define CEPH_AUTH_NONE   0x1 //没有权限
#define CEPH_AUTH_CEPHX   0x2 // CEPHX
 
#define CEPH_AUTH_UID_DEFAULT ((__u64) -1)

转载于:https://my.oschina.net/guyson/blog/357152

创建元数据的过程涉及对数据结构和相关信息的详细描述,具体方法取决于应用场景和技术栈。以下是几种常见场景下的元数据创建方法: ### 创建元数据的基本步骤 1. **定义数据结构**: 在创建元数据之前,需要明确数据的结构和属性。例如,在使用Go语言时,可以通过定义结构体来表示元数据的字段和表信息。例如[^2]: ```go type Field struct { colName string } type Model struct { tableName string fieldMap map[string]*Field } ``` 2. **使用数据库存储元数据**: 在Hive等大数据处理工具中,元数据通常存储在外部数据库(如MySQL)中。通过配置Hive的元数据存储位置,可以管理和查询表的元数据。例如,Hive的配置文件`hive-site.xml`中可以指定MySQL作为元数据存储: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive_metastore</value> </property> ``` 3. **在C#中创建元数据类**: 在C#中,可以通过创建一个内部类来作为元数据类,用于描述主类的属性。例如[^3]: ```csharp public partial class Address { // 主类的实现 } internal class AddressMetadata { // 元数据描述 } ``` 4. **Ceph RBD中的元数据操作**: 在Ceph RBD中,创建image时需要操作元数据。例如,使用命令行工具创建image并设置元数据: ```bash rbd create mypool/myimage --size 1024 --image-format 2 --image-feature layering ``` 5. **通过工具创建元数据**: 在某些业务系统中,可以通过图形化工具创建元数据。例如,在MDP透视图中,右击项目选择新建实体组件,并填写相关信息来创建元数据[^5]。 ### 实战示例 假设需要在Go语言中动态创建一个包含元数据的模型,可以按照以下步骤进行: ```go package main import ( "fmt" ) type Field struct { colName string } type Model struct { tableName string fieldMap map[string]*Field } func main() { // 创建字段 idField := &Field{colName: "id"} nameField := &Field{colName: "name"} // 创建模型 userModel := &Model{ tableName: "users", fieldMap: map[string]*Field{ "id": idField, "name": nameField, }, } // 输出模型信息 fmt.Printf("Table Name: %s\n", userModel.tableName) for fieldName, field := range userModel.fieldMap { fmt.Printf("Field %s: %s\n", fieldName, field.colName) } } ``` ### 总结 创建元数据的关键在于理解数据的结构和用途,并根据具体的技术栈选择合适的方法。无论是通过编程语言定义结构体、使用数据库存储,还是通过图形化工具操作,都需要确保元数据的准确性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值