组队大项目(5)收集整理疑问篇 | 青训营笔记

68 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第32天

整理在项目开发过程中存在的问题:

git部分

  • go.sum文件不知道为什么每个人提交的都会冲突,所以咱们都不用提交go.sum文件。克隆文件后,要生成go.sum文件直接用go mod tidy就行
  • 善用gitignore,提交时会过滤掉无用文件

目录树实现

树节点

在树中,可以有两种类型的节点:一种是不能有子节点的文件,另一种是有子节点但没有数据(没有块)的树。在我们的代码中,树被组织为从完整路径(我们称之为路径地址)到节点本身的哈希图。每个节点都有对其所有子节点及其父节点的引用,因此知道一个节点的地址,我们可以轻松地在树中遍历。

节点实现

每个树节点都知道有关文件的一般信息:它的地址、大小、创建日期等。此外,它还具有树提供的一小部分信息:它的子节点和父节点。它还应该包含有关它是否被删除的信息,因为我们使用延迟删除:只需将某个节点标记为已删除并将其从 hashmap 中删除,但节点本身将保留在树结构中并最终被删除。对于一些昂贵的操作,例如删除目录,这是一个非常好的解决方案:只需将一个目录标记为已死,并将成功返回给客户端,然后它才能处理它创建的混乱。

块结构实现:

块总是有一个唯一的 id。两个块不可能具有相同的 ID,因此使用 UUID 来识别它们。它还包含它属于哪个文件的信息。其他信息(红色)是关于块的状态。一般状态可能是PENDING(文件刚刚创建但客户端尚未上传此块)、OK(客户端可以下载文件)、DOWN(没有服务器可以提供此块;文件为DEAD)和OBSOLETE(该块所属的文件被删除)。NS 的任务之一是保持 OK 副本的数量与配置的副本数量相同。