ATS小文件写:

小文件写:
HttpSM::set_next_state
HttpSM::do_cache_prepare_write
HttpSM::do_cache_prepare_action
HttpCacheSM::open_write
1.  CacheProcessor::open_write 
2.  Cache::open_write  //new_CacheVC
3.  CacheVC::callcont
4.  CacheVC::openWriteMain
5.  CacheVC::calluser
6.  CacheVC::die
7.  CacheVC::openWriteClose
8.  CacheVC::openWriteCloseHead
9.  CacheVC::updateVector
10. CacheVC::do_write_call
11. CacheVC::handleWrite  //Vol::aggWrite
12. CacheVC::openWriteCloseHeadDone  //dir_insert, use first_key for object
13. CacheVC::openWriteCloseDir  
14. free_CacheVC  

ts源代码中各个模块的设计都是Processor+Continuation+EventSystem机制。cache层提供给其他模块的外部接口为CacheProcessor,而内部接口,则为类CacheVC。Cache::open_write通过Cache::key_to_vol方法确定使用哪一个Vol存储要写入的object,同时生成一个负责写操作流程的CacheVC对象,并通过回调函数callcont提示上层Continuation写操作已经准备好了,这时上层Continuation调用CacheVC的openWriteMain函数,由此写操作开始。
这里要解释一下Vol这个数据结构。在第一章说过,用户通过storage.config文件配置存储空间,ts对每一个存储空间根据disk layout进行格式化操作,并最终以一个Vol表示这个空间。举例来说,用户在storage.config中配置了三个裸设备,同时没有配置volume.config文件的情况下,则一个裸设备对应一个Vol。总之,一个Vol对应一个实际划分好的存储空间。Vol维护一个写队列,它是一个CacheVC的list,当Vol调用aggWrite时,则从该list中取出CacheVC并通过函数agg_copy将要写的内容拷入一个buffer中,最后将该buffer一次性写入cache。这个buffer称为agg buffer。
openWriteMain读取上层Continuation要写入cache的object的body内容。对于小文件,openWriteMain会通过回调函数calluser提示上层Continuation直到整个内容读取完毕为止。这时,上层Continuation对CacheVC调用do_io_close操作,进入die函数,并进一步进入openWriteClose函数体。openWriteClose函数通过CacheVC提供的很多位状态信息,判断这是一个小文件,从而进一步调用openWriteCloseHead函数。openWriteCloseHead函数调用updateVector函数确定是否需要更新head内容,并最终调用do_write_call进入handleWrite,执行最后的写cache操作。handleWrite将CacheVC自己加入到Vol的写cache队列中,并判断Vol当前是否正在进行写cache,如果没有,则立即命令Vol进行cache写,并进入openWriteCloseHeadDone,通过宏dir_insert,使用first_key找到索引区中对应的未使用的索引,并将相关元信息如object在磁盘上的offset等保存到该索引中。最后,CacheVC进入openWriteCloseDir函数,对于正常流程来说,这时候执行free_CacheVC释放CacheVC的内存空间,整个写操作完成。而在CacheVC命令Vol进行cache写后,Vol进入aggWrite流程,它通过将写cache任务分派给一个aio线程(aio模块),执行异步写。

62K小文件写:
CacheProcessor::open_write
Cache::open_write
CacheVC::callcont
CacheVC::openWriteMain
CacheVC::calluser
CacheVC::openWriteMain
CacheVC::calluser
CacheVC::openWriteMain
CacheVC::calluser
CacheVC::die
CacheVC::openWriteClose
CacheVC::openWriteCloseHead
CacheVC::updateVector
CacheVC::do_write_call
CacheVC::handleWrite
CacheVC::openWriteCloseHeadDone
CacheVC::openWriteCloseDir

 

ATS小文件写:_第1张图片

 

你可能感兴趣的:(ATS)