快速通关MIT6.5840(6.824) Lab3

欢迎RSS订阅:skywirc L (madfrey.top)

GitHub仓库地址:skywircL/MIT6.824: MIT6.5840(MIT6.824)-Spring 2023 (github.com)

最近也是马上要过年了,尤其是做的时候还有小年,也是抽空把lab3A和lab3B给做完了

先上结果:

保证Lab3每个测试都单独测试了100次以上,无一 fail。

不保证绝对的 bug-free

测试时的-p同时并发测试的参数不建议调太大,因为Lab3A中间有几个测试压力还是比较大的,风扇呜呜转如果调的太大时话

开始前的准备

阅读论文第八部分:In Search of an Understandable Consensus Algorithm (mit.edu)

推荐阅读:raft_diagram.pdf (mit.edu)

最后将lab3的文档和代码中各个函数的介绍看完

在对试验的大体代码构建有一定的了解后,就可以开始你的实验了。

Lab3A & Lab3B

个人共用时:4天

这次的lab可以说是比较简单的了,相较于Lab2和Lab4来说。难度大体和lab1相当,并且lab的代码已经提供了一些基本的函数要你实现,相对而言会比lab1更加有方向一点

Lab3A

这里要实现论文第八部分提到的超时机制,即如果超时了就换一个server的机制

case <-time.After(100 * time.Millisecond):
    DPrintf("Get Timeout\n")
    reply.Err = ErrTimeOut

这样实现即可。ErrTimeOut的err状态是我加的,原本只有三个状态,但事实上加不加都没什么关系 ,因为无论是超时还是ErrNoLeader,client端都是换一个server重试,他们两个做的事情其实是一样的。

值得一提的是,在论文中换leader是要通过server返回的被其记忆的leaderId,下一次就访问该leader,以及如果超时要重新随机一个leaderId进行访问,但需要修改raft代码(follower要保存一个当前leaderId)以及server代码(reply要加一个返回字段)。因为server的实际数量比较少,并且rpc的reply处也没有说you have to do,所以我也懒得去改代码了,偷了个懒,不采用随机,而是采用递增加取余的方式来找leader

在Lab3A的速度测试中,他对你的性能是有要求的:

Check that ops are committed fast enough, better than 1 per heartbeat interval

如果你只是通过定时的心跳来同步和提交日志,你会发现你通过这个测试的时间和你的心跳时间是有关联的,你心跳越快,他通过需要的时间也越短,反之亦然。

解决方法是在start的时候就立即发送心跳进行同步,而不是等待定时心跳同步

func (rf *Raft) Start(command interface{}) (int, int, bool) {
  // Your code here (2B).
  rf.mu.Lock()
  defer rf.mu.Unlock()
  term := rf.currentTerm
  isLeader := rf.isleader
​
  if isLeader {
    en := Entries{Term: term, Command: command, Index: len(rf.log) + rf.lastIncludedIndex + 1}
    rf.log = append(rf.log, en)
    rf.nextIndex[rf.me] = len(rf.log) + rf.lastIncludedIndex + 1
    rf.persist()
    DPrintf("[start]:me: %d,log:%v\n", rf.me, rf.log)
  } else {
    return -1, term, isLeader
  }
  args := &AppendEntriesArgs{
    Term:     rf.currentTerm,
    LeaderId: rf.me,
  }
​
  reply := &AppendEntriesReply{}
  go rf.sendAppendEntries(args, reply)
​
  return rf.GetAllLogLen(), term, isLeader
}

最后在lab3A中你可能会遇到的情况可能是history is not linearizable

一般会生成一个html让你可以可视化地看看是在什么地方出现了线性一致性问题

在mac下的文件生成在var/folders/9v/l4gt2d_166l5tbz_6f78157r0000gn/T/1581768404.html中

但是我们在实验中是采用了最简单的方法实现线性一致--即通过将所有的操作都提交日志去取得大多数的共识,这在性能上是有损耗的,但是确实能解决线性一致性问题。

所以你会出错大概率可能是因为你把get请求也去重了。

Lab3B

Lab3B要求实现快照,并且他的测试条件确实会比lab2D要严格些,但是基本没有大的改动,都是对raft的日志压缩部分进行小修小补。

如果你在测试中出现了logs were not trimmed',那大概率是因为你的server端出现了死锁,仔细检查下你实现的代码,应该过lab3b是轻轻松松的。

总结

花了4天时间完成lab3,其中在做lab3b的时候我也出现了logs were not trimmed,当时以为是性能问题,一直改来改去就是有两个测试爆这个错过不去,后面仔细分析一下才发现自己死锁了,写着写着给我写迷糊了属于是。正常的完成时间应该是2-3天吧个人觉得,也是比较简单这次试验。

