naoki86star

インターネットの片隅でなにかしら書いてみる

voltdbclient.py

 Voltdb は結構速いスパンであがってるみたいです。二週間くらい前に、7.1.1になったと聞きました。

 リリースノートちらみとかコミュニティ版使っていろいろ気にしないといけない違いが目につき始めます


 python インタフェースのライブラリにあたるvoltdbclient.pyも、まずファイルサイズだけ見るとずいぶんと違います。sshに関係するような差分が増えているような感じ(あくまで感じ)です。多分サーバの接続受付の仕様に変化があるんですね。

 voltdbclient.py 使って最近は@adhoc以外のprocedure にも使うようになってたのですが、そのようなときに結果を取得ときたまに例外を吐くことがあります。procedureはjavaで記述してコンパイルしたclassファイルなので、その書き方にも変更が入ったのかあるいは前からそうなのかがよくわかりません。

 procedureをjavaで記述すると、結果をTableの形式で戻します。通常のqueryで得られる結果と同じ形式で、コード内でVoltTableという型を定義してそのインスタンスに行を加えていってその結果を戻す、ような感じです。このときに、1callで複数のTableを返すことができます。1callで複数のqueryを走らせて複数結果を1returnで戻せるというのがprocedureのひとつのいいところのようです。スキーマ上に存在するTableだけでなくコード内で返したい結果に合わせてカスタムでテーブルを定義して返すことも可能です。

 うまくいっていないのは、この複数結果を返すときに*12,3番目の行数が0のときが怪しい、感じでした。voltdbclient.pyはVoltDBのwireprotocolにしたがってサーバから得たバイト列をオブジェクトに変換していってます。VoltTableの情報を受け取るところでテーブル毎にstatusという値を受け取るときどうも列数が0だと正常以外の値が戻っているようにみえました。

 javaで書いたclientまた比較できるものでc++で書いたクライアントとも比較できますが、それらではエラーがおきてるようには見えません。


 とりあえずvoltdbclient.pyはVoltTable生成処理のところでstatus!=Noneのときcolumncount,rowcountを0とかに上書きしておくときれいに通るようにみえます。つまりstatusが0以外のときに行数・列数が正しく通知されていない感じです。
 onlineのwireprotocolが更新されていないようなので*2これの新しいのを見れたらどうするのがいいのかわかりそうです*3なんか、新バージョンになってprocedureの書き方の作法が変わったというオチも予想されます。*4

*1:うちらの例で具体的に4テーブル返している

*2:http://downloads.voltdb.com/documentation/wireprotocol.pdf

*3:supportに聞いてみるかも

*4:リリースノートが追いきれない...