分布式系统Lab1

FsImage

FileDesc

FileDesc类用于封装NameNode open()方法返回的文件描述信息的类。包含了文件的元数据信息,如文件块的ID、大小、所在节点、创建时间、修改时间、访问时间和文件名等。

文件中还包括:

  • 构造函数用于初始化这些属性
  • 获取和设置这些属性的方法,如getName()getNode()getBid()setBid()
  • 一个静态方法fromString(),用于将字符串转换为FileDesc对象

FsImage

通过fileDesc.dat来存储文件的元数据信息。这些信息被存储在两张Map中。

  • 第一张:文件名作为键,FileDesc对象作为值。
  • 第二张:从块信息对应到文件信息。

FsImage的保存和加载通过ObjectOutputStreamObjectInputStream来实现。前者在close时,将fileDescMap的内容写入文件,后者在读取文件时初始化Map


文件和数据块的映射和数据块定位

文件和数据块的映射是通过FileDesc对象中的数据块ID数组(bid)来实现的。每个FileDesc对象都包含了节点编号和数据块编号,这些ID与实际的数据块文件相对应,这样可以快速定位到到数据块所属的文件。


Client

  1. open()

    • NameServer请求获得文件的元数据,并在内存中存储打开的文件信息(元数据和读写模式)
    • 为文件生成一个此次打开对应的标识符fd
  2. append()

    • 向打开的文件中追加数据。它会根据文件的标识符fd 找到文件的元数据信息,然后将提供的数据分块进字节数组,确定数据块编号,追加到文件的末尾。
  3. read()

    • 从打开的文件中读取数据。先检查权限,再找到文件的元数据信息,然后从指定位置读取数据块,最后整理,整合。
  4. close()

    • 关闭打开的文件,并释放相应的资源,初始化。
  5. getFileDescIndex()

    • 获取文件的元数据信息在内存中的索引。
  6. refreshFileDesc()

    • 刷新文件的元数据信息,确保获取的是最新的文件信息。
  7. getUsefulByteSize()

    • 获取字节数组中的有效字节大小,去除末尾的空字节部分。

NameNode

  1. createFsImgIfNotExist()

    • 检查文件系统的元数据文件是否存在,如果不存在则创建一个新的文件,并初始化fileDescMap为一个空的HashMap
  2. getFsImg()

    • 从文件系统的元数据文件中读取数据,恢复文件系统的元数据信息。打开文件,逐个读取文件中存储的FileDesc对象,并将其放入fileDescMap中,同时更新其他相关的数据结构。
  3. saveFsImg()

    • 将当前的文件系统元数据信息保存到文件中。它会将fileDescMap写入到文件中。
  4. open()

    • 打开一个文件,并返回文件的元数据信息。不存在,则会创建一个新的FileDesc对象,并将其加入fileDescMap中。如果文件已经存在,则会返回文件的元数据信息,并根据打开模式获取相应的文件权限。
    • 若需要进行写操作时,检查写锁。
  5. close()

    • 关闭一个文件,并保存文件系统的元数据信息到文件中。它会根据文件路径获取相应的文件权限,并释放写锁,然后保存文件系统的元数据信息。
  6. update()

    • 更新文件的元数据信息。

DataNode

read方法来读取数据块,append方法来追加数据到数据块,randomBlockId方法来生成随机的数据块ID,update方法来更新文件信息,getUsefulByteSize来获取有效字节的长度。


实验截图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值