- 博客(35)
- 收藏
- 关注
原创 golang中math.rand函数的一个坑
在做raft2A实验时,遇到一个奇怪的bug,经常会选不出leader,然后想打印日志查看原因发现又能够选出来了,进入了出问题我想看日志,看日志又没问题的奇怪循环中。后来在过整个代码时发现在我重启选举计时器时,又重置了随机种子,而我把这个删去只在初始化过程中重置一次的随机种子,发现整个流程就跑通了。...
2022-08-01 11:44:06 1083 1
原创 【Go语言学习】——go 数据结构底层原理
go中的数组是由固定长度的特定类型元素组成的序列,数组的长度是数据类型的组成方式,所以不同长度和不同类型的元素组成的数组是不同的数组类型。数组属于值类型,因此在复制或者传递参数时,会对整个数组内容进行复制,所以在调用的函数中修改数组的值不会影响到原来的数组的值。此外由于需要复制整个数组的内容,如果数组太大会导致复制成本太大, 所以可以传递数组的指针。简单的将,切片是一种简化版的动态数组。切片的在go中的定义为如下,在对切片赋值,就是修改指向数组的指针,len,cap的值。而在拷贝的时候,如果直接使用=,则会
2022-06-23 17:17:08 2461
原创 【MIT 6.824 Lab4】——Sharded Key/Value Service
本部分实验需要完成分配服务器和分片之间的控制器实验流程对象设计主要的对象为服务器ShardCtrler,指令Op,客户端ClerkShardCtrler服务器需要记录自己的编号和对应的Raft服务,以及相应的ApplyCh用于Raft服务器应用,也可以通知自身日志已经存储完成。存储所有的config的信息,并且设置通道用于通知服务器对应的指令是否已经在Raft处存储完成,为了防止不同的客户端请求不重复,设置lastRequestId记录每个客户端上次请求的ID。Op指令需要记录类型,并且记录请求的客户
2022-06-13 10:42:11 483
原创 【MIT 6.824 Lab3】——Fault-tolerant Key/Value Service
本部分需要基于Lab2的Raft建立K-V数据库,实现get,put,append的功能。实验流程对象设计主要的对象有服务器KVServer,操作指令Op,客户端Clerk。KVServerK-V服务器需要记录自己的编号和对应的Raft服务,以及相应的ApplyCh用于Raft服务器应用,也可以通知自身日志已经存储完成。并且需要存储日志应用后得到的数据data,并且设置通道用于通知服务器对应的指令是否已经在Raft处存储完成,为了防止不同的客户端请求不重复,设置lastRequestId记录每个客户端上次请
2022-06-13 10:42:02 301
原创 【MIT 6.824 Lab2】——Raft
2.如果匹配,则直接向后检索到第一个发生冲突的日志然后将日志新增在后面。3.如果都匹配但是新增日志比当前的长,则直接把新增日志添加在preLogIndex后。上述判断主要遵循raft的以下准则1.如果两个不同的日志实体有相同的index和term,则这两个日志实体存储的内容相同。(leader只能增加,不能删除和修改)2.如果两个不同的日志实体有相同的Index和term,则这两个日志前的所有日志都是相同的。(follower需要prevLogIndex对的上才能新增)......
2022-06-13 10:41:49 659
原创 【MIT 6.824 Lab1】——MapReduce
输入文件被分成M个数据片段,然后经过阶段后得到许多的以键值对形式的中间文件,最后经过阶段后得到最终结果。整个阶段由两类程序控制,其中一个是程序,其余是多个程序,程序用于分配调度任务给各个程序,程序则执行或任务。实验总览实现一个基于MapReduce机制的单词计数,输入是在下的以命名的文件,希望得到对这些文件所有出现的单词分别计数的结果的文件。执行过程要求先启动一个作为导入输入文件,等待的请求。然后启动一个到多个的,这些需要载入对应的函数和函数,然后向请求任务,按照得到的任务类型分别执行或者实验流程对象...
2022-06-10 11:45:04 475 1
原创 【Go语言学习】——包
包程序编译后,首先会从main进入,然后将import下所有的导入路径的文件夹下所有的go文件和原来的文件打包编译成二进制程序。init()初始化函数在Go语言程序执行时导入包语句会自动触发包内部函数的调用。 函数没有参数也没有返回值,只有一个。 函数在程序运行时自动被调用执行,不能在代码中主动调用它。init没有参数也没有返回值,一个包里面可以有多个init函数。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-peWiSIDD-1654774542412)(Go学习.....
2022-06-09 19:36:07 259
原创 【Go语言学习】——切片与引用类型
用于扩充切片的大小,它的本质是为一个切片里的内容和需要新增的元素或者切片内容重新形成切片,如果新的切片所需要的容量小于(删除操作)第一个切片参数的容量,则用原来的内存,如果大于则需要开辟一块新的内存,然后返回这块新的区域的地址,扩容策略如下。切片是拥有相同元素类型的可变长度的序列,支持自动扩容,而且是一个引用类型,它的内部结构有地址,长度和容量,一般用于快速操作一块数据集合。切片的长度就是它元素的个数,切片的容量为切片指向的底层数组的第一个到最后一个元素(包括它们自身)的元素的数量。...
2022-06-07 17:32:37 605
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人