q4m を debian にインストール

会社の debian にインストールしようとしたところ、
異なるエラーが出たため、一応記録しておく。

# ./configure --with-mysql=/home/kameid/mysql-5.1.30/ --prefix=/usr/local/mysql
checking for mysql source code... "/home/kameid/mysql-5.1.30/"
checking for int*... yes
checking size of int*... configure: error: cannot compute sizeof (int*), 77
See `config.log' for more details.

もーほんまナニコレって感じなんだけど、
http://www.infosia.co.jp/posts/249
ここ見つつ、一個ずつ解決していってるところ。

まず、上記、configure を以下に修正。

then
    #LDFLAGS="-Wl,--hash-style=both"
    LDFLAGS=""
fi

hash-style=both は、

DT_GNU_HASH を使うと、共有ライブラリのシンボル解決が 50% 程度速くなるそうです。

これを有効にするには、binutils 2.17cvs20070426-1 以降と glibc 2.5-5 以降の環境で、LDFLAGS に --hash-style=both を追加 (gcc-4.1 4.1.2-5 以降では標準で追加される) して、システム全体をリビルドする必要があります。

http://debian.fam.cx/index.php?Tips#content_1_18

というものらしい。んでもって、

Linux の共有ライブラリをリンクするためのハッシュテーブルは、従来、.hash というセクションに収められていたのが、CentOS 5.0 や Fedora Core 6 以降? といった新しい環境では、.gnu.hash という新しいセクションに収められるようになった。

で、後者の環境で何も考えずに共有ライブラリをビルドすると、.gnu.hash セクションのみをもつものができあがるんだけど、それを Debian Etch とかに持っていくと、dlopen した際に SIGFPE で落ちてしまう。

問題を回避するためには、リンカに --hash-style=both というオプションを渡してやれば、両方のセクションが作成されるので、この問題を回避できる。

Linux で共有ライブラリをビルド&配布する際に気をつけること - kazuhoのメモ置き場

という経緯で、このオプションが指定されるようになったようだ。


ちなみに、gcc のバージョンは、

# gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Copyright (C) 2006 Free Software Foundation, Inc.

んで、make したところ出たエラーの解消のために、

$ vi src/ha_queue.h
#define LLONG_MAX    9223372036854775807LL
#define LLONG_MIN    (-LLONG_MAX - 1LL)

を追加。(参考URLと全く同じように対処)

これで、make は通り、make install まで完了。

# /usr/local/mysql/bin/mysql -u root -p mysql < support-files/install.sql
Enter password: 
ERROR 1126 (HY000) at line 1: Can't open shared library '/usr/lib/mysql/plugin/libqueue_engine.so' (errno: 2 cannot open shared object file: No such file or directory)

おっと、想定外のエラー。共有ライブラリの参照先が違うな。mysql の configure 間違えたのかな。basedir を以下のように追加。

# vi /etc/my.cnf 
[mysqld]
..
basedir         = /usr/local/mysql

mysqld を再起動。

# mysqladmin -u root shutdown
# mysqld_safe --user=mysql &

これで、install.sql をやり直したところ、無事登録が出来た。

# /usr/local/mysql/bin/mysql -u root -p mysql < support-files/install.sql
Enter password: 

# /usr/local/mysql/bin/mysql -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.30-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show plugins;
+------------+--------+----------------+--------------------+---------+
| Name       | Status | Type           | Library            | License |
+------------+--------+----------------+--------------------+---------+
| binlog     | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| ARCHIVE    | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| BLACKHOLE  | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| CSV        | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| MEMORY     | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| InnoDB     | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| MyISAM     | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL               | GPL     | 
| QUEUE      | ACTIVE | STORAGE ENGINE | libqueue_engine.so | GPL     | 
+------------+--------+----------------+--------------------+---------+
9 rows in set (0.00 sec)

おけおけ。「QUEUE」ってのが追加されている。
テストも通しておく。

# apt-get install libdbd-mysql-perl libdata-compare-perl
# apt-get install liblist-moreutils-perl 
# # DBI='dbi:mysql:database=test;host=localhost;mysql_socket=/tmp/mysql.sock' \
DBI_USER='root' DBI_PASSWORD='mysql' ./run_tests.pl

t/01-base-rnd_pos.........................ok                                 
t/01-base.................................ok                                 
t/02-queue-cond...........................ok                                 
t/02-queue-owned-delete...................ok                                 
t/02-queue................................ok                                 
t/03-queue-error-wait.....................ok                                 
t/03-queue-error..........................ok                                 
t/04-blob-cond............................ok                                 
t/04-blob.................................ok                                 
t/05-multireader..........................ok 1/4                             

Multireader benchmark result:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            3.991 seconds
    Throughput:         1603.607 mess./sec.

t/05-multireader..........................ok                                 
t/05-multirw..............................ok 1/4                             

Multi-reader-writer benchmark result:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            10.419 seconds
    Throughput:         614.243 mess./sec.

t/05-multirw..............................ok                                 
t/05-multiwait............................ok 1/4                             

Multi-reader-writer benchmark result under semi-starvation:
    Number of messages: 6400
    Number of readers:  32
    Elapsed:            19.429 seconds
    Throughput:         329.396 mess./sec.

t/05-multiwait............................ok                                 
t/06-multi................................ok                                 
t/07-trans................................ok                                 
t/08-forward..............................ok                                 
t/09-pqueue-single-table-wake-listener....ok                                 
t/09-pqueue-single-table..................ok                                 
All tests successful.
Files=17, Tests=68921, 1006 wallclock secs (186.70 cusr + 13.12 csys = 199.82 CPU)

ってことで、無事インストールできた。


・・・が、どうにもパフォーマンスが出てない様子なので、もうちょっと configure をちゃんとしないとだめそう。その辺はまた後日。

どうも q4mdebian とは相性宜しくないようで。つーか、本番機は RedHat なのに、何でこの検証用マシン、debian なんだよ。絶対誰かの趣味だな・・・。