FsImage
FileDesc
FileDesc
类用于封装NameNode open()
方法返回的文件描述信息的类。包含了文件的元数据信息,如文件块的ID、大小、所在节点、创建时间、修改时间、访问时间和文件名等。
文件中还包括:
- 构造函数用于初始化这些属性
- 获取和设置这些属性的方法,如
getName()
、getNode()
、getBid()
、setBid()
等 - 一个静态方法
fromString()
,用于将字符串转换为FileDesc对象
FsImage
通过fileDesc.dat
来存储文件的元数据信息。这些信息被存储在两张Map
中。
- 第一张:文件名作为键,FileDesc对象作为值。
- 第二张:从块信息对应到文件信息。
FsImage
的保存和加载通过ObjectOutputStream
和ObjectInputStream
来实现。前者在close
时,将fileDescMap
的内容写入文件,后者在读取文件时初始化Map
。
文件和数据块的映射和数据块定位
文件和数据块的映射是通过FileDesc
对象中的数据块ID数组(bid
)来实现的。每个FileDesc
对象都包含了节点编号和数据块编号,这些ID与实际的数据块文件相对应,这样可以快速定位到到数据块所属的文件。
Client
-
open()
- 向
NameServer
请求获得文件的元数据,并在内存中存储打开的文件信息(元数据和读写模式) - 为文件生成一个此次打开对应的标识符
fd
。
- 向
-
append()
- 向打开的文件中追加数据。它会根据文件的标识符
fd
找到文件的元数据信息,然后将提供的数据分块进字节数组,确定数据块编号,追加到文件的末尾。
- 向打开的文件中追加数据。它会根据文件的标识符
-
read()
- 从打开的文件中读取数据。先检查权限,再找到文件的元数据信息,然后从指定位置读取数据块,最后整理,整合。
-
close()
- 关闭打开的文件,并释放相应的资源,初始化。
-
getFileDescIndex()
- 获取文件的元数据信息在内存中的索引。
-
refreshFileDesc()
- 刷新文件的元数据信息,确保获取的是最新的文件信息。
-
getUsefulByteSize()
- 获取字节数组中的有效字节大小,去除末尾的空字节部分。
NameNode
-
createFsImgIfNotExist()
- 检查文件系统的元数据文件是否存在,如果不存在则创建一个新的文件,并初始化
fileDescMa
p为一个空的HashMap
。
- 检查文件系统的元数据文件是否存在,如果不存在则创建一个新的文件,并初始化
-
getFsImg()
- 从文件系统的元数据文件中读取数据,恢复文件系统的元数据信息。打开文件,逐个读取文件中存储的
FileDesc
对象,并将其放入fileDescMap
中,同时更新其他相关的数据结构。
- 从文件系统的元数据文件中读取数据,恢复文件系统的元数据信息。打开文件,逐个读取文件中存储的
-
saveFsImg()
- 将当前的文件系统元数据信息保存到文件中。它会将
fileDescMap
写入到文件中。
- 将当前的文件系统元数据信息保存到文件中。它会将
-
open()
- 打开一个文件,并返回文件的元数据信息。不存在,则会创建一个新的
FileDesc
对象,并将其加入fileDescMap
中。如果文件已经存在,则会返回文件的元数据信息,并根据打开模式获取相应的文件权限。 - 若需要进行写操作时,检查写锁。
- 打开一个文件,并返回文件的元数据信息。不存在,则会创建一个新的
-
close()
- 关闭一个文件,并保存文件系统的元数据信息到文件中。它会根据文件路径获取相应的文件权限,并释放写锁,然后保存文件系统的元数据信息。
-
update()
- 更新文件的元数据信息。
DataNode
read
方法来读取数据块,append
方法来追加数据到数据块,randomBlockId
方法来生成随机的数据块ID,update
方法来更新文件信息,getUsefulByteSize
来获取有效字节的长度。