Skip to content

起動の待ちの制限時間(60 秒)が実際の時間ではなく巡の回数で数えられている #374

Closed

Description

@takemi-ohama

何を見つけたか

devbase up / devbase scale の起動の待ち(wait_for_containers_ready)は、制限時間 timeout=60 を実際の時間ではなく巡の回数で数えている。

  • 1 巡で、まだ決まっていない番号ごとに状態の確認(docker compose ps)と、動いていれば完了の確認(docker compose exec ... test -f)を行い、その後に 1 秒休んで回数を 1 増やす。起動できた・終了した・見つからないと決まった番号へは、その後の巡で問い合わせない
  • 回数が 60 に達した時点で完了を確かめられていない番号は、timeout (60s) waiting for the entrypoint to complete として ContainerStartupError に入る
  • docker の呼び出しにかかる時間は回数に入らないため、実際に待つ時間は 60 秒より長い。まだ決まっていない番号が多いほど、接続先が遠い(リモートの docker context)ほど長くなる
  • 1 台が起動できなくても、残りの番号は制限まで待つ(up でコンテナが 1 台でも落ちると、起きているコンテナにも起動の後の処理(window.title・token・エディタ)が行われない #371)。1 台が落ちた up / scale は最長で制限まで延びるため、このずれが利用者の待ち時間にそのまま出る

実測はしていない。コードの読み取りで確かめた(main = d433e55)。

$ sed -n 272,292p lib/devbase/utils/docker.py
    while pending and rounds < timeout:
        ...(まだ決まっていない番号の状態の確認と完了の確認)...
        pending = still_pending
        if not pending:
            break
        time.sleep(1)
        rounds += 1

この数え方は確定仕様とテストにも書かれている。

場所 内容
lib/devbase/utils/docker.py:237 wait_for_containers_ready。docstring は timeout を「Maximum number of 1-second rounds」とする
lib/devbase/utils/docker.py:181 時間切れの文言 timeout ({timeout}s) waiting for the entrypoint to complete
docs/specifications/post-start.md:124-126 「制限は 1 秒の休みを挟む巡の回数で数えるため、docker の呼び出しにかかる分だけ実際の時間は 60 秒を超える」
tests/utils/test_wait_for_containers.py:161 test_rounds_do_not_exceed_the_limit(巡の数が制限を超えないことを固定する)

どこで見つけたか

#224・#371 の設計(確定仕様 docs/specifications/post-start.md)で、起動の待ちの振る舞いを読んだときに見つけた。

なぜこの変更の範囲外なのか

#224 の要求の前提 4 が「制限時間(60 秒)は変えない」と定めている。数え方を実際の時間へ変えると、今は通っている遅い起動(初回の clone が長い・接続先が遠い)が時間切れになり得るため、#224 の変更では巡の回数のまま残した(設計の決定 8)。

根拠: Vision(MVV 版 1)。どの端末でも同じ結果になることを目指すが、今の数え方では、待てる長さが端末と接続先の速さで変わる。

直さないと何が起きるか

  • 時間切れの文言の 60s と、実際に待った時間が合わない。利用者は 60 秒で止まったと読むが、実際はそれより長く待っている
  • 待てる長さが、インスタンスの数と docker の呼び出しの速さで変わる。同じプロジェクトでも、手元では間に合い、リモートでは間に合わない(またはその逆)ことが起こり得る
  • 実害の観測はまだ無い。実際の時間で数えるなら、制限の値(60)を今の実質の長さに合わせて見直す必要がある

直す場所

項目 内容
コード lib/devbase/utils/docker.py の wait_for_containers_ready(経過時間で打ち切る。制限の値の見直しを含む)
確定仕様 docs/specifications/post-start.md:124-126 の数え方の記述
テスト tests/utils/test_wait_for_containers.py の巡の数を固定する試験を、経過時間で打ち切る試験へ置き換える

由来

issue #224

受け入れ条件

2026-10-13 スプリント m8d の要求として書いた(設計なし)。2026-10-13 の利用者の決定(数え方は変えず、文言だけを直す)に従う。

# 条件 確かめ方
1 時間切れの番号の行の文言が、巡の回数と、待ちを始めてから時間切れが決まるまでに実際にかかった秒数の両方を出す(例: timeout after 60 rounds (73s elapsed) waiting for the entrypoint to complete)。60s で止まったと読める形(timeout (60s) ...)を出さない 時計(time.monotonic・time.sleep)を差し替えたテストで文言を確かめる
2 数え方(1 秒休む巡の回数、既定の上限 60)と打ち切りの条件を変えない test_rounds_do_not_exceed_the_limit が変えずに通る
3 経過の秒数は単調な時計で測り、整数の秒で出す 1 のテスト
4 終了した・見つからないの文言、見出しの行(Container startup failed: ...)、例外の型と持つ値(ready・failures)、引数と戻り値を変えない。StartupFailure に項目を足すときは既定値を持たせる 既存の tests/utils/test_wait_for_containers.py が通る
5 確定仕様 docs/specifications/post-start.md の文言の表と「制限は巡の回数で数える」の説明を新しい文言に合わせる 文書の差分
6 CHANGELOG.md の [Unreleased] に書く 差分

進行

モード: —

  • 要求と受け入れ条件
  • 作業場所の用意 — 2026-10-14 09:42
  • 設計
  • 素材の収集と出典の確定
  • ドキュメント再構成
  • ドキュメントレビュー
  • 計画 — 2026-10-14 09:42
  • 実装 — 2026-10-14 10:09
  • 構造改善 — 2026-10-14 10:18
  • 実装レビュー — 2026-10-14 10:36
  • 完了判定 — 2026-10-14 10:13
  • Pull Request — 2026-10-14 10:15
  • 確定仕様化 — 2026-10-14 12:38
  • 後片付け
  • 配布 — 2026-10-14 13:52
  • 体裁レビュー
  • リリース後テスト — 2026-10-14 13:53
  • 振り返り — 2026-10-14 13:58
  • 棚卸し — 2026-10-15 13:18

振り返り: #488 (comment)

Activity

  1. takemi-ohama commented on Oct 12, 2026

    @takemi-ohama
    ContributorAuthor

    2026-10-13 の棚卸しで利用者が決めた: 数え方(1 秒休む巡の回数)は変えず、時間切れの文言だけを直す。文言は巡の回数と実際に待った時間を出す形にし、60s で止まったと読めないようにする。確定仕様 docs/specifications/post-start.md の記述も合わせる。判断待ちを解いた。

  2. takemi-ohama commented on Oct 12, 2026

    @takemi-ohama
    ContributorAuthor

    2026-10-13 の棚卸し(スプリント m8c の後)で、利用者の判断により 05 から 04 へ前倒しした。04 に残る #463(Size 8)と合わせて Size の和 11 / 容量 13 で次のスプリントに入れる。

  3. added a commit that references this issue on Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions