2012年5月26日
perlbrewのperlをrsyncでばら撒くときの注意点
結論:なにも考えずに--updateオプションをつけているとハマる。--updateは付けちゃダメ!絶対!
perlbrewでインストールしたPerlをrsyncでばら撒くという運用をしているところは多いと思うんですけど、そこで最近一点ハマりました。
cpanモジュールをインストールした時にpmファイルのタイムスタンプは、tar ballの中身のファイルのタイムスタンプがそのまま保持されています。
ただし、コアモジュールのタイムスタンプはPerlインストール時のものになります。
そして、コアモジュールをupgradeした場合は、タイムスタンプはtar ballの中身のタイムスタンプになるので、タイムスタンプが古くなります。以下例。
$ perl -MTime::Piece\ 999
Time::Piece version 999 required--this is only version 1.15_01.
BEGIN failed--compilation aborted.
$ ls -l Time/Piece.pm
-r--r--r-- 1 app app 22729 May 10 15:00 Time/Piece.pm # <- 今年の5月10日
$ cpanm Time::Piece
...
$ perl -MTime::Piece\ 999
Time::Piece version 999 required--this is only version 1.20.
BEGIN failed--compilation aborted.
$ ls -l Time/Piece.pm
-r--r--r-- 1 app app 23506 Mar 17 2010 Piece.pm # <- 2010年!?
つまり、5月10日にインストールしたPerlのTime/Piece.pmのタイムスタンプはその時のものになってるんですけど、cpanmでupgradeしたら、2010年のタイムスタンプになってしまいます。
これは、一台で動かす分には特に問題は起きません。
ただ、別のサーバーにrsyncをかけているような場合に、--updateオプションを有効にしてると、タイムスタンプが古いファイルは転送されないという困った事態が起こりえます。
なので、perlbrewのperlをrsyncする場合は--updateオプションは付けないようにしましょう。
ちなみにArcher::Plugin::Rsyncだと、updateオプションがデフォルト有効になっているのでハマりました。