做这个实验,最能学习的地方就是调试和思考的过程了,如果你直接参考了别人的思路或者代码,那么对于你来说,这个实验能学习到的东西则会大大减少
记录 MIT 6.824 Lab 2 中 Part A的一些想法以及思路,如果错误,还请指出,谢谢
Lab 2 的链接如下http://nil.csail.mit.edu/6.824/2015/labs/lab-2.html,其中 Part A 要求实现一个 ViewService,根据 Service 的状态,进行相应的 View 切换(这里 View 表示当前能提供服务的 Server 以及相应的状态组合,ViewService 提供 View 的增删改查功能),这里将该 Lab 的两个部分分开来写。
Part A 实现 ViewService 的整个功能,ViewService 需要保证如下几点:
Part A 的要求实现如下三个函数:
func (vs *ViewServer) Ping(args *PingArgs, reply *PingReply) error {} func (vs *ViewServer) Get(args *GetArgs, reply *GetReply) error {} func (vs *ViewServer) tick() {}
其中 Ping 接受 Server 发送过来的信息,并更新 View 的相应情况,Get 获取当前的 View,tick 则是一个回调函数,在固定时间内调用一次,检查 primary 和 backup 是否已经宕机,这里我实现的 Get 很简单,直接返回当前 View(在 ViewServer 里面定义一个字段 curView 用来表示当前 View),其他两个才是重点
先把我定义的 ViewServer 贴一下(这个应该不算贴代码吧),下面能够更好的进行描述
type ViewServer struct { mu sync.Mutex l net.Listener dead int32 // for testing rpccount int32 // for testing me string // Your declarations here. lastPing map[string]time.Time //记录 server 上次请求的时间,用来判断是否宕机 curView View //当前 View hasView bool //当前是否有 View 存在 hasAcked bool //Primary 是否已经 ack 了当前 View secondBackup string //将要被提升为 backup 的server }<br>
先说 tick,在 tick 中,首先我们需要知道 primary 是否已经 ack 了当前 View,如果没有 ack,那么就直接返回即可,如果 ack 过了当前 View,那么就继续进行下面的操作(下面的操作必须在 primary ack 过了当前 View 之后才能进行)
然后解析来是 Ping 函数
当然,Ping 和 tick 函数 需要考虑加锁的问题,如果只为了通过测试,可以不加锁,测试都是串行的请求(有 goroutine)
思路整理之后发现也不是太难,不过过程中还是有不少细节需要注意,如果可以,最好是自己进行思考,然后不断的调试,通过打印日志,思考是否符合自己的理解,然后进行代码的调整
您可能也喜欢: | ||||
![]() MIT 6.824 2015 Lab 1 记录 |
![]() VC++ 6 CListCtr添加图片以及不显示文字的问题 |
![]() Algorithms第六章动态规划 |
![]() 《此生未完成》---于娟 |
![]() 痛·快二零一四 |
无觅 |