当前位置: 首页 > news >正文

mit6.824 lab2c-数据持久化

目录

  • 2c简介
  • 2b、2a问题
  • 测试时间

2c简介

简单的说,raft需要将currentTermvoteForentries(当前的所有日志)保存到硬盘进行持久化存储。

保存的方法:在变量改变时,利用persist()中的gob将变量序列化,存储在persister结构体中。(实验不需要真正保存在硬盘上,用persister结构体代替。)

读取的方法:在服务器重启时,利用readPersist()读取保存的序列化参数,并解码成对应变量输入raft中。

test 2c 报错的主要原因是2b、2a的问题,总结下通过c找出的问题。

2b、2a问题

1.在leader更新follower服务器的日志时,如果更新成功,则修改nextIndex[server]、matchIndex[server]。
修改matchIndex时:

rf.nextIndex[i] = len(rf.entries) //?即使错了还能回滚
rf.matchIndex[i] = len(rf.entries) - 1 //错误
rf.matchIndex[i] = rf.nextIndex[i] - 1 //错误
rf.matchIndex[i] = args.PrevLogIndex + len(args.Entries)

有可能在appendEntries()后,客户往raft中加入了若干command,导致日志长度发生变化。计算matchIndex时,使用了错误的日志长度会导致以下提交错误。
在这里插入图片描述

2.leader更新follower日志成功时,commitIndex应该为(大多数)比当前commitIndex大的matchIndex中最小的一个,而不是每次提交成功后commitIndex++

如果存在N > commitIndex(本地待提交日志的索引),majority(matchIndex[i]>=N)(如果参与者大多数的最新日志的索引大于N),并且这些参与者索引为N的日志的任期也等于leader的当前任期:commitIndex =N(leader的待提交的日志索引设置为N)(5.2和5.4节)。

简单的说,commitIndex应该为matchIndex[]排序后的中位数,前提是这个中位数大于当前commitIndex。
一个简单的O(n)算法:

	//更新commitIndexres := 0minBiggerMatchIndex := 99999999 //比commitIdx大的最小值for i := 0; i < len(rf.matchIndex); i++ {if rf.matchIndex[i] > rf.commitIndex {res++minBiggerMatchIndex = int(math.Min(float64(rf.matchIndex[i]), float64(minBiggerMatchIndex)))}}//TODO 每次RPC只加1太慢了if res > len(rf.peers)/2 {rf.commitIndex = minBiggerMatchIndex}

3.提交时,先对entries进行深拷贝,可以避免数据竞争。

entriesToApply := append([]Log{}, rf.entries[(rf.lastApplied+1):(rf.commitIndex+1)]...)

测试时间

最后贴个lab2c测试时间:

Test (2C): basic persistence ...... Passed --   3.9  3   76   21621    6
Test (2C): more persistence ...           ... Passed --  17.2  5  928  218116   16
Test (2C): partitioned leader and one follower crash, leader restarts ...... Passed --   2.1  3   40   11352    4
Test (2C): Figure 8 ...... Passed --  41.9  5 1369  312992   59
Test (2C): unreliable agreement ...... Passed --   3.1  5  332  131912  246
Test (2C): Figure 8 (unreliable) ...... Passed --  38.0  5 11171 21985710  193
Test (2C): churn ...... Passed --  16.3  5 1596 1588205  667
Test (2C): unreliable churn ...... Passed --  16.3  5 1800 1136899  419
PASS
ok      6.5840/raft     139.113s

相关文章:

mit6.824 lab2c-数据持久化

目录2c简介2b、2a问题测试时间2c简介 简单的说&#xff0c;raft需要将currentTerm、voteFor、entries(当前的所有日志)保存到硬盘进行持久化存储。 保存的方法&#xff1a;在变量改变时&#xff0c;利用persist()中的gob将变量序列化&#xff0c;存储在persister结构体中。&a…...

leaflet使用L.geoJSON加载文件,参数filter的使用方法(127)

第127个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载geojson文件,这里介绍filter的使用方法。filter将用于决定是否包含某个功能的函数。 默认是包括所有特征。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…...

23年5月高项学习笔记7—— 质量管理

质量通常指产品质量&#xff0c;也包括工作质量&#xff08;即过程&#xff09;&#xff0c;产品质量是指产品的使用价值&#xff0c;工作质量是产品质量的保证&#xff0c;反映了产品质量直接相关的工作的对产品质量的保证程度。 公差&#xff1a;结果的可接受范围 项目合同…...

学编程需要哪些基础呢?一起来看看吧

众所周知程序员薪酬高、工作环境好&#xff0c;是很多人向往的职业&#xff0c;那么学编程需要什么基础&#xff1f;0基础能学编程吗&#xff1f; 学编程需要什么基础&#xff1f; 1、数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的&…...

PECS In Java泛型类型通配符限定之<? extends T>与<? super T>

