博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongo3.0.9库命名的一个S级bug
阅读量:2505 次
发布时间:2019-05-11

本文共 1783 字,大约阅读时间需要 5 分钟。

现象

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,没有复现,想必已经修复了

你可能感兴趣的文章
JDK下载(百度网盘)
查看>>
idea用得溜,代码才能码得快
查看>>
一篇掌握python魔法方法详解
查看>>
数据结构和算法5-非线性-树
查看>>
数据结构和算法6-非线性-图
查看>>
数据结构和算法7-搜索
查看>>
数据结构和算法8-排序
查看>>
windows缺少dll解决办法
查看>>
JPA多条件动态查询
查看>>
JPA自定义sql
查看>>
BigDecimal正确使用了吗?
查看>>
joplin笔记
查看>>
JNDI+springmvc使用
查看>>
vue+springboot分页交互
查看>>
vue+springboot打包发布
查看>>
XSL 开发总结
查看>>
【NOI 2018】归程(Kruskal重构树)
查看>>
如何开始DDD(完)
查看>>
[svc]gns3模拟器及探讨几个bgp问题
查看>>
Error:fatal: Not a git repository (or any of the parent directories): .git
查看>>