MyCat發生bug的版本爲linux
1.6-RELEASE-20161028204710-linux.tar.gz。git
事情發生在前幾天的一個夜晚,當我給MyCat進行配置表級DML權限的時候,而後發現了這樣的錯誤信息。微信
當看到這行錯誤的第一反應是我本身可能少了一個property的標籤,因而我打開MyCat安裝目錄下conf文件下的sercer.xml進行檢查;因而我對下面這個配置看了10分鐘依然沒看出什麼問題。架構
既然實在看不出來問題,不如直接百度一下,結果在百度上竟然沒有人說這個錯誤。我開始愈加懷疑可能真是本身寫錯了。繼續看了10分鐘仍是沒什麼問題。app
繼續10分鐘後依然沒看出什麼問題,索性我直接將剛剛加的配置註釋掉看會不會有問題,結果令我大吃一驚,竟然能夠正常啓動。less
因而我又下了一個1.6.7.1版本的MyCat進行測試,一樣是配置了DML表級權限,發現並無這個錯誤。這時候我想這多是個MyCat的bug。編輯器
發現bug後,我找到MyCat的GitHub地址,而後fork了源碼而且clone了下來。報錯的MyCat版本是1.6-RELEASE-20161028204710-linux.tar.gz,可是GitHub上面已是最新的代碼並不是這個版本。可是一般一個軟件每次版本更新都會打上tag,因此咱們能夠經過tag回到出錯的版本。測試
首先使用命令git tag查看tagui
使用git checkout tag版本,切換到對應的版本。spa
經過Idea打開項目,我嘗試啓動項目殊不知道從哪兒啓動。因而我想起了以前報錯的信息,看到MycatStartup,找到這個類發現了啓動入口。而後啓動日誌以下圖2。
找到了入口,我在server.xml中修改DML表級權限,而後再次啓動發現報錯以下圖2,不一樣的是此次我能夠定位到具體是哪一行代碼拋出的異常。
經過異常信息能夠看出是XMLServerLoader這個類的問題,因而打上斷點開始分析。當執行到下圖的ConfigUtil.getDocument的時候拋出了異常。
經過下面的註釋能夠看到這應該是在獲取server.xml的標籤,獲取的時候拋出了異常。這也驗證了以前咱們推測的是解析xml出現了問題。繼續debug看ConfigUtil.getDocument裏面幹了什麼。
實際上最後拋出異常就是builder.parse因此能夠確定是解析xml的問題。可是回頭我看了xml並無什麼大的問題,直到看到圖2的這行代碼,開啓xml的校驗規則。難道還有什麼校驗規則嗎?
因而回到上面我看到了一個dtd文件,令我很疑惑這是個什麼東西,點開之後也確實有看不懂,因而我百度了一下dtd是什麼時,我才知道是指定xml校驗規則的。
打開server.dtd文件看一下是否是規則定義的不對呢?當我看到第21行的時候這個東西很熟悉,咱們控制檯日誌錯誤說的就是他。
因而我去看了一下dtd的規則,到底是什麼意思時。我恍然大悟發現了出現bug的緣由。能夠經過下圖看到,21行中的規則表示的是在user標籤中至少出現一次property。
若是咱們配置了DML也就是說user標籤下面會多了一個privileges標籤,可是卻沒有指定privileges出現的次數。
經過上面的猜想嘗試加上privileges測試一下,因爲privileges會出現零次或屢次,因此加上privileges*。
再此測試發現即便配置DML也能夠正常啓動,這也就是bug的源頭。就是忘記了在server.dtd文件中加上對privileges的處理。
最後若是你想復現這個bug,須要使用Mycat的1.6-RELEASE版本,固然新的版本中早已經解決了這個bug。因此若是你在實際工做中使用時且須要配置DML表級權限,那麼你能夠選擇換一個新的版本。
1.各大培訓機構,價格10萬的視頻 Java架構師視頻免費送。
2.各類電子書籍經典Java書籍免費送
3.我的技術總結免費贈送
4.關注下方個人公衆號進行免費獲取。
本文分享自微信公衆號 - 大貓的Java筆記(damaoJava)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。