ATS小文件读:

小文件读:
HttpSM::set_next_state
HttpSM::do_cache_lookup_and_read
HttpCacheSM::open_read
HttpCacheSM::do_cache_open_read
1.  CacheProcessor::open_read 
2.  Cache::open_read  //new_CacheVC
3.  CacheVC::do_read_call
4.  CacheVC::handleRead
5.  CacheVC::handleReadDone
6.  CacheVC::openReadStartHead
7.  CacheVC::callcont
8.  CacheVC::openReadMain
9.  CacheVC::calluser
10. CacheVC::die
11. CacheVC::openReadClose
12. free_CacheVC  

小文件读的逻辑相对简单,类Cache提供的方法open_read首先通过Cache::key_to_vol方法定位到从哪个Vol中查找object。要查找一个object在不在cache中,只需要查询是否有索引保存object的元信息即可。open_read函数调用全局 dir_probe 函数查找object对应的索引,如果查询到,说明object保存在cache中,并创建一个CacheVC对象,同时调用CacheVC::do_read_call,进入CacheVC的读操作。
do_read_call函数调用handleRead,该函数主要判断读取object内容的位置:
(1) 如果object在 ram cache 中,则走 ram cache 查找。
(2) 如果object在 mem cache 中,则走 mem cache 查找。从源码中可以很清楚看到,ts的mem cache命中是很naive的,如果此次读请求与上次读请求的object是相同的,则mem cache命中。
(3) 如果object在Vol的agg buffer中,则从agg buffer中直接命中。
(4) 如果(1)(2)(3)条件皆不成立,这时候就走磁盘查找了,这时Vol分配cache读任务给一个aio线程,进入异步读操作。
在handleRead完成后,这时候进入handleReadDone,这个函数的主要任务是如果object不是内存命中时,这时候需要将object加载到内存中去。该函数结束后就进入到openReadStartHead函数,该函数将读取出来的object的head部分读取到数据结构CacheHttpInfoVector中。对于小文件,openReadStartHead通过回调函数callcont告诉上层Continuation读操作已经准备就绪,上层Continuation指示CacheVC调用openReadMain,将读取出来的数据写到指定buffer中以便它来读取,openReadMain在做完这一切后,通过回调函数calluser告诉上层Continuation读操作完成,此时Continuation调用CacheVC的do_io_close函数告诉CacheVC可以进行close read操作了,CacheVC这时候执行die函数,进一步调用openReadClose,执行free_CacheVC释放对象。至此,一个读操作完成。

62K小文件读:
CacheProcessor::open_read
Cache::open_read
dir_probe
CacheVC::do_read_call
CacheVC::handleRead
CacheVC::handleReadDone
CacheVC::openReadStartHead
HttpTransactCache::SelectFromAlternates
CacheVC::callcont
CacheVC::openReadMain
CacheVC::calluser
CacheVC::die
CacheVC::openReadClose

 

 

你可能感兴趣的:(ATS)