ZFS源代码之旅——ZAP模块分析(一)

本文深入探讨ZFS的ZAP模块,解释其在存储属性方面的功能,包括microzap和fatzap对象的特性。ZAP用于存储数据集、文件系统和存储池属性,关键在于其高效处理名字值对的能力。文章详细分析了microzap和fatzap的数据结构,如mzap_phys和zap_phys_t,并阐述了冲突解决策略。
摘要由CSDN通过智能技术生成

0. 背景介绍

该内容主要来自于《ZFS On-Disk Specification》一书的第5章,其中部分内容依据ZFS代码有所更新。


ZAP(ZFS Attribute Process)模块位于DMU模块之上,用来对ZAP对象进行操作。ZFS通过ZAP对象来存储名字值对(name-value pairs)形式的属性,该属性的名字部分为一个以空字符('\0')结尾的字符串(最长为256字节),而属性的值部分为一组整数,该值的大小仅仅受限于ZAP数据块的大小。

ZAP对象可以用来保存数据集(dataset)的属性,用来查找文件系统中的对象,用来保存存储池的属性等等,它在ZFS整个系统中有十分重要的作用。下面的这张表包含了ZFS中ZAP类型的对象。(更多的ZAP类型的对象可以在dmu.h中定义的dmu_object_type枚举中查看)

ZAP对象类型
DMU_OT_OBJECT_DIRECTORY
DMU_OT_DSL_DIR_CHILD_MAP
DMU_OT_DSL_DS_SNAP_MAP
DMU_OT_DSL_PROPS
DMU_OT_DIRECTORY_CONTENTS
DMU_OT_MASTER_NODE
DMU_OT_DELETE_QUEUE
DMU_OT_ZVOL_PROP

ZAP对象有两种形式:microzap对象和fatzap对象。microzap对象可以认为是轻量级的fatzap对象,它为较小的属性(数量少,名字和值的长度都有限)提供了一种快速存取和查找机制。而fatzap用来存储包含大量名字值对(且名字和值的长度较大)的属性。

ZFS根据下面3个条件决定应该是否可以用microzap对象来存储某一组属性的名字值对

1. 所有的名字值对都可以存入一个数据块中。对于ZFS来说,最大的数据块是128KB,即总共可以存放2047个microzap条目。(下面会详细介绍microzap的结构)

2. 所有属性的值都为uint64_t类型

3. 每个属性的名字部分为少于50个字节的字符串(包括结尾的空字符)

如果以上有一个条件未满足,则采用fatzap存放。


每个ZAP对象的数据块的头64个字节用来表明该数据块中包含的ZAP数据的类型,一共有3种类型的ZAP数据块,如下表所示:

ZAP Object Block Types
标识符 描述
ZBT_MICRO 该数据块中存放microzap条目 (1ULL<<63)+3
ZBT_HEADER 该块属于一个fatzap对象,该标识符只出现在fatzap对象的第一个数据块中 (1ULL<<63)+1
ZBT_LEAF 该块属于一个fatzap对象,该标识符出现在除了第一块之外所有的fatzap对象的数据块中 (1ULL<<63)+0


1. microzap磁盘结构

microzap实现了存取少量属性的一种简单方法。一个microzap对象只包含一个数据块,该数据块上存放microzap的条目(由mzap_ent_phys 结构体表示),每个microzap条目结构存放一个属性(名字值对)。

一个microzap数据块的结构如下:

1. 数据块开始的128个字节为一个microzap头部结构体(由mzap_phys结构体表示),该结构体定义如下:


                
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值