第426章 天快亮了!
一月三號,凌晨兩點四十。
三樓調試間的燈沒關過。
從十二月初封閉開發到現在,這間屋子的日光燈管亮了整整一個月,中間換過一根,靠窗那根,閃了兩天之後自己滅了,老周讓方遠去行政部領了一根新的,方遠扛著一米二長的燈管從走廊那頭走過來的時候差點撞到消防栓。
現在四根燈管都是亮的,白光,偏冷,照得每個人臉色都有點發青。
調試間裡還剩兩個人。
老周趴在靠門那張桌上,頭枕著左胳膊,右手搭在鍵盤邊上,手指微微蜷著,搪瓷缸歪在手邊,杯口的豁口朝上,裡面還有小半杯茶,涼透了,茶葉片貼在杯壁上,深褐色的。
他大概是十二點多睡著的。
方遠沒有叫他。
方遠在最裡面那張桌上,三塊屏幕,左邊跑著v2.0引擎的72小時持續測試日誌,綠色的字在黑底上一行一行往上滾,速度很快,像瀑布,中間是代碼編輯器,光標停在第1847行,右邊是測試用例的覆蓋率面板,數字在緩慢變化。
72小時持續測試從元旦那天下午三點開始。
到現在已經跑了將近六十個小時。
本地帳本模塊,占用鎖機制,最終一致性回調,1000並發,模擬斷網,模擬重連,模擬高延遲,模擬丟包,每一種異常場景都跑了至少兩百輪。
六十個小時,零異常。
方遠看著左邊屏幕上的日誌,綠色的,一直是綠色的。
他揉了一下眼睛,眼鏡摘下來放在桌上,鏡片上有指紋,他用T恤的下擺擦了兩下,沒擦乾淨,又戴回去了。
六十個小時零異常。
按照正常流程,72小時跑完就可以出測試報告了,再過十二個小時,到明天下午三點,全綠就交。
他本來可以去睡的,隔壁會議室鋪著兩個睡袋,一個藍色一個灰色,藍色的是他的,枕頭是從家裡帶的,記憶棉的,已經有點塌了。
但他沒去。
不是不困,是他有個習慣,跑長時間測試的時候,他喜歡盯著日誌看,不是看有沒有錯誤,是看日誌的節奏,正常運行的日誌有一種節奏感,像心跳一樣,均勻,穩定,如果有什麼地方不對,節奏會變。
他盯了一會兒。
綠色的字,一行一行。
凌晨兩點五十一分。
日誌的節奏變了。
不是報錯,顏色還是綠色,但兩行日誌之間的間隔從平均3毫秒跳到了7毫秒,然後回到3毫秒,然後又跳到了9毫秒,然後回來。
他坐直了。
心跳漏了一拍,不是他的心跳,是日誌的心跳。
他把日誌窗口拉大,打開時間戳詳細模式。
找到了。
第58小時43分12秒,本地帳本和中心帳本的一致性回調過程中,有一個極小概率的競態條件,當離線時間超過72小時後重新上線,如果本地帳本在回調過程中同時收到新的交易請求,占用鎖的釋放順序會產生一個0.003%概率的衝突窗口。
0.003%。
三萬三千次里出現一次。
在冬奧的實際場景中幾乎不可能觸發,斷網不會超過72小時,一個小時都不太可能,測試大綱上的離線場景最長也就幾分鐘。
幾乎不可能。
他盯著那個數字看了十秒。
然後他打開代碼編輯器。
光標從第1847行跳到了第2091行,占用鎖的釋放邏輯。
他開始改。
調試間裡很安靜,暖氣管每隔一會兒咔一聲,像有人用指甲輕輕彈了一下鐵管,走廊盡頭自動售貨機的燈在閃,一明一暗,節奏跟暖氣管不同步,兩種聲音交替出現,像兩個人在用不同的方式呼吸。
方遠不看時間。
他在代碼里加了一層時間窗口校驗,如果本地帳本的離線時長超過設定閾值,回調過程中的占用鎖會自動進入排他模式,拒絕一切新交易請求直到回調完成。
這個改動很小,邏輯上只是加了一個if判斷,但要保證這個判斷不影響正常場景下的性能,需要調整鎖的釋放序列。
他從第2091行改到第2128行。
37行。
改完之後他沒有立刻提交,他先在腦子裡過了一遍,37行代碼,每一行他都能說清楚為什麼這麼寫。
然後他回頭看了一眼老周。
老周還在睡,姿勢沒變,右手搭在鍵盤邊上,食指微微搭在空格鍵上,隨著呼吸起伏,輕微的幅度,鍵盤沒有響,搪瓷缸還歪著,茶葉片在杯壁上沒動過。
他沒叫。
他打開測試框架,把修改後的代碼加載進去,啟動一輪完整的回歸測試。
屏幕上開始跑。
綠色的字又開始往上滾了。
他靠在椅背上,摘下眼鏡,用拇指和食指捏了一下鼻樑,眼睛有點酸。
回歸測試跑了四十分鐘。
全綠。
他重新戴上眼鏡,把修改提交到代碼倉庫。
提交記錄的備註欄。
他在裡面打了一行字。
」72h+靜態修復·實際觸發概率≈0·但不允許≈0。」
保存。
然後他在測試用例文件里新開了一組,168小時,上周老周說」無上限」的時候他就想好了,168小時是7天,夠了,如果168小時也跑不出問題,那這個bug就算是徹底封死了。
168小時的用例會在後台自動跑,不需要人盯著。
他站起來。
椅子在地板上蹭了一下,聲音不大,但在凌晨的安靜里還是很清楚。
老周動了一下,沒醒,呼吸變了兩秒,又勻了。
方遠走到窗邊。
調試間的窗戶不大,對面是微光總部的B棟,灰色的外牆,窗戶都是暗的,樓下停車場空空的,路燈亮著,橘黃色的光打在地面上,濕漉漉的,大概半夜下過雨。
天際線的邊緣有一條很淡的灰白色。
天快亮了。
杭州十二月底的天亮得很晚,要到七點以後天際線那道灰白色才會變成藍灰色,再變成灰白色,再慢慢亮起來。
他看了一會兒。
走廊那頭自動售貨機的燈還在閃,暖氣管又咔了一聲。
他回到座位上,把眼鏡推了一下。
拿起手機看了一眼時間,四點十九分。
睡袋在隔壁,記憶棉枕頭有點塌了。
他想了想,把手機放下,拉過鍵盤,打開了168小時測試的實時日誌。
綠色的字開始滾了。
他看著。
…………
上午九點二十,林徹到了三樓。
調試間的門開著,老周坐在桌前,搪瓷缸換了新茶,熱氣從豁口那裡冒出來,方遠不在。
」方遠呢?」
」隔壁睡了,四點多的時候,」老周端起搪瓷缸喝了一口,」他昨晚修了一個東西。」
林徹看了一眼老周的屏幕,72小時持續測試的最終報告,全綠,旁邊還開著一個窗口,168小時測試正在跑。
」能?」
老周放下搪瓷缸。
」能。」
三樓調試間的燈沒關過。
從十二月初封閉開發到現在,這間屋子的日光燈管亮了整整一個月,中間換過一根,靠窗那根,閃了兩天之後自己滅了,老周讓方遠去行政部領了一根新的,方遠扛著一米二長的燈管從走廊那頭走過來的時候差點撞到消防栓。
現在四根燈管都是亮的,白光,偏冷,照得每個人臉色都有點發青。
調試間裡還剩兩個人。
老周趴在靠門那張桌上,頭枕著左胳膊,右手搭在鍵盤邊上,手指微微蜷著,搪瓷缸歪在手邊,杯口的豁口朝上,裡面還有小半杯茶,涼透了,茶葉片貼在杯壁上,深褐色的。
他大概是十二點多睡著的。
方遠沒有叫他。
方遠在最裡面那張桌上,三塊屏幕,左邊跑著v2.0引擎的72小時持續測試日誌,綠色的字在黑底上一行一行往上滾,速度很快,像瀑布,中間是代碼編輯器,光標停在第1847行,右邊是測試用例的覆蓋率面板,數字在緩慢變化。
72小時持續測試從元旦那天下午三點開始。
到現在已經跑了將近六十個小時。
本地帳本模塊,占用鎖機制,最終一致性回調,1000並發,模擬斷網,模擬重連,模擬高延遲,模擬丟包,每一種異常場景都跑了至少兩百輪。
六十個小時,零異常。
方遠看著左邊屏幕上的日誌,綠色的,一直是綠色的。
他揉了一下眼睛,眼鏡摘下來放在桌上,鏡片上有指紋,他用T恤的下擺擦了兩下,沒擦乾淨,又戴回去了。
六十個小時零異常。
按照正常流程,72小時跑完就可以出測試報告了,再過十二個小時,到明天下午三點,全綠就交。
他本來可以去睡的,隔壁會議室鋪著兩個睡袋,一個藍色一個灰色,藍色的是他的,枕頭是從家裡帶的,記憶棉的,已經有點塌了。
但他沒去。
不是不困,是他有個習慣,跑長時間測試的時候,他喜歡盯著日誌看,不是看有沒有錯誤,是看日誌的節奏,正常運行的日誌有一種節奏感,像心跳一樣,均勻,穩定,如果有什麼地方不對,節奏會變。
他盯了一會兒。
綠色的字,一行一行。
凌晨兩點五十一分。
日誌的節奏變了。
不是報錯,顏色還是綠色,但兩行日誌之間的間隔從平均3毫秒跳到了7毫秒,然後回到3毫秒,然後又跳到了9毫秒,然後回來。
他坐直了。
心跳漏了一拍,不是他的心跳,是日誌的心跳。
他把日誌窗口拉大,打開時間戳詳細模式。
找到了。
第58小時43分12秒,本地帳本和中心帳本的一致性回調過程中,有一個極小概率的競態條件,當離線時間超過72小時後重新上線,如果本地帳本在回調過程中同時收到新的交易請求,占用鎖的釋放順序會產生一個0.003%概率的衝突窗口。
0.003%。
三萬三千次里出現一次。
在冬奧的實際場景中幾乎不可能觸發,斷網不會超過72小時,一個小時都不太可能,測試大綱上的離線場景最長也就幾分鐘。
幾乎不可能。
他盯著那個數字看了十秒。
然後他打開代碼編輯器。
光標從第1847行跳到了第2091行,占用鎖的釋放邏輯。
他開始改。
調試間裡很安靜,暖氣管每隔一會兒咔一聲,像有人用指甲輕輕彈了一下鐵管,走廊盡頭自動售貨機的燈在閃,一明一暗,節奏跟暖氣管不同步,兩種聲音交替出現,像兩個人在用不同的方式呼吸。
方遠不看時間。
他在代碼里加了一層時間窗口校驗,如果本地帳本的離線時長超過設定閾值,回調過程中的占用鎖會自動進入排他模式,拒絕一切新交易請求直到回調完成。
這個改動很小,邏輯上只是加了一個if判斷,但要保證這個判斷不影響正常場景下的性能,需要調整鎖的釋放序列。
他從第2091行改到第2128行。
37行。
改完之後他沒有立刻提交,他先在腦子裡過了一遍,37行代碼,每一行他都能說清楚為什麼這麼寫。
然後他回頭看了一眼老周。
老周還在睡,姿勢沒變,右手搭在鍵盤邊上,食指微微搭在空格鍵上,隨著呼吸起伏,輕微的幅度,鍵盤沒有響,搪瓷缸還歪著,茶葉片在杯壁上沒動過。
他沒叫。
他打開測試框架,把修改後的代碼加載進去,啟動一輪完整的回歸測試。
屏幕上開始跑。
綠色的字又開始往上滾了。
他靠在椅背上,摘下眼鏡,用拇指和食指捏了一下鼻樑,眼睛有點酸。
回歸測試跑了四十分鐘。
全綠。
他重新戴上眼鏡,把修改提交到代碼倉庫。
提交記錄的備註欄。
他在裡面打了一行字。
」72h+靜態修復·實際觸發概率≈0·但不允許≈0。」
保存。
然後他在測試用例文件里新開了一組,168小時,上周老周說」無上限」的時候他就想好了,168小時是7天,夠了,如果168小時也跑不出問題,那這個bug就算是徹底封死了。
168小時的用例會在後台自動跑,不需要人盯著。
他站起來。
椅子在地板上蹭了一下,聲音不大,但在凌晨的安靜里還是很清楚。
老周動了一下,沒醒,呼吸變了兩秒,又勻了。
方遠走到窗邊。
調試間的窗戶不大,對面是微光總部的B棟,灰色的外牆,窗戶都是暗的,樓下停車場空空的,路燈亮著,橘黃色的光打在地面上,濕漉漉的,大概半夜下過雨。
天際線的邊緣有一條很淡的灰白色。
天快亮了。
杭州十二月底的天亮得很晚,要到七點以後天際線那道灰白色才會變成藍灰色,再變成灰白色,再慢慢亮起來。
他看了一會兒。
走廊那頭自動售貨機的燈還在閃,暖氣管又咔了一聲。
他回到座位上,把眼鏡推了一下。
拿起手機看了一眼時間,四點十九分。
睡袋在隔壁,記憶棉枕頭有點塌了。
他想了想,把手機放下,拉過鍵盤,打開了168小時測試的實時日誌。
綠色的字開始滾了。
他看著。
…………
上午九點二十,林徹到了三樓。
調試間的門開著,老周坐在桌前,搪瓷缸換了新茶,熱氣從豁口那裡冒出來,方遠不在。
」方遠呢?」
」隔壁睡了,四點多的時候,」老周端起搪瓷缸喝了一口,」他昨晚修了一個東西。」
林徹看了一眼老周的屏幕,72小時持續測試的最終報告,全綠,旁邊還開著一個窗口,168小時測試正在跑。
」能?」
老周放下搪瓷缸。
」能。」