首页 > 其他分享 >mit6.824lab2D-Debug记录

mit6.824lab2D-Debug记录

时间:2024-02-04 09:03:58浏览次数:38  
标签:快照 索引 prevLogIndex 条目 start Debug 日志 mit6.824 lab2D

1.死锁

img
要提交快照的时候由于没有人取走applyCh通道里面的东西,导致死锁。

具体解释:

2D的测试代码中在日志达到一定大小时会调用snapshot,该函数需要申请rf.mu这个互斥锁。而在提交普通的日志条目时,错误地没有先释放锁,导致snapshot无法进行下去,相关的进程卡在rf.mu这个锁上,无法完成快照,更无法处理applyCh通道的下一个日志条目。这导致了向通道中提交日志条目也会因为applyCh已满而被阻塞。

2.快速定位错误

img
可以看到打印的日志中出现了“whe: u4"的信息,就可以推知:相关的错误发现在被u4标记的代码处,

在访问日志具体条目的代码处,传入相应的标记,这样当调用getEntry函数失败时,能快速定位目标。

3.由于截断日志增加的处理

3.1

img

发生u4报错,定位到相应代码。

在leader方,由于prevLogIndex处的日志条目被截取,小于rf.log.start(), 在运行getEntry函数时发生报错。

解决方法:

1.设置prevLogIndex = rf.log.start()

2.应发送给follower的日志条目被删除,直接发送快照给follower。

3.2

出错的点在于follower这边:leader方发送出去的时候prevLogIndex没有低于其自身的start,故没有发送快照,但是接收方收到日志条目之后,由于已经截断了日志,并不能匹配prevLogIndex。

显然接收方对这种情况也需要处理,并不能仅仅返回个error就完事了。

解决方案:

设置XLen为start()+1, 即日志中的第一个条目,leader在收到回应的时候会执行nextIndex[i] = XLen, 这样就将nextIndex设置为follower方的日志第一个条目。

3.3

当prevLogIndex等于start时候,由于不匹配可能导致添加条目无法成功。

在截断日志的时候需要设置占位的条目的term为snapshot.term;无论是安装快照的时候,还是自己截断日志、生成快照的时候.

4关于应用(apply)时索引的思考

这是崩溃之前发送的消息,可以看出发送的最后一个索引号是223

这是重启之后,接收快照后而开始apply的快照,索引为229。

显然:

当start/restart后, 如果先发送的是日志条目,索引只能从1开始;但是如果是快照的话,索引可以从任意值开始,而其后的日志条目的索引值只需从该值递增即可。

一个有趣的发现:

TestSnapshotInstallUnCrash2D 每次只会使一个server崩溃,而TestSnapshotAllCrash2D 将会使得所有server同时崩溃;前者会使得commitIndex能够维持在正确值,而不回退,而后者会使得commitIndex从0开始。

5.发现不能通过从快照中恢复的测试

增加打印语句之后,发现restart之时都是没有带上快照的,这已经很说明问题了。

我并没有实现从稳定存储中读取快照的方法。

增添语句后,即可通过所有测试。

最终效果

整个实验2大致需要花费364秒左右,还是很满意的。

标签:快照,索引,prevLogIndex,条目,start,Debug,日志,mit6.824,lab2D
From: https://www.cnblogs.com/Techwarrior/p/18005542/RaftReverie

相关文章

  • Qt Access violation - code c0000005 debug write access violation
    WhentryingtodebugmyQtapplication,theappthrowaexceptionas"Exceptionat0x77da2073,code:0xc0000005:writeaccessviolationat:0x1,flags=0x0"IamusingQtcreatorandvs2005compileranddebugger. Iloadtheprojectonvs2005a......
  • 如何用Python调试 debug
    什么是调试,为什么我们需要调试这里借用南京大学蒋炎岩老师的ppt在计算机中,我们将机器看作状态机,同时我们遵循计算机不会犯错的原则,因此,当你设计的程序产生了与你意料相悖的结果,那就可以认为你的程序产生了bug。调试理论中的状态机我们将程序可以看成一个状态机,程序的不断......
  • Qt Creator Debug不显示变量的值
    参考:QtCreatorDebug不显示变量值(nosuchvalue)_qtnosuchvalue-CSDN博客【Qt开发笔记】Qt使用GDB调试时无法监视变量值问题_qtgdb远程调试变量优化无法看值-CSDN博客......
  • Debug: ERROR: Directory '*py3-none-any.whl' is not installable. Neither 'setup.
    [ERROR:Directory'*py3-none-any.whl'isnotinstallable.Neither'setup.py'nor'pyproject.toml'found.]kubectllgostrainer-pod-name-nkubeflow-->,pipeline_info=id:"detect_anomolies_on_wafer_tfdv_schema"......
  • Visual Studio 2015+Qt编程,如何使用qDebug()打印出信息
    问题:VisualStudio2015+Qt编程,调试程序的时候,使用qDebug()发现在vs的输出界面没有打印出qDebug()的信息。找到了最容易的解决办法(此方法只可以解决此解决方案的):1.项目文件名那里鼠标右键,点击属性,打开属性页 2.找到连接器->系统->子系统 3.将子系统由窗口改为控制台,点击......
  • Debug: mysql_real_connect failed: errno: , error
    [ERROR:mysql_real_connectfailed:errno:,error]kubectllogstransform-pod-name-nkubeflow-->INFO:absl:MetadataStorewithgRPCconnectioninitializedWARNING:absl:mlmdclientInternalError:mysql_real_connectfailed:errno:,error:ERROR:absl:......
  • goland开启debug模式的修复
    1、使用下载的老版golandide工具,使用debug模式无法正常生效:异常信息是因为goland中的dlv.exe版本太老,也就是dlv.exe不能适配最新的go版本:errorlayer=debuggercouldnotpatchruntime.mallogc:notypeentryfound,use'types'foralistof2、处理方案:goinstallg......
  • html 禁止f12调试代码 debugger
    setInterval(()=>{(function(a){return(function(a){return(Function('Function(arguments[0]+"'+a+'")()'))})(a)})('bugger')('de',0,0,(0,0));},1000);js代码放到HTMLscrip标签块中即可......
  • Advanced .Net Debugging 1:你必须知道的调试工具
    一、简介   我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一些临时性的代码审查。这里的临时性是指,通过猜测来推断问题可能来之哪个部分的代码。有时候,开发人员会幸运的发......
  • keil的调试模式debug
    (1)工程选项,debug这里可以对调试选项进行配置(2)左边的是使用仿真器,右边是默认的在硬件上在线仿真(3)编译一下工程确保没有问题(4)然后点击这里的放大镜里面带各地的图标,进入调试模式(5)主窗口是我们C语言程序,上面的窗口就是C语言翻译成的汇编程序,然后左边这个窗口是寄存器组和状态标志......