mongo3.0.9庫命名的一個S級bug

現象

db每隔一段時間崩潰一次,完全停服的情況下不會崩潰,mongod日誌如下

2018-01-16T20:21:43.573+0800 E STORAGE  [conn18] no cursor for uri: table:asd()/collection-15-2895040321638166665
2018-01-16T20:21:43.573+0800 I -        [conn18] Invariant failure c src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp 1020
2018-01-16T20:21:43.586+0800 I CONTROL  [conn18]
 0xf840d2 0xf2b679 0xf0e7b9 0xd935cb 0xd936f1 0xd9407c 0xd9439c 0xd8dc3e 0xd0998f 0x906899 0x99cbcc 0x99dafc 0x99e93d 0x9a08b9 0x9a10e5 0x9a3ecc 0x9c6e61 0x9c7e6c 0x9c8b3b 0xba5b9b 0xab2a1a 0x7ea855 0xf3ffa9 0x7fd7b68fd851 0x7fd7b5a9f90d
----- BEGIN BACKTRACE -----
{"backtrace":[{"b":"400000","o":"B840D2","s":"_ZN5mongo15printStackTraceERSo"},{"b":"400000","o":"B2B679","s":"_ZN5mongo10logContextEPKc"},{"b":"400000","o":"B0E7B9","s":"_ZN5mongo15invariantFailedEPKcS1_j"},{"b":"400000","o":"9935CB","s":"_ZN5mongo21WiredTigerRecordStore8Iterator7_locateERKNS_8RecordIdEb"},{"b":"400000","o":"9936F1","s":"_ZN5mongo21WiredTigerRecordStore8IteratorC2ERKS0_PNS_16

原因分析

初步猜測是某個操作觸發了mongo bug,但是線索太少,後來仔細查看mongod日誌發現,每次崩潰前日誌都會有類似的這行記錄

[conn18] no cursor for uri: table:asd()/collection-15-2895040321638166665

看該條日誌,大概猜測是庫名稱叫"asd()"的某個表上寫入失敗,猜測跟這個叫"asd()"的庫有關,登錄db發現沒有該庫;

猜測是這個庫名稱取值觸發了mongodb內部bug,於是測試了一把,果然崩潰


爲什麼重新登錄這個db沒有該庫,因爲只要一寫這個庫就崩潰,實際上這個庫就是空庫,show dbs沒有顯示

翻看了下mongo的官方限制,並沒有提到不能使用()等符號,而且如果是限制的符號,那麼insert時會給出錯誤提示,而不是直接崩潰,這個崩潰問題就算比較嚴重了,以下測試時使用mongo限制的逗號符號做的測試

udb-xlgqgj:PRIMARY> use asd,asd
switched to db asd,asd
udb-xlgqgj:PRIMARY> db
asd,asd
udb-xlgqgj:PRIMARY> show tables;
udb-xlgqgj:PRIMARY> db.asd.insert({xx:1})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 2,
"errmsg" : "22: Invalid argument"
}
})
udb-xlgqgj:PRIMARY> db
asd,asd

改進措施

1 業務上最好不要使用特殊符號,哪怕官網沒有說不能用,最好還是大小寫字母+下劃線之類的通用字符,對大家都好

2 升級到mongo 3.2以上,測試了mongo 3.2,沒有復現,想必已經修復了




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