对于lab4可能就先放放了,难度至少等于lab2,花费的时间得7天起步吧,但是寒假所剩不多,还有很多事情没做完,我自然也没有什么时间分配给他它了,大致估计应该是明年初补上lab4和2个challenge吧。maybe

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: storage(已通关).circ是一个编程程序的文件名,文件的扩展名为.circ。这个文件名可能与计算机存储有关。 计算机存储是指计算机用来存储数据和程序的地方。在计算机的存储系统中,数据和程序可以被存储在不同的地方,例如内存、硬盘、固态硬盘等。 根据文件名中的storage(已通关).circ,可能涉及到与游戏相关的存储操作。可能是一个游戏程序或者存档文件。使用.circ作为文件的扩展名,可能意味着这个文件是使用特定编程语言编写的特定程序。 这个文件的内容可能与保存游戏进度、存储游戏设置、存储游戏数据等相关。根据已通关的意思,可能表示这个文件是保存了某个游戏的通关状态的存档文件。 想要详细了解这个文件内容,需要使用特定的软件或工具来打开和查看.circ文件。通过查看文件的内容,可以进一步了解文件中存储了哪些数据和程序。 总之,storage(已通关).circ是一个使用.circ作为文件扩展名的文件名,可能是一个与游戏相关的存储文件,保存了某个游戏的通关状态或者其他相关数据。 ### 回答2: "storage(已通关).circ"是一个计算机编程文件,用于描述储存器的功能和操作。这个文件的扩展名".circ"可能指的是该文件在"Logicly"软件中的使用,因此我将根据这个假设来回答你的问题。 储存器是计算机中用于存储和检索数据的设备。在电子计算机中,储存器可以包括各种各样的设备,例如硬盘驱动器、内存和缓存等。储存器的作用是在计算过程中存储和读取数据,以及在计算机关闭后存储数据以备以后使用。 "storage(已通关).circ"文件可能包含一组逻辑电路图,用于模拟储存器的功能和操作。在这个文件中,你可能会看到各种各样的组件,例如触发器、锁存器和多路选择器等。这些组件可以用来存储和读取数据。 如果你已经通关这个文件,那么你可能已经成功地设计并实现了一个储存器电路。在这个过程中,你可能需要理解储存器的工作原理,例如如何使用触发器来实现数据的稳定存储和时序控制等。通过通关这个文件,你可能已经掌握了如何设计和使用储存器电路的能力。 储存器在计算机中起着至关重要的作用。无论是用于存储程序代码、用户数据还是操作系统数据,储存器都是计算机系统的核心组成部分。通过设计和实现储存器电路,你已经迈出了了解计算机体系结构和编程的重要一步。 总而言之,“storage(已通关).circ”是一个描述储存器功能和操作的计算机编程文件。通过通关这个文件,你可能已经成功地设计和实现了一个储存器电路,并对计算机体系结构有了更深入的了解。 ### 回答3: storage(已通关).circ是一个文件名,它表示已经通过了存储问题的一种解决方案。在计算机领域,存储是指将数据保存在某种介质中以供将来使用的过程。 在storage(已通关).circ文件中,这可能是一个存储相关的电路设计文件。这个文件可以包含了一些存储设备的相关配置和连接信息。存储电路是计算机中非常关键的一部分,它用于存储和检索数据。 根据文件名中的“已通关”,我们可以假设该文件代表了一个已经通过测试或验证的存储电路设计。通关可能意味着该电路满足了规格要求并且能够正常运行。 在计算机存储中,常见的存储设备包括硬盘驱动器、固态硬盘、光盘、闪存驱动器和云存储等。存储通常被划分成两种基本形式:主存储器(RAM)和辅助存储器。 主存储器是计算机中用于存储正在运行的程序和数据的临时存储区域。它通常由固定数量的存储单元组成,每个存储单元都能通过唯一的地址进行访问。主存储器具有快速访问速度,但是断电后会丢失数据。 辅助存储器用于长期存储数据和程序。它通常用于存储操作系统、应用程序、文档和其他需要持久保存的数据。辅助存储设备有不同的容量和速度。其中,硬盘驱动器是一种常见而且容量较大的存储设备,固态硬盘则拥有更快的读写速度。 总之,根据文件名中的信息,storage(已通关).circ可能是一个已经通过测试的存储电路设计文件。它描述了一个满足规格要求并能够正常工作的存储解决方案。这个文件可能包含了一些关于存储设备的配置和连接信息。存储在计算机中扮演着至关重要的角色,它用于保存数据以备将来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值