当前位置: 首页 > 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;接受新技术并学习新技术&#…...

Webpack的编译流程是怎么样的?webpack是如何工作的?

Webpack是一款非常流行的前端构建工具&#xff0c;用于将多个模块打包成一个或多个静态资源。它的工作原理是将模块的依赖关系图转化为最终的静态资源。Webpack的编译流程是一个非常复杂的过程&#xff0c;本文将从四个方面详细介绍Webpack的编译流程&#xff0c;分别是入口点分…...

【ZOJ 1151】Word Reversal 题解(字符串+模拟)

问题描述 对于每个单词列表&#xff0c;在不改变单词顺序的情况下&#xff0c;将每个单词反转输出一行。 此问题包含多个测试用例&#xff01; 多重输入的第一行是整数N&#xff0c;然后是空行&#xff0c;后面跟着N个输入块。每个输入块 采用问题描述中所示的格式。输入块之间…...

Dart语言操作符?和!的用法

一.基本使用 1. ? 操作符跟在类型后面&#xff0c;表示当前变量可为null。 int a null; //这句代码在有空安全时&#xff0c;编译会提示错误如果想给一个变量赋值null要如何处理呢&#xff1f;只需要在类型 后面添加操作符&#xff1f;即可&#xff0c;eg: int? a null…...

聚类 kmeans | 机器学习

聚类 刘建平 1、算法原理&#xff1a; 是一种无监督学习算法&#xff0c;其主要目的是将数据点分为k个簇&#xff0c;距离近的样本具有更高的相似度&#xff0c;距离近的划分为一个簇&#xff0c;一共划分k个簇&#xff0c;**让簇内距离小&#xff0c;簇间距离大。**距离是样…...

求职咨询Job Information

前言 加油 原文 求职咨询常用会话 ❶ I want to apply for a job which enables me to use my major. 我想要申请一个能用到我的专业知识的职业。 ❷ I have the capability of operating the computer. 我有操作电脑的能力。 ❸ My dream is to be an excellent interpret…...

怎么去除pdf文件的水印?好用软件说明

怎么去除pdf文件的水印&#xff1f;在某些情况下&#xff0c;PDF 文件的水印可能会影响文件的可读性和美观度。为了解决这个问题&#xff0c;您可以考虑使用其他方法来标记文档&#xff0c;例如添加页眉或页脚。另一种选择是使用透明度更低的水印&#xff0c;这样它就不会太过分…...

1-ELK+ Elasticsearch+head+kibana、企业内部日志分析系统

ELK:日志收集平台 ELK由ElasticSearch、Logstash和Kibana三个开源工具组成&#xff1a; 概念图 组件介绍 1、Elasticsearch&#xff1a; ElasticSearch是一个基于Lucene的开源分布式搜索服务。只搜索和分析日志 特点&#xff1a;分布式&#xff0c;零配置&#xff0c;自…...

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…...

商品推荐Promoting Products

目录 前言原文内容:推荐常用会话商品推荐常用会话商品推荐常用会话前言 加油 原文内容: ❶ I promise that our product is superior. 我承诺我们的产品比别的家的好。 ❷ Our product is very attractive to young people. 我们的产品很吸引年轻人。 ❸ I want to buy th…...

整懵了,蚂蚁金服4面成功拿下测开offer,涨薪6k,突然觉得跳槽也不是那么难

蚂蚁的面试挺独特的&#xff0c;每轮面试都没有HR约时间&#xff0c;一般是晚上8点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其他时间。 全程4面&#xff0c;前四面技术面&#xff0c;电话面试&#xff0c;最后一面是HR面…...