vlambda博客
学习文章列表

我给MyCat修复了一个bug

1.起因






  MyCat发生bug的版本为

    1.6-RELEASE-20161028204710-linux.tar.gz。



   事情发生在前几天的一个夜晚,当我给MyCat进行配置表级DML权限的时候,然后发现了这样的错误信息。



我给MyCat修复了一个bug



   当看到这行错误的第一反应是我自己可能少了一个property的标签,于是我打开MyCat安装目录下conf文件下的sercer.xml进行检查;于是我对下面这个配置看了10分钟依然没看出什么问题。



   既然实在看不出来问题,不如直接百度一下,结果在百度上居然没有人说这个错误。我开始越发怀疑可能真是自己写错了。继续看了10分钟还是没什么问题。



   继续10分钟后依然没看出什么问题,索性我直接将刚刚加的配置注释掉看会不会有问题,结果令我大吃一惊,居然可以正常启动。



我给MyCat修复了一个bug



我给MyCat修复了一个bug



   于是我又下了一个1.6.7.1版本的MyCat进行测试,同样是配置了DML表级权限,发现并没有这个错误。这时候我想这可能是个MyCat的bug。



我给MyCat修复了一个bug



我给MyCat修复了一个bug



1.debug源码





   首先使用命令git tag查看tag



我给MyCat修复了一个bug



   使用git checkout tag版本,切换到对应的版本。



我给MyCat修复了一个bug



   通过Idea打开项目,我尝试启动项目却不知道从哪儿启动。于是我想起了之前报错的信息,看到MycatStartup,找到这个类发现了启动入口。然后启动日志如下图2。



我给MyCat修复了一个bug


我给MyCat修复了一个bug



   找到了入口,我在server.xml中修改DML表级权限,然后再次启动发现报错如下图2,不同的是这次我可以定位到具体是哪一行代码抛出的异常。



我给MyCat修复了一个bug



我给MyCat修复了一个bug



   通过异常信息可以看出是XMLServerLoader这个类的问题,于是打上断点开始分析。当执行到下图的ConfigUtil.getDocument的时候抛出了异常。



我给MyCat修复了一个bug



   通过下面的注释可以看到这应该是在获取server.xml的标签,获取的时候抛出了异常。这也验证了之前我们推测的是解析xml出现了问题。继续debug看ConfigUtil.getDocument里面干了什么。


   实际上最后抛出异常就是builder.parse所以可以肯定是解析xml的问题。但是回头我看了xml并没有什么大的问题,直到看到图2的这行代码,开启xml的校验规则。难道还有什么校验规则吗?



我给MyCat修复了一个bug


我给MyCat修复了一个bug



   于是回到上面我看到了一个dtd文件,令我很疑惑这是个什么东西,点开以后也确实有看不懂,于是我百度了一下dtd是什么时,我才知道是指定xml校验规则的。



我给MyCat修复了一个bug


   打开server.dtd文件看一下是不是规则定义的不对呢?当我看到第21行的时候这个东西很熟悉,我们控制台日志错误说的就是他。


我给MyCat修复了一个bug



   于是我去看了一下dtd的规则,究竟是什么意思时。我恍然大悟发现了出现bug的原因。可以通过下图看到,21行中的规则表示的是在user标签中至少出现一次property。



我给MyCat修复了一个bug



   如果我们配置了DML也就是说user标签下面会多了一个privileges标签,但是却没有指定privileges出现的次数。



我给MyCat修复了一个bug



   通过上面的猜测尝试加上privileges测试一下,由于privileges会出现零次或多次,所以加上privileges*。



我给MyCat修复了一个bug



   再此测试发现即使配置DML也可以正常启动,这也就是bug的源头。就是忘记了在server.dtd文件中加上对privileges的处理。





   最后如果你想复现这个bug,需要使用Mycat的1.6-RELEASE版本,当然新的版本中早已经解决了这个bug。所以如果你在实际工作中使用时且需要配置DML表级权限,那么你可以选择换一个新的版本。



1.各大培训机构,价格10万的视频 Java架构师视频免费送。


2.各种电子书籍经典Java书籍免费送


3.个人技术总结免费赠送