2011年2月27日日曜日

Trying thrift4go with Cassandra

2010/3/26追記:Goのrelease.2011-03-07.1とThriftのr1085676だとコンパイル通らなくなってる。たぶんGoの文法が(また)変わったのが原因。

Go用にコードを生成するthrift4goがThrift本体に取り込まれたので、早速それをCassandraとの連携で試してみることにする。試したのはThriftのr1075010。

Thriftのビルド

何はともあれThriftをビルドしないことにははじまらないので、SVNからソースを落としてきてビルドする。

$ svn co http://svn.apache.org/repos/asf/thrift/trunk thrift
$ cd thrift
$ ./bootstrap.sh
$ ./configure --with-go --with-cpp --without-java --without-php --without-python --without-erlang
$ make -j2
$ sudo make install
$ cd lib/go
$ make && make install

注意点としては、なぜか単純にconfigure -> make -> make installしただけではGo用のライブラリがビルドされないので、手動でGoのライブラリをmake installしないといけないこと。これは単にconfigureスクリプトまわりのバグか、自分のやり方が悪いかのどっちかだけどとりあえず放置して先に進む。

ちなみに、Goのライブラリをインストールすると$GOROOT/pkg/linux_386/といった場所(このパスは環境に依存する)にthrift.aという名前でライブラリのバイナリが配置される。ここに配置されることによって、Goのプログラムから'import "thrift"'という感じでパッケージのインポートができるようになるけど、もしこのパスに置かずに直接インポートしようと思ったらthrift.aへのパスを明示的に指定しないといけない。

  • $GOROOT/pkg/linux_386/にthrift.aがある場合
  • package main
    import (
        "thrift"
    )
    ...
    
  • $GOROOT/pkg/linux_386/以外の場所(例えばプログラムと同じディレクトリ)にthrift.aがある場合
  • package main
    import (
        "./thrift"
    )
    ...
    

ThriftによるCassandraコードの生成

Thriftのビルドとインストールは終わったので、今度はCassandraのインタフェース定義からGoのコードを生成してもらって、コンパイルする。

$ thrift --gen go ~/lib/cassandra/interface/cassandra.thrift
$ cd gen-go/cassandra/
$ make
8g -o _go_.8 ttypes.go Cassandra.go
Cassandra.go:89: syntax error: unexpected range, expecting )
Cassandra.go:99: syntax error: unexpected name, expecting )
Cassandra.go:109: syntax error: unexpected name, expecting )
Cassandra.go:121: syntax error: unexpected name, expecting )
...

とここでコンパイルエラー。ソースを見てみたら、どうやら変数名に予約語のrangeが使用されてるせいでコンパイルエラーが起きている様子。ということでcassandra.thriftの定義を少々いじる。

$ diff cassandra.thrift cassandra.thrift.org
421c421
<                                   3:required KeyRange key_range,
---
>                                   3:required KeyRange range,

そこから改めてコード生成してコンパイルしたら上手くいった。

$ thrift --gen go ~/lib/cassandra/interface/cassandra.thrift
$ cd gen-go/cassandra/
$ make
8g -o _go_.8 ttypes.go Cassandra.go
rm -f _obj/thriftlib/cassandra.a
gopack grc _obj/thriftlib/cassandra.a _go_.8
cp _obj/thriftlib/cassandra.a "/home/masato/lib/google-go/pkg/linux_386/thriftlib/cassandra.a"
$
(続く)

0 件のコメント:

コメントを投稿