storage的整体结构和tracker很相似,因为storage涉及到写文件,因此多了几个主要的任务;主要是IO的读写任务:dio_thread_entrance;
storage 处理消息的流程: 处理连接请求: storage_accept_loop 发送事件给---->storage_recv_notify_read(FDFS_STORAGE_STAGE_NIO_INIT)---->storage_nio_init(stage--> FDFS_STORAGE_STAGE_NIO_RECV)----->client_sock_read:
在client_sock_read中处理消息事务或接收文件:
如上传文件客户端先发送STORAGE_PROTO_CMD_UPLOAD_FILE; 此时pClientInfo->total_offset还是0;所以由storage_deal_task来处理事务消息;---->storage_upload_file: 在storage_upload_file中处理消息并且用扩展文件名,时间, 文件大小等来生成storage上的文件---->填写文件信息----->把相应信息插入到IO的任务队列------>发送时间给IO处理任务,IO任务调用storage_upload_file填写的文件处理函数dio_write_file将文件内容写入磁盘;
客户端在发送STORAGE_PROTO_CMD_UPLOAD_FILE后,会调用sendfile系统接口发送文件; 此时client_sock_read调用storage_dio_queue_push将文件写任务给IO任务来处理文件写入磁盘;
storage 和tracker通信的线程是tracker_report_thread_entrance; 有几个tracker, 在storage中就创建几个线程和tracker进行通信, 这个线程的主要作用是storage的加入一个组, 和tracker进行心跳维护及数据同步。
继续。。。。。