Cronet網(wǎng)絡(luò)庫(Quic連接出錯篇章一)

問題

因為業(yè)務(wù)需求把所有業(yè)務(wù)的域名都搞成相同的砸民,導(dǎo)致Cronet在底層連接出錯的判斷邏輯也跟著出錯了。原因是域名相同后,假如某個業(yè)務(wù)域名所建立的連接一直出錯,但是該連接的端口有1-3個的話榄审,出錯后cronet會記錄內(nèi)存、本地馆衔,后續(xù)有其他業(yè)務(wù)域名命中這個1-3個端口的話瘟判,就會導(dǎo)致一直命中跳過quic連接的邏輯怨绣。本章節(jié)主要分析quic連接出錯狀態(tài)后續(xù)會導(dǎo)致其他連接被誤認為是需要跳過的角溃。

Quic Job創(chuàng)建流程

  1. 要解決問題,我們首先要弄清楚整個quic job的創(chuàng)建流程篮撑,首先是job_controller控制所有http請求的Job創(chuàng)建减细,來到http_stream_factory_job時候,里面就根據(jù)邏輯判斷來決定走h2還是h3的job赢笨,這里流程圖只涉及Quic job相關(guān)未蝌,具體可以看圖一。


    圖一.png

Quic broken邏輯

  1. quic創(chuàng)建連接跳過邏輯在http_stream_factory_job_controller.cc里的GetAlternativeServiceInfoInternal函數(shù)里茧妒,在返回AlternativeServiceInfo時候會判斷該域名和端口等元素組合而成的Key是否在broken的數(shù)組里萧吠,如果存在就跳過此次循環(huán),那么就會返回一個默認值的first_alternative_service_info桐筏。源碼如下圖二所示


    圖二.png
  2. is_broken的判斷邏輯又涉及到broken_alternative_services.cc里面的數(shù)據(jù)儲存了纸型,其中有個儲存broken數(shù)據(jù)的在Quic Job確定連接失敗發(fā)生下面3個錯誤情況下,會將當前host梅忌、port記錄到broken數(shù)組里狰腌。QuicStreamRequest的創(chuàng)建可以由圖一看出在Job::DoInitConnectionImplQuic函數(shù)創(chuàng)建的,那么我們回去看callback函數(shù)即可牧氮。源碼如下圖三所示


    圖三.png
  3. DoInitConnectionImplQuic的構(gòu)造函數(shù)再經(jīng)過delegate->onFailedOnDefaultNetwork回調(diào)給上層琼腔,即回調(diào)http_stream_factory_job_controller.cc里,可以看出其中回調(diào)后會把一個標識位置設(shè)置成true踱葛,那么我們繼續(xù)跟著標識位的判斷可以發(fā)現(xiàn)最后走到MaybeReportBrokenAlternativeService函數(shù)里丹莲,而函數(shù)里的MarkAlternativeServiceBrokenUntilDefaultNetworkChanges就會把數(shù)據(jù)記錄到broken_alternative_services.cc里。

//來源于:http_stream_factory_job_controller.cc
void HttpStreamFactory::JobController::OnFailedOnDefaultNetwork(Job* job) {
  DCHECK_EQ(job->job_type(), ALTERNATIVE);
  alternative_job_failed_on_default_network_ = true;
}

//請求結(jié)束
void HttpStreamFactory::JobController::OnRequestComplete() {
  ……
  MaybeNotifyFactoryOfCompletion();
}

//主要是MarkAlternativeServiceBrokenUntilDefaultNetworkChanges尸诽,他會把host和port信息記錄到broken數(shù)組里
void HttpStreamFactory::JobController::MaybeReportBrokenAlternativeService() {
  if (alternative_job_net_error_ == OK &&
      !alternative_job_failed_on_default_network_)
    return;
……

  if (alternative_job_failed_on_default_network_ &&
      alternative_job_net_error_ == OK) {
    session_->http_server_properties()
        ->MarkAlternativeServiceBrokenUntilDefaultNetworkChanges(
            alternative_service_info_.alternative_service(),
            request_info_.network_isolation_key);
    // Reset error status for Jobs after reporting brokenness.
    ResetErrorStatusForJobs();
    return;
  }
……
}


解決問題思路

因為host被業(yè)務(wù)需要改成相同的了甥材,那我們只需要在is_broken基礎(chǔ)上新增一個值來判斷當前的host和port是否為同一條連接即可,因為只有當連接相同情況下并且失敗過才要跳過quic的創(chuàng)建逊谋,如果不是相同的一條連接應(yīng)該嘗試創(chuàng)建quic job擂达。(涉及業(yè)務(wù)代碼的保密性我就不貼出來了)

注意: 不能重載AlternativeService的<、==、!=等符號板鬓,因為這個類很多邏輯都共用到的悲敷,如果修改后原本判斷相同的處理因為新增值就判斷不相同了。所以需要做的工作是在取的時候新增個&&判斷來解決問題俭令。


總結(jié)

  1. 遇到相關(guān)開發(fā)問題后德,要嘗試理解源碼設(shè)計后再去改動,不要盲目去大改抄腔,畢竟已經(jīng)上線存在那么久了瓢湃,沒有把握情況下盡量小改解決問題。
  2. 發(fā)現(xiàn)Cronet開源項目做的非常棒赫蛇,不是說能力上(我太菜還沒能全部讀懂)绵患,而是說查詢代碼的體驗上,你點擊函數(shù)還能跳轉(zhuǎn)進具體函數(shù)悟耘,像ide一樣了落蝙。Cronet的源碼鏈接(翻墻)
  3. broken邏輯還涉及本地序列化和反序列化,這里涉及的代碼和邏輯我會在下一個篇章分析(如果我有時間的話)暂幼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筏勒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旺嬉,更是在濱河造成了極大的恐慌管行,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪媳,死亡現(xiàn)場離奇詭異捐顷,居然都是意外死亡,警方通過查閱死者的電腦和手機悲酷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門套菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人设易,你說我怎么就攤上這事逗柴。” “怎么了顿肺?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵戏溺,是天一觀的道長。 經(jīng)常有香客問我屠尊,道長旷祸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任讼昆,我火速辦了婚禮托享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己闰围,他們只是感情好赃绊,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羡榴,像睡著了一般碧查。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上校仑,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天忠售,我揣著相機與錄音,去河邊找鬼迄沫。 笑死稻扬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的邢滑。 我是一名探鬼主播腐螟,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼困后!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衬廷,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤摇予,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吗跋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侧戴,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年跌宛,在試婚紗的時候發(fā)現(xiàn)自己被綠了酗宋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疆拘,死狀恐怖蜕猫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哎迄,我是刑警寧澤回右,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站漱挚,受9級特大地震影響翔烁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旨涝,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蹬屹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦慨默、人聲如沸秃踩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憔杨。三九已至,卻和暖如春蒜胖,著一層夾襖步出監(jiān)牢的瞬間消别,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工台谢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寻狂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓朋沮,卻偏偏與公主長得像蛇券,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樊拓,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容