リンクするaprのバージョンを0.9xから1.2xに

WebDAV(=Apache)でリポジトリにアクセスすると、500が返ってきてログにも何も残らないと言う現象に遭遇する。で、色々調べていくうちのSubversionApacheaprのバージョンの不整合が原因と言う事が分かった。

なお、Apache HTTP Server 2.0系で利用されているAPR 0.9系と、Apache HTTP Server 2.2系で利用されているAPR 1.2系では、互換性がないことに注意されたい。

http://builder.japan.zdnet.com/news/story/0,3800079086,20361867,00.htm


トラブルシューティングの手順を残しておく。


まず、Apacheのログに何も残っていないので、telnetから直接WebDAVのリクエストを投げる。参考:Subversionによるバージョン管理 (2/3):Apache 2.0でWebDAV(後編) - @IT

$ telnet localhost 80
OPTIONS /svn/ HTTP/1.1
Host: hostname
Authorization: Basic ===============


すると、xmlでエラーの詳細が返ってくる。

HTTP/1.1 500 Internal Server Error
Date: Fri, 08 Feb 2008 02:43:28 GMT
Server: Apache
Content-Length: 290
Connection: close
Content-Type: text/xml; charset="utf-8"

<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="22">
Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument
</m:human-readable>
</D:error>
Connection closed by foreign host.


ポイントは以下。

Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument


これでググるhttp://saikyoline.jp/wiki/index.php?%A5%E1%A5%E2%2FWebDAV%A4%C7Subversionaprのバージョンが原因と書いてある。

Subversionはそのままだと同梱のAPR(0.9.7)を使ってしまうので、Apache 2.2.0に同梱のAPR(1.0)を使わせるため「--with-apr」と「--with-apr-util」を指定する。
指定しなくてもコンパイルもできてApacheもしっかり起動するが、アクセスするときに

Can't set position pointer in file '/var/lib/svn-repos/db/revs/0': Invalid argument
みたいなこと言われてハマる

http://saikyoline.jp/wiki/index.php?%A5%E1%A5%E2%2FWebDAV%A4%C7Subversion

aprのバージョンを確認するにはlddを使う。まずはSubversion(mod_dav_svn)。

$ ldd /usr/local/apache2/modules/mod_dav_svn.so
        libaprutil-0.so.0 => /usr/lib/libaprutil-0.so.0 (0x008f9000)
        libapr-0.so.0 => /usr/lib/libapr-0.so.0 (0x00270000)
        (snip)

$ ll /usr/lib/libapr*.0
lrwxrwxrwx  1 root root 18  1月 25 14:57 /usr/lib/libapr-0.so.0 -> libapr-0.so.0.9.17
lrwxrwxrwx  1 root root 22  1月 25 14:57 /usr/lib/libaprutil-0.so.0 -> libaprutil-0.so.0.9.17


恐らく0.9.17。次にApache

$ ldd /usr/local/apache2/bin/httpd
        libaprutil-1.so.0 => /usr/local/apache228/lib/libaprutil-1.so.0 (0x0078a000)
        libapr-1.so.0 => /usr/local/apache228/lib/libapr-1.so.0 (0x00b5d000)


$ ll /usr/local/apache228/lib/libapr*.0
lrwxrwxrwx  1 root root 18  2月  6 16:03 /usr/local/apache228/lib/libapr-1.so.0 -> libapr-1.so.0.2.12
lrwxrwxrwx  1 root root 22  2月  6 16:03 /usr/local/apache228/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.2.12


恐らく1.2.12。確かにバージョンが違う。
と言うわけで、再々度Subversionコンパイル。この際なので色々オプションを調べて自分なりのconfigureを作る事に。

./configure \
--with-apr=/usr/local/apache2 \
--with-apr-util=/usr/local/apache2 \
--with-apxs=/usr/local/apache2/bin/apxs \
--with-swig=/usr/local/bin/swig \
--with-neon=/usr/local/ \
PERL=/usr/local/bin/perl \
PYTHON=/usr/local/bin/python \
RUBY=/usr/local/bin/ruby \
--with-ssl \
--without-berkeley-db


これでインストールしたらWebDAVで無事アクセスできた。いい加減これで全部かなー。