はじめに
(以下は、会社を代表するものではなく、個人の意見です。)
筆者は会社にて、ソフトウェア開発および保守作業を行っています。
オープンソースソフトウェア(以下、OSS)を利用した作業は平時行っていますが、過去に非常に特徴的(と思っている)な作業を行いましたので、この場にてご紹介します。
内向け外向け問わず、共有フォルダの.txt、.docx、.xlsxファイル以外の情報発信について、筆者の周りで理解されることはとても少ないです。このような場があることを大変嬉しく思います。
まとめ
- 利用しているOSSにおいて、
メソッドが見つからないエラー
が突然発生する事例が何度も発生していました。 - ソースコードを追いかけた結果、マルチスレッドに関するバグで、排他漏れのため、あるスレッドがメソッドを定義したつもりでも、他のスレッドからはスレッドが定義されていないと見えるバグでした。
- 回避する修正を行った後、「他にも同様の問題がないのか?」 という話になり、探してみることになりました。
- 類似の問題を検出し、さらに別の問題も解決する糸口が得られました。
- 方々からのプレッシャーにめげそうでしたが、諦めなくてよかったです。
肝心のバグ
- 発生頻度: 3〜6ヶ月に一度
- 傾向: 無し、様々な環境の同一プロセス中のコードで発生
- 影響: 普段は動作する処理で突然の
メソッドが見つからないエラー
による処理中断、半端な状態のままになる事象に対し、復旧に時間がかかりました - 実際の処理: このメソッド
自宅でも職場でも穴が開くほど見つめてわかりました。。。
その後は .xlsxファイル にフローチャートを書き修正の論理を説明。規則に則り社内手続きを行って修正をリリースすることができました。
その過程で利用しているOSSで他にも問題がないのか、というご意見を賜りました。そのため、類似の問題を調べる作業が始まりました。
バグを探す方法
- githubやcodehauseのissueをマルチスレッド関連のキーワードで検索
- プロジェクトで利用しているバージョン〜最新のバージョンを対象に
- githubはAPIを使い楽をしました
- ヒットしたissueの内容を確認
- 修正の背景
- 修正されたソース
怪しいバグが見つかった場合
- 携わっているプロジェクトにおける発生有無を検証。(時間をかけても出ないこともあると考えており、若干打ち切りましたが・・・)
調査対象
- サーバサイドで利用していたOSS 25個
- issue累計: 1152件
- マルチスレッドに関連しそうなもの: 108件
- プロジェクトにおいて発生するもの: 1件
その後の作業
検出した問題について、修正をリリースしました。お客様や、他部署によるテスト環境で発生する前にリリースできたのは、非常に珍しく、また喜ばしいことでした。
オチ
冒頭に記載したマルチスレッドに関するバグですが、実はしっかりissueが発行されていました。プレッシャーに追われた中だと見逃してしまったようです。プロジェクトで使用しているバージョンより新しいバージョンでのissueを見つけたから、使っている古いバージョンのソースにもバグがあるかも、と考えていくことは有事の際だと、できませんでした。
ノーメソッドエラーイミワカラナイよ。
問題に直面したときは、しっかりissueを確認するべきですね。そしてソースコードも。慌てたりプレッシャー、ダメ、ゼッタイ。
副産物
同時期にもう1つ、2つのスレッドがハングする という別事象が発生していました。こちらも再現せず、特に傾向もなく、あちこちで発生していました。
諸々のissue調査の後、たまたまハング事象が再発しました。今回は始めからマルチスレッド関連と(根拠もなく)疑ってかかり、複数の環境で再現テストを行いました。
- Windows2008(スペックの低い仮想マシン、2コア
- Windows7(スペックそこそこ、8コア
- CentOS(スペックの低い仮想マシン
2の環境で再現。偶然にも止まった箇所は、メソッドが見つからないエラー
を出していたメソッドでした。後はjstackやらvisualvmを使ってJavaVMを覗いたところ、根本の原因は異なっていました。まさか古いJRubyのマルチスレッド関連バグにぶち当たるとは。。。先の修正にて発生しなくなることも確認できたので、無事解決となりました。
思い返すと、ずっと1、3の環境を利用していたので、メソッドが見つからないエラー
も含め、全く再現しなかったのかと感慨深くなりました。
所感
突然発生する メソッドが見つからないエラー
、再現しないのでお手上げ、と諦めず数年に渡り(他のこともしてます)調べ続けていたから、この問題もなんとか解決できたなぁ、、、とホッとしたことを覚えています。
気軽に「回避する処理入れたらいいじゃない」と言われても、「どこで発生するのかわからないんです!」と叫びたい、「宇宙線の影響でメモリがおかしくなったことにしたい」そう思っていたことも、何度もありました(してません。
各所にご迷惑をかけ、早く解決してね
という状況が何度も発生していたので、本当に、、、、良かったです。
余談
利用しているOSS、常に新しいバージョンを使っていたら問題の発生そのものを抑えられていたのは間違いありません。類似のバグ探しも、新しいバージョンを使っていけばそもそも不要だと論ずることもできます。ですが、そうすると新たなリグレッションの可能性や非互換などの可能性もゼロとは言い切れないため、なかなか難しい側面があります。
周囲を観測している限りでは、古い(枯れた、とよく呼びます)OSSを使うことが多いと思います。
しかしながら、比較的新しかったり、最新の技術・OSSを採用し、大規模な開発へ挑戦しているケースもございます。
日々、色々な希望と危機感とを持って開発、保守作業を行っております。
このような場をきっかけとして、様々な情報発信や共有が行われていくことになれば幸せと思います。今後とも皆様にはご指導ご鞭撻賜りますよう宜しくお願い申し上げます。