ATS請求處理狀態機流程(緩存命中)

如果有興趣請先簡單閱讀“ATS代碼分析概述”和“ATS代碼分析概述”。在HttpSM::handle_api_return和HttpSM::set_next_state函數分別打斷點,進入函數的時候分別打印t_state.api_next_action和t_state.next_action,

一個緩存命中的請求完整流程的堆棧信息如下。

Breakpoint 1 at 0x596c40: file HttpSM.cc, line 1580.

Breakpoint 2 at 0x5a8f40: file HttpSM.cc, line 6841.

[Switching to Thread 0x2b06a7472700 (LWP 15194)]


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$1 = HttpTransact::HTTP_API_SM_START

"t_state.next_action: "$2 = HttpTransact::STATE_MACHINE_ACTION_UNDEFINED


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$3 = HttpTransact::HTTP_API_SM_START

"t_state.next_action: "$4 = HttpTransact::HTTP_API_READ_REQUEST_HDR


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$5 = HttpTransact::HTTP_API_READ_REQUEST_HDR

"t_state.next_action: "$6 = HttpTransact::HTTP_API_READ_REQUEST_HDR


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$7 = HttpTransact::HTTP_API_READ_REQUEST_HDR

"t_state.next_action: "$8 = HttpTransact::HTTP_API_PRE_REMAP


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$9 = HttpTransact::HTTP_API_PRE_REMAP

"t_state.next_action: "$10 = HttpTransact::HTTP_API_PRE_REMAP


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$11 = HttpTransact::HTTP_API_PRE_REMAP

"t_state.next_action: "$12 = HttpTransact::HTTP_REMAP_REQUEST


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$13 = HttpTransact::HTTP_API_PRE_REMAP

"t_state.next_action: "$14 = HttpTransact::HTTP_API_POST_REMAP


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$15 = HttpTransact::HTTP_API_POST_REMAP

"t_state.next_action: "$16 = HttpTransact::HTTP_API_POST_REMAP


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$17 = HttpTransact::HTTP_API_POST_REMAP

"t_state.next_action: "$18 = HttpTransact::CACHE_LOOKUP


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$19 = HttpTransact::HTTP_API_POST_REMAP

"t_state.next_action: "$20 = HttpTransact::HTTP_API_READ_CACHE_HDR


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$21 = HttpTransact::HTTP_API_READ_CACHE_HDR

"t_state.next_action: "$22 = HttpTransact::HTTP_API_READ_CACHE_HDR


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$23 = HttpTransact::HTTP_API_READ_CACHE_HDR

"t_state.next_action: "$24 = HttpTransact::HTTP_API_CACHE_LOOKUP_COMPLETE


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$25 = HttpTransact::HTTP_API_CACHE_LOOKUP_COMPLETE

"t_state.next_action: "$26 = HttpTransact::HTTP_API_CACHE_LOOKUP_COMPLETE


Breakpoint 2, HttpSM::set_next_state (this=0x2b06b9400000) at HttpSM.cc:6841

