msgpack-javaのバグらしきものを見つけた話

2
Kenji Yoshida @xuwei_k

使い方悪いのかバグってるのかわからないけど #msgpack javaの0.7.0-p2でこんなエラー gist.github.com/xuwei-k/608170… でることがあって、試行錯誤けどイマイチ発生条件絞れずに一旦諦めた(´・ω・`) 単にスレッドセーフじゃないとかだろうか

2014-11-29 19:08:31
Kenji Yoshida @xuwei_k

とりあえずStringのArrayのValueの書き込みのときに発生して、それの総バイト数がデフォルトだと8192前後のときに発生して、かつこの設定値 github.com/msgpack/msgpac… 変えると変化するので、packのバッファーの拡張時の処理?がバグってる気がする

2014-11-30 01:24:08
Kenji Yoshida @xuwei_k

@xuwei_k stringDecoderBufferSizeを小さくすると、また別の原因で別のパターンで?バグる気がする

2014-11-30 01:52:02
Taro L. Saito @taroleo

@kzk_mover @xuwei_k MessagePackerはスレッドセーフには敢えてしていませんが、どうなんでしょう?

2014-11-30 02:16:25
Kenji Yoshida @xuwei_k

@taroleo ParkerってnewDefaultParker github.com/msgpack/msgpac… とかnewParkerで生成したやつですよね? (もしそうなら、メソッド内で生成して使い切ってるので、スレッドセーフな使い方してるつもりなのですが)

2014-11-30 02:21:05
Taro L. Saito @taroleo

@xuwei_k はい。同一MessagePacker.packXXXを複数スレッドから呼び出さない限りは大丈夫です。そうするとbuffer boundary周りでしょうかね。再現できないのが不思議ですが

2014-11-30 02:22:38
Taro L. Saito @taroleo

@xuwei_k 同じMessagePackerインスタンスを複数スレッドで同時にアクセスしなければ、という意味です。

2014-11-30 02:24:05
Taro L. Saito @taroleo

@xuwei_k って、もしかしてValueを使ってますか。。。いまちょうど実装中でテストケースをこれから増強していきますー。参考 github.com/msgpack/msgpac…

2014-11-30 02:28:35
Kenji Yoshida @xuwei_k

@taroleo はい。まだハッキリした条件わかってないですけど、 (Arrayの?) Valueをpackかunpack時に発生してる感じです

2014-11-30 02:32:57
Kenji Yoshida @xuwei_k

@taroleo 自分の使い方間違ってたのか、バグなのかわからないけど、やっとある程度シンプルな再現ケース作れました gist.github.com/xuwei-k/41dd76…

2014-11-30 03:00:50
Kenji Yoshida @xuwei_k

@xuwei_k これ、バグってるのpackerじゃなくてunpackerのほうかも?

2014-11-30 03:40:34
Kenji Yoshida @xuwei_k

ここのflush github.com/msgpack/msgpac… でbufferにnull入れてる github.com/msgpack/msgpac… けど、その直後にbuffer.size()を呼びだしててヌルポか

2014-11-30 11:55:52
Kenji Yoshida @xuwei_k

ここのwhileがなにやってるのかよくわかってないけど、515行目でflush実行したら、whileから抜けるかbreakすべきか、flushでbufferをnullにしてる処理間違ってるか、bufferをnullにする前に事前にbuffer.sizeを変数に保持しておくとか?

2014-11-30 12:02:20
Kenji Yoshida @xuwei_k

もう1つのbyte[]を書き込むほうのwritePayload見ると、ほぼ同じ処理してて、かつflushした場合はprepareBuffer呼び出して新しいbuffer作ってるから、prepareBufferの呼び出し忘れかな? github.com/msgpack/msgpac…

2014-11-30 13:50:44
おくみん@女子高校生 @okumin

@xuwei_k パッと見た感じpositionがあればnullいらなそうな気がしたんですけど、そういうものでもないんでしょうか。

2014-11-30 14:05:38
Kenji Yoshida @xuwei_k

@okumin 試したらそれでも正しく動くっぽいですね。ただ、もともとパフォーマンスのために変更した際にバグったみたい? github.com/msgpack/msgpac… github.com/msgpack/msgpac… なので、なにかパフォーマンス上違いあるのかもしれませんが

2014-11-30 16:44:08
おくみん@女子高校生 @okumin

@xuwei_k nullならもう一回allocateするようなコードになってるように見えたけど気のせいだったかもしれません。

2014-11-30 17:33:42
Kenji Yoshida @xuwei_k

該当箇所をprepareBuffer呼び出すようにしても、「できるだけ色んなValueをScalaCheckで生成してpackしてunpackしたら元に戻る」というテスト書いたけど github.com/xuwei-k/msgpac… まだまだ失敗するので、誰か直してください・・・

2014-11-30 17:49:33