第三十一章 八萬

投票推薦 加入書籤 小說報錯

  「好,等我兩分鐘,我把另一個BUG給留言一下。」

  畢竟意外的發現了另外一個BUG,葉新晨可不會錯過這樣的機會啊,不說其他什麼,最起碼懸賞再加錢肯定應該是毫無問題的。

  葉子:維護輔助庫中發現了另外一個BUG,應該是一個積年老BUG,代碼片段發送給你們了。

  發完這句話,葉新晨才是用大拇指按了按自己的太陽穴,然後笑了笑看著王曉雪,「我現在其實都已經不餓了,也不知道為什麼,但是畢竟是你炒的,那我硬吃都得吃一點下去。」

  「別貧嘴,我都端在廚房的桌子上面了。」王曉雪微笑著,「我今天就吃點糖拌番茄然後再喝一瓶酸奶就行了。」

  葉新晨也只是點點頭,「其實芹菜的話,你也可以吃點,畢竟芹菜沾油沒有那麼厲害。」

  「嗯,這樣的話,那我就少吃點吧。」王曉雪覺得也還是吃點飯比較好,畢竟不吃飯的話,肚子會一直空,餅乾那些什麼的,也頂不住天天不吃飯啊!

  飯後,葉新晨自然是繼續的忙碌著,他現在在剛剛吃飯的過程中好像有了一點思路,但是得實踐才知道。

  而通過反覆對比正常執行過程和出錯誤的執行過程,葉新晨發現出錯時,程序多了一條report!

  要知道網元返回的信息包括命令返回、alert、report。alert出現就得記錄並報錯(除非本就預期有這麼一條alert),而report一般可以無視,記錄然後丟棄就是。

  所以沒人注意這一點。

  而且葉新晨也知道,測試時網元負荷極低,而且先做過初始化。

  因此每次執行應該都差不多,這裡多個report,很可能就隱含著什麼……

  所以葉新晨開始仔細觀察程序和網元的交互記錄,發現那裡的命令返回似乎有些不對。

  命令返回有幾百行,其中一列是時間,正常來說,時間應該是2019-10-31 18:21:22、2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:24……這樣子一路排下來。

  但那段數據,它的時間卻是2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:21、2019-10-31 18:21:22、2019-10-31 18:21:23……

  也就是在秒這個級別存在亂序,更具體點實際上是在毫秒級別存在亂序/跳躍,即時間格式為2019-10-31 18:21:22.456 2019-10-31 18:21:22.567這樣,其中某些行組之間存在2、300毫秒的跳躍。

  葉新晨按時間連續性把數據分割,發現它的輸出是每幾條到十幾條為一組,組內順序正常,組間亂序/跳躍;但把這些組挑選、拼接,可以得到兩組數據,組內時間順序良好、間隔均勻。

  這說明,這些數據可能是兩個命令的返回,不知怎麼混到了一起。

  就是因為這種混淆使得命令輸出格式錯亂,這才使得程序把命令返回識別成了report。

  於是葉新晨看了一下對方的測試筆記,果然,他們測線路備份切換之類功能,所以需要同時控制兩個網元;命令在程序中是順序下發的,間隔可能只有若干毫秒。

  看到這裡,葉新晨心裡有了底,開始觀察程序所在目錄,果然在裡面找到個dat文件;用十六進位編輯器打開,裡面果然是網上傳來的原始報文信息,二進位格式。

  報文格式是網元編號:信息。

  再檢查相關代碼,很顯然,這是因為網元編號被底層通訊模塊丟棄了,只把文本信息返回給了上層;這就使得上層無法區分信息來自哪個網元。

  平常這樣做還沒有問題;但遇到同時連接多個網元且需要同時檢查多個網元返回、且返回信息還比較多時,數據就亂了。

  這個東西太基礎。

  因為它和上層關係太過緊密,修改它影響太大;而且底層通訊模塊的源碼已經丟失……

  於是,葉新晨嘗試用字符串分析的辦法來恢復它,鑑於不同命令返回格式不同、數據各異,葉新晨也是用程序嘗試識別每個欄位的數據類型,然後再檢測它是否為有序內容。

  葉新晨把這類列叫「索引列」,索引列有三種,一種是1、2、3這樣的數字編號,另一種是網元編號這樣一整個都是某個固定數字/字符的,還有就是年月日時分秒這樣的時間信息;它們可能同時全部出現,但也可能只出現其中一種,甚至全都沒有。

  當識別出索引列之後,葉新晨就把順序不亂、時間不跳變的若干行視為一個整體;然後像分析單詞的「編輯距離」一樣,尋找一種使得數據整體上「編輯距離」調整最小的方案,把混淆的數據分隔開。

  因為一組數據可能有多個索引列,按照不同索引列拆分的方案還可能不一樣。

  因此葉新晨也是不得不遍歷各種拆分方案,尋找綜合最優的那種方案……

  這是個挺複雜的程序。

  實際上它超出了TCL的能力範圍——它的確能工作,而且沒有出錯時消耗很小;但一旦出錯,它需要一分多鐘才能恢復。

  總之,葉新晨還是把這個程序寫出來了,而且的確能自動識別並糾正這種問題;但性能消耗太嚴重,不是可用於生產的正常解決方案。

  想到這裡,葉新晨還是決定幫他們重寫底層通訊模塊,修改通訊約定。

  雖然這的確會引起底層代碼的大量更改,但畢竟範圍還算可控,而且不需要付出恐怖的性能代價。

  就以上種種這一次是真的占用了葉新晨挺長時間,一個星期還沒有完成。

  因為發布懸賞的這個小公司也是意識到了葉子是個大神級別的人物,所以原本他們的懸賞價格只是兩萬,後來發現了那個積年老BUG又提升到了三萬,到現在懸賞價格已經提升到了八萬,就是想讓葉新晨也一起尋找BUG根新底層模塊的需求分析和代碼編寫。

  看在懸賞這麼高的份上,葉新晨也是其中幫他們設計了一下新通訊模塊。

  也因此,就因為這個懸賞,直接幹了葉新晨整整七天,好在懸賞已經結算了,不然的話葉新晨都覺得是不是太累了點,當然還有一些方向上的代碼編寫,葉新晨為了職業道德還是需要給他們寫一點的。

  PS:感謝神文2019的一百起點幣打賞。

章節目錄