1.死锁



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

具体解释:

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

2.快速定位错误



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

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

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

3.1

发生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秒左右,还是很满意的。

mit6.824lab2D-Debug记录的更多相关文章

  1. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  2. sriov-网络问题Debug记录

    我司容器云平台使用了sriov的底层网络模型,这个网络驱动的好处是配置少,转发效率高,但是缺点也很明显,出了问题比较难Debug. 现就工作中出现的问题记录如下: 容器删除后,或者docker进程异常 ...

  3. jsp 错误码debug记录与总结

    500: 编码错误: 无法向cookie中写入中文字符串 需要使用URLEncoder.Encode()在写入处进行转码,使用URLDecoder.decoder()在读取处进行解码 或者使用requ ...

  4. Debug记录(1)

    今天下午在给nRF52832写程序时,莫名遇到了这个错误 错误id是一个很奇怪的数. 原代码如下: static void timers_init(void) { uint32_t timer_err ...

  5. 流媒体技术学习笔记之(十五)FFmpeg编码遇到的错误、警告、Debug记录

    When encoding H.264 using ffmpeg I get the following type of warnings en masse: Past duration 0.6063 ...

  6. k8s debug记录之kubelet user.slice container monitor failure

    在kubernetes中,如果使用其自带的单机启动脚本./hack/local-up-cluster.sh来启动一个本地集群的话,会在kubelet的日志中观察到类似以下内容的日志: Failed t ...

  7. 【Debug记录】Exeption thrown by glCreateVertexArrays

    继在机场丢失笔记本后又一大灾难--小组项目无法在老电脑上运行. 位置:glCreateVertexArrays函数 报错:Exception thrown at 0x00000000 in Clien ...

  8. 第一篇博客关于Log4net的配置记录

    说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...

  9. 记录Log4Net的使用

    最近项目中有一个记录错误日志的功能模块,以前采用的是写TXT的做法.代码如下 /// <summary> /// 写入日志 /// </summary> public stat ...

  10. 【TP3.2】:日志记录和查看

    1.TP3.2手册日志类链接:http://document.thinkphp.cn/manual_3_2.html#log 2.日志默认路径:/Application/Runtime/Logs 3. ...

随机推荐

  1. 前端科普系列(5):ESLint - 守住优雅的护城河

    作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...

  2. vivo 全球商城:从 0 到 1 代销业务的融合之路

    代销是 vivo 商城已经落地的成熟业务,本文提供给各位读者 vivo 商城代销业务中两个异构系统业务融合的对接经验和架构思路. 一.业务背景 近两年,内销商城业务的发展十分迅速,vivo 商城系统的 ...

  3. Spring Boot 2.x :日志框架@Slf4j的使用和logback文件配置

    为什么是SLF4J? 默认情况下,Spring Boot会用SLF4J + Logback来记录日志,并用INFO级别输出到控制台. 怎么使用SLF4J? 如果我们在一个Spring Boot 的程序 ...

  4. 云原生 Serverless Database 使用体验

    作者 | 李欣 近十年来互联网技术得到了飞速的发展,越来越多的行业加入到了互联网的矩阵,由此带来了更为丰富且复杂的业务场景需求,这对于数据应用系统的性能无疑是巨大的挑战.​ 关系型数据库 MySQL ...

  5. JVM简单概述

    一.内存模型&分区 Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区 在运行时数据区里,会根据用途进行划分为以下模块: 1.Java虚拟机栈 2.本地方法栈 3.Java ...

  6. PHP安全之道学习笔记6:密码安全

    PHP安全之道:密码安全    最近几年用户数据泄露越发频繁,一些使用PHP技术的大型网站被暴库或者脱库,facebook公司曾因为此类事件股价暴跌.从长远发展来看,用户的数据安全对于网站来说至关重要 ...

  7. [转帖]oceanbase 的简单介绍

    English | 中文版 OceanBase Database 是一个分布式关系型数据库.完全由蚂蚁集团自主研发. OceanBase 基于 Paxos 协议以及分布式架构,实现了高可用和线性扩展. ...

  8. [转帖]如何对minio进行性能测试和分析

    https://developer.aliyun.com/article/1006775   环境详情 server(组成集群,ec为12:4) ip hosts 硬盘 storage01 172.1 ...

  9. [转帖]Jmeter正则提取器常用的几种方式

    https://www.cnblogs.com/a00ium/p/10483741.html 使用jmeter的同学都知道,jmeter提供了各种各样的提取器,如jsonpath.Beanshell. ...

  10. FIO的再学习-不同Raid,不同磁盘性能验证

    FIO的再学习-不同Raid性能验证 背景 发现自己对iodepth的和num_jobs的理解存在偏差 找了一些资料才发现自己很多地方做的不对. 这里找到一个新资料可以进行模拟数据库的测试 测试配置文 ...