差分FTPを考える(7 – いろいろ不具合があったのでその話

スピードもアップして、これで!、と思ってテストしていたら色々問題がありました。
こういう問題を修正していくのも面白いものです。

連続ファイル転送ができなくなることがある

元々はワードプレスのバックアップのためにつくり始めたのですけど、
ワードプレスのプラグインやテーマのファイルってかなり多くのファイルからなっているようで、私の環境で5000以上ものファイルがあります。

これをラズパイ→ラズパイと言うようにローカルでテストした場合には問題なかったのですが、
ラズパイ→さくらインターネット(スタンダード)としてみた所、数百個ファイル転送が済んだところで転送が止まってしまう現象が発生しました。
リトライするとまた別のファイルでも止まってしまう減少が起きましたので、ファイルに起因する現象ではないようです。何か転送量のブロックでもしているのでしょうか?でも容量的には40MB程度ですのでそれほど問題だと思えませんが・・・。

止まってしまっても、エラー発生後にやり直すとあっさりつながるので、リトライするようにしました。

for my $var (3,5,10,30,60){
  # 転送処理
}

要素5個の配列で回しています。$varには順に3,5,10,30,60が入ります。
リトライを繰り返すほどなにかおかしいということですので、$var秒だけスリープします。

何回か試してみた所、1回リトライすればつながるようでしたけど・・・。

ファイルが無くなることがあった

ワードプレスのプラグインの中にはキャッシュコントロールするものがあります。
どうもこのファイルが自動削除される事があるようです。
それに、こんなにたくさんのファイルが有るとは思っていませんでしたので、こんなに時間がかかると思いませんでしたので、そこが盲点でした。ファイルリストをとったタイミングと実際にそのファイルが転送されるまでの間にタイムラグが結構あるので、変更がわりかしあるディレクトリが対象だった場合、実際の転送時には既にファイルが変更・削除されている可能性は割りとあると思います。これは考慮せねばなりませんね。

if ( -f $filepath ){
}

ここは単純に転送する直前にファイルが有るかどうかをチェックするようにしました。

リストをとったタイミングと実際の転送のタイムラグがあると動機にならないじゃないかという問題があります。この問題については、次回の転送時にファイルの変更を検出できるので良し、としました。また、これだけ頻繁に内容が変わるとなると完全なバックアップは無理ということですね。キャッシュのバックアップがそこまで厳密に必要とは思えませんので、動悸したいファイル群がほんとうに必要かどうかというのも重要なファクターになると思います。

削除されたファイルには非対応

この方式では削除されたファイルを転送先から取り除くことができません。
ファイルの存在は一意に決まるので、余計なファイルが有って何か不具合とはあまりないような気もしますが、あるような気もしますね・・・。

これについてはまた考えたいですね。