6841      switch (t_state.next_action) {

"t_state.api_next_action: "$27 = HttpTransact::HTTP_API_CACHE_LOOKUP_COMPLETE

"t_state.next_action: "$28 = HttpTransact::SERVE_FROM_CACHE


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$29 = HttpTransact::HTTP_API_SEND_REPONSE_HDR

"t_state.next_action: "$30 = HttpTransact::SERVE_FROM_CACHE


Breakpoint 1, HttpSM::handle_api_return (this=0x2b06b9400000) at HttpSM.cc:1580

1580      switch (t_state.api_next_action) {

"t_state.api_next_action: "$31 = HttpTransact::HTTP_API_SM_SHUTDOWN

"t_state.next_action: "$32 = HttpTransact::SERVE_FROM_CACHE


以進入HttpSM::handle_api_return的各個state爲順序進行分析如下:

第一個state是HttpTransact::HTTP_API_SM_START,這個階段並沒有直接執HttpSM::call_transact_and_set_next_state函數。一開始執行了讀請求頭的函數:HttpSM::setup_client_read_request_header,這個讀操作對應的事件回調函數是之前在HttpSM::attach_client_session函數中設置的HttpSM::state_read_client_request_header。在HttpSM::state_read_client_request_header函數中如果讀操作執行的順利的話,最後執行了HttpSM::call_transact_and_set_next_state,並且帶了一個參數,HttpTransact::ModifyRequest函數。HttpTransact::ModifyRequest函數提取了一些請求相關的信息,最後執行TRANSACT_RETURN函數,進入下一個state。


第二個state是HttpTransact::HTTP_API_READ_REQUEST_HDR,這個階段call執行了HttpTransact::StartRemapRequest函數,這個函數判斷了如果不需要remap,直接執行TRANSACT_RETURN函數。如果需要remap,設置一些debug和監控信息之後執行TRANSACT_RETURN函數,第一個參數爲HTTP_API_PRE_REMAP,第二個參數爲HttpTransact::PerformRemap。


第三個state是HttpTransact::HTTP_API_PRE_REMAP,這個階段call的函數什麼都沒做直接TRANSACT_RETURN函數了,第一個參數是HTTP_REMAP_REQUEST,第二個參數是HttpTransact::EndRemapRequest。隨後在HttpSM::set_next_state中,執行了HttpSM::do_remap_request函數。接着又執行了一次HttpSM::call_transact_and_set_next_state函數,這次call了HttpTransact::EndRemapRequest函數,也即上一次call的函數最後TRANSACT_RETURN函數的參數在這裏生效了。HttpTransact::EndRemapRequest函數本質上是分析了remap執行的情況,順利的話最後執行的TRANSACT_RETURN函數第一個參數是HTTP_API_POST_REMAP,第二個參數是HttpTransact::HandleRequest。


第四個state是HttpTransact::HTTP_API_POST_REMAP,這個階段call了上個state設置的HttpTransact::HandleRequest函數,判斷了請求是否有效,判斷了緩存是否可以被查找,最後執行了HttpTransact::StartAccessControl函數,並且以HttpTransact::StartAccessControl->HttpTransact::HandleRequestAuthorized->HttpTransact::DecideCacheLookup的調用關係最後執行了TRANSACT_RETURN函數,第一個參數CACHE_LOOKUP,第二個參數NULL。在接下來的HttpSM::set_next_state函數中,首先爲continuation函數設置了回調函數HttpSM::state_cache_open_read,之後執行了HttpSM::do_cache_lookup_and_read函數,HttpSM::do_cache_lookup_and_read函數執行完了之後會觸發HttpSM::state_cache_open_read函數。HttpSM::do_cache_lookup_and_read函數執行了查緩存操作,如果緩存查詢命中了,HttpSM::state_cache_open_read函數的event是CACHE_EVENT_OPEN_READ,最後執行了call_transact_and_set_next_state函數,並且帶了一個參數,HttpTransact::HandleCacheOpenRead函數。HttpTransact::HandleCacheOpenRead函數確認是不是真的緩存命中了,最後執行了TRANSACT_RETURN函數,第一個參數HTTP_API_READ_CACHE_HDR,第二個參數HttpTransact::HandleCacheOpenReadHitFreshness。


第五個state是HttpTransact::HTTP_API_READ_CACHE_HDR,這個階段call了上一次TRANSACT_RETURN函數的第二個參數HttpTransact::HandleCacheOpenReadHitFreshness函數,HttpTransact::HandleCacheOpenReadHitFreshness函數判斷緩存是否過期了,如果沒有過期最後執行了TRANSACT_RETURN函數,第一個參數爲HTTP_API_CACHE_LOOKUP_COMPLETE,第二個參數是HttpTransact::HandleCacheOpenReadHit。隨後的HttpSM::set_next_state函數直接把t_state.next_action賦值給了t_state.api_next_action,賦值完了t_state.api_next_action的值爲HTTP_API_CACHE_LOOKUP_COMPLETE。


第六個state是HttpTransact::HTTP_API_CACHE_LOOKUP_COMPLETE,這個階段call了HttpTransact::HandleCacheOpenReadHit函數,這個函數判斷了緩存的東西是不是可以直接返回,因爲有可能需要有刷新之類的操作。如果可以直接返回,執行了HttpTransact::build_response_from_cache函數。這個函數生成了響應數據,並且將HttpSM::next_action設置爲SERVE_FROM_CACHE,在HttpSM::set_next_state中設置t_state.api_next_action 爲HttpTransact::HTTP_API_SEND_REPONSE_HDR


第七個state是HttpTransact::HTTP_API_SEND_REPONSE_HDR,這個階段並沒有執行HttpSM::call_transact_and_set_next_state函數,只是設置了一個回調函數就break了。函數並沒有退出HttpSM::handle_api_return,HttpSM::handle_api_return函數有兩個switch,第一個是狀態機的入口,以api_next_state爲判斷依據,第二個以next_state爲依據。此時next_state是HttpTransact::SERVE_FROM_CACHE,執行了HttpSM::setup_cache_read_transfer函數,函數中設置了狀態機的回調函數爲HttpSM::tunnel_handler。之後一直執行,會執行write_to_net函數,並觸發HttpSM::tunnel_handler函數。HttpSM::tunnel_handler函數執行會間接的執行到HttpSM::kill_this函數,函數中將t_state.api_next_action設置爲最後一個state,HttpTransact::HTTP_API_SM_SHUTDOWN。


第八個state是HttpTransact::HTTP_API_SM_SHUTDOWN,執行清理操作,直接結束



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章