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

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...