backend/report.hh/cc:
依次处理就绪的client_fd,用recvn先接收4个字节,用ntohl转换为int型,表示后续数据的长度。
接着recvn该长度的数据:
若返回值为0,说明后续没有数据,表示该client断开连接,从clientRecord中把connectd状态设为false
若返回值不为0,则先判断buf[0],对应不同的操作,创建相应的Request对象
最后调用Request.setid(buf) Request.analyze Request.process Request.sendr
backend/request/:
首先包含一个基类(抽象类)Request(base_request.hh)
recovery_request.hh/cc:
analyze(): 对于接收到的数据,第0个字节表示操作(修复、扩容等)
第1个字节表示该操作的子类别(修复的话,只能为1)
第2-5个字节,用ntohl转换为int,表示坏盘数量,设为i
然后从0~i-1 依次读取8个字节:
前4个字节表示坏盘id,存入fail_disk_id[i]
后4个字节表示重建盘id,存储rebuild_disk_id[i]
然后最后还剩4个字节,表示相应的修复算法,存入rebuild_method
process():对于每个坏盘,从NCFS获取_global_new_dev_name 和 _global_fail_dev_name (都通过disk id获取)
然后设置坏盘属性
最后创建process_recovery_thread线程,并封装this到结构体中作为参数
process_recovery_thread():创建RecoeryModule对象,依次修复坏盘。修复时要选择修复算法(只能修复坏盘数为1或者2的情况)
最后向client发送操作结果