泛型类型通配符限定 &#x1f686;PECS | 类型通配符限定如何使用“<? extends T>”和“<? super T>”通配符java源码示例PECS | 类型通配符限定 PECS原则是指在使用泛型时&#xff0c;当我们需要传递一个泛型集合时&#xff0c;如何选择适当的泛型类型通配符来…...

电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…...

admin Tips

1 获取 当前浏览器 url new URL(window.location.href)...

ToBeWritten之Radare2 使用教程

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

实时翻译屏幕插件

程序插件的功能是&#xff1a;点击按钮&#xff0c;将获取屏幕截图&#xff0c;然后翻译输出图片。&#xff08;目前只支持翻译英语&#xff09; 要实现这个功能&#xff0c;我们可以使用Python编程语言&#xff0c;结合一些库来完成。以下是一个简单的实现方案&#xff1a; …...

代码随想录算法训练营第二天| 977,209,59

977.有序数组的平方 * 数组平方后&#xff0c;最大值一定是在两侧 因为可以采用双指针 package algor.trainingcamp;import java.util.Arrays;/*** author lizhe* version 1.0* description: https://leetcode.cn/problems/squares-of-a-sorted-array/** 有序数组的平方* 给…...

echarts 地图板块点击着色,移除着色

//选择省份变色 showProvince(name) { this.oldName name; this.mapChart && this.mapChart.dispatchAction({ type: geoSelect, name }) }, //移除上次点击变色 hideProvince() { this.mapChart && this.mapChart.dispatchAction({ type: geoUnSelect, name:…...

Visual Studio Code (vscode)自定义用户代码段快速打出for循环等

比如fori这样的快捷键就打不出代码块了 自定义用户代码块的方法: 工具栏 > 文件 > 首选项 > 用户代码片段 然后在弹出的搜索框中填写javascript.json 有提示 不用打全就行 (会有javascript选中) 打开配置文件javascript.json 这里面显示的就是编写代码块的例子 "…...

RocketMQ客户端配置详解

文章目录 ClientConfignamesrvAddrinstanceNameclientIPclientCallbackExecutorThreadspollNameServerIntervalheartbeatBrokerIntervalpersistConsumerOffsetIntervalvipChannelEnabledDefaultMQProducerproducerGroupcreateTopicKeydefaultTopicQueueNumssendMsgTimeoutcompr…...

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据

STM32基于STM32CubeMX DMA EXTI读取DS1307数据✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取&#xff0c;请多多尊重和支持原创!&#x1f341;对于文中所提供的相关资源链接将作不定期更换。&a…...

C#中的枚举器和迭代器

目录 一、可枚举类型和枚举器 1. 枚举器 2. 可枚举类 3. 使用 IEnumerable 和 IEnumerator 案例 4. 泛型枚举接口 二、迭代器 1. 使用迭代器创建枚举器 2. 使用迭代器创建可枚举类 3. 常见的迭代器模式 4. 产生多个枚举类型 5. 将迭代器作为属性 6. 迭代器的实质 一…...

中山大学人工智能学院——考研上岸经验贴

文章目录初试个人基本情况408数学英语政治复试初试 首先是初试成绩&#xff0c;中山大学在2.21号就公布了成绩和排名&#xff0c;这点很不错&#xff0c;有很多学校只公布成绩而没有排名。我的初试总分386&#xff0c;总排名第二&#xff0c;各个科目还是比较平均的&#xff1…...

ThreeJS-圣诞节表白3D贺卡(三十)

素材分享&#xff1a; 链接: https://pan.baidu.com/s/1l0mZWfkiLaXJfdvZ7XoY8w 提取码: i69h 提前预知&#xff1a; 向下滚动鼠标滑轮切换视角 关键代码&#xff1a; //初始化渲染器 const render new THREE.WebGLRenderer({ //设置抗锯齿&#xff0c;防失真 antialis: …...

040:cesium加载World Terrain地形图

第040个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载世界地形图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共64行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozh…...

逻辑运算和位移指令

逻辑运算指令 AND OR NOT XOR TEST 逻辑位移指令 SHL SHR 算术位移指令 SAL SAR 小循环位移指令 ROL ROR 大循环位移指令 RCL RCR AND 逻辑与指令 汇编格式&#xff1a;AND 目的操作数&#xff0c;源操作数 执行操作&#xff1a;&#xff08;目的操作数&#xff09;&…...

大家现在都去做Linux运维了吗?

运维自互联网出现以来&#xff0c;都是以基础技术部门的形式出现在各个互联网公司或者其他需要网络设备的公司里面&#xff0c;职位由来已久&#xff0c;也是多次徘徊在被淘汰的边缘。很多运维人都是靠着自己良好乐观的心态坚持到现在&#xff0c;接受新技术并学习新技术&#…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...