6.824 Lab2 PartB实验部分

2024-02-26 03:38
文章标签 实验 部分 lab2 6.824 partb

本文主要是介绍6.824 Lab2 PartB实验部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试文件内容分析

func TestBasicAgree2B(t *testing.T) {servers := 3cfg := make_config(t, servers, false)defer cfg.cleanup()cfg.begin("Test (2B): basic agreement")iters := 3for index := 1; index < iters+1; index++ {// 开始对应index处不应该有任何日志记录nd, _ := cfg.nCommitted(index)if nd > 0 {t.Fatalf("some have committed before Start()")}// 调用start在里面创建日志记录,日志内容为index*100,并等待一段时间观察是否全部日志都已通过心跳发送到followerxindex := cfg.one(index*100, servers, false)if xindex != index {t.Fatalf("got index %v but expected %v", xindex, index)}}cfg.end()
}

go test使用技巧

执行语句为 go test -run 2B

这里run后面的参数会通过正则表达式与测试文件里出现过的全部测试函数名进行匹配,如果有重合部分就会执行,因此这里如果2B也可以写为B

如果只想针对某个测试函数进行debug,例如TestBasicAgree2B,可以改为:

go test -run TestBasicAgree2B

并发范式说明

for index, _ := range list {go func(server int) {fmt.Printf("%d\n", index) // 不应该为index,而是应为server}(index)}

因为前后写代码时间相隔较大,生疏了写法,在for循环里go func时仍然使用外部的index,而执行go func时index早已变成最大值,导致最后输出的全部内容一致

正确写法:go func里printf的index改为server

PartC部分主要错误原因

// 这里需要按照args的信息进行更新而不是直接更新,以防止因为网络延迟出现重复添加的问题
// rf.nextIndex[server] += len(args.Entries)
rf.nextIndex[server] = args.PrevLogIndex + len(args.Entries) + 1
rf.matchIndex[server] = rf.nextIndex[server] - 1

需要考虑网络延迟的问题

可能会出现nextIndex先出现100,再变回90的情况

也可能出现一个term类似情况,比如prev=4,len(logs)=90和prev=4,len(logs)=100发两次的情况,直接加会出现重复计算的问题

这篇关于6.824 Lab2 PartB实验部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747607

相关文章

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

关于断言的部分用法

1、带变量的断言  systemVerilog assertion 中variable delay的使用,##[variable],带变量的延时(可变延时)_assertion中的延时-CSDN博客 2、until 的使用 systemVerilog assertion 中until的使用_verilog until-CSDN博客 3、throughout的使用   常用于断言和假设中的

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信