Skip to content

rsync が一時的に失敗する(re-run で成功する) #10

Description

@naokazuterada

事象

rsync が一時的に失敗し、同じコミットのまま re-run すると成功することがある。

rsync: mkdir "/home/users/1/small-elephant/web/noie.tokyo" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]
[DEPLOY] - sync -> [ERROR]
##[error]Process completed with exit code 1.

エラーは「転送先ディレクトリが存在しない」と言っているが、実際には存在する(直前の before_sync で同じパスの wp/wp-includes/version.php を SSH 経由で cat できている)。再実行すれば同じ設定・同じコミットで通るため、サーバ側の一時的な応答不良と考えられる。

発生状況

2026-07-28 の wp2shell 対応中、1日で3回発生した。

日時 サイト ブランチ サーバ
2026-06-29 danc.kyushu-u.ac.jp main Heteml
2026-07-28 compass.chiba-sakamotokaikei.com staging Heteml
2026-07-28 noie.tokyo main Heteml
2026-07-28 danc.kyushu-u.ac.jp staging Heteml

いずれも re-run で成功。

短時間に多数のデプロイを走らせたことが影響している可能性がある(SSH の同時接続数やレート制限)。通常運用では滅多に起きないが、今回のように複数サイトを立て続けにデプロイすると顕在化する。

なぜ対処したいか

対策案

案1: rsync のリトライ

deploy.sh の rsync 実行部分を数回リトライする。

for i in 1 2 3; do
  rsync ... && break
  log "- sync -> retry ($i/3)"
  sleep 10
done

注意: リトライしてよいのは転送そのものの失敗に限る。before_sync の中断(exit 1)はリトライしてはいけないので、do_sync の rsync 部分だけを対象にすること。

案2: 失敗の種類を見分けてメッセージを変える

rsync の終了コード(code 11 = file IO error, code 12 = protocol error 等)を見て、「一時障害の可能性が高いので re-run を試してください」と案内する。リトライはせず、判断材料だけ与える。

案3: 何もしない(現状維持)

通常運用では滅多に起きないため、記録だけ残して re-run で対処する。

補足

--delete 付きで動作しているため、中途半端に転送が終わった状態で失敗するとサーバ側が壊れる可能性がある点は留意が必要。今回のケースはいずれも mkdir の段階で失敗しており、ファイルの削除・転送は始まっていなかったため実害はなかった。

リトライを入れる場合も、この観点で「どの段階の失敗なら安全に再試行できるか」を整理しておきたい。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions