Skip to content

server が再生成された DB を再起動なしで読み直すようにする#276

Merged
znz merged 1 commit into
rurema:masterfrom
znz:server-auto-reload
Jul 22, 2026
Merged

server が再生成された DB を再起動なしで読み直すようにする#276
znz merged 1 commit into
rurema:masterfrom
znz:server-auto-reload

Conversation

@znz

@znz znz commented Jul 22, 2026

Copy link
Copy Markdown
Member

概要

rake generate 後に bitclust server を再起動しなくても新しい内容が反映されるようにします(fix #275)。

  • 原因: App#initialize が起動時に一度だけ DB と RequestHandler を生成して持ち続け、DB はエントリをメモリにメモ化するため、ディスク上の再生成がプロセスから見えませんでした
  • ReloadableRequestHandler で RequestHandler をラップし、リクエストごとに DB の properties ファイルの mtime を stat して新鮮さを判定します(stat 1回なのでコストは無視できるため、フラグ不要のデフォルト動作にしています。server は開発・プレビュー用途のため)。変わっていたら MethodDatabase/FunctionDatabase とハンドラを作り直し、$bitclust_context_cache もクリアします。単一 DB / 複数バージョン(--capi 含む)・Rack / WEBrick の全形態で動作します
  • 再生成途中の手当ても入れています:
    • rm_rf 直後〜init 前(properties が無い間)は旧内容を提供し続け、リクエストを失敗させません(次のリクエストで再判定)
    • init 後〜update 完了前にリクエストが来て途中状態の DB を掴んでも、Database#transactioncommit 後に properties を touch(内容は変えず mtime のみ)するため、update 完了時に必ず mtime が変わり、次のリクエストで完成した DB に収束します

検証

  • テスト 6 件追加(Rack / WEBrick 両ハンドラでの再読込・複数バージョンの独立再読込・properties 欠落中の継続提供・--capi の FunctionDatabase 再読込・generate 途中にリクエスト→ update 完了後に収束)。17756 → 17762 tests / 0 failures・rbs validatesteep check エラーなし
  • 実サーバーでのスモーク: bitclust server 起動 → curl → DB を再生成(サーバー再起動なし)→ curl で新しい内容が返ることを確認
  • touch は mtime のみで内容を変えないため、generated-documents の日次 diff 等には影響しません

🤖 Generated with Claude Code

rake generate 後の修正→確認サイクルで、DB を再生成するたびに
bitclust server を再起動しないと新しい内容が反映されない問題を解消する
(fix rurema#275)。

App#initialize は MethodDatabase/FunctionDatabase と RequestHandler を
起動時に一度だけ生成し、Interface がそれを保持し続けていた。DB はエント
リを一度読むとメモリ上にメモ化するため、ディスク上で DB を再生成しても
プロセスは古い内容を返し続けていた。

ReloadableRequestHandler で RequestHandler をラップし、DB ディレクトリ
直下の properties ファイルの mtime を毎リクエスト stat して新鮮さを判定
する。mtime が変われば MethodDatabase/FunctionDatabase と RequestHandler
を作り直し、$bitclust_context_cache もクリアする。dbpath が String
(単一 DB)/Array(複数バージョン)のどちらでも、Rack/WEBrick どちらの
ハンドラでも同様に動作する。

再生成の途中への手当ても入れた:
- rm_rf 直後〜init 前は properties が存在しないため、新鮮さを判定できず
  古いハンドラを使い続ける(リクエストを失敗させず、次のリクエストで再判定)
- init 後〜update 完了前にリクエストが来ると init 時点の mtime で途中状態
  の DB を掴んでしまうため、Database#transaction が commit 後に properties
  の mtime を進める(内容は変えず touch のみ)。これにより update 完了時に
  必ず mtime が変わり、途中状態を読んだプロセスも次のリクエストで完成した
  DB に収束する

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@znz
znz merged commit 5ed9143 into rurema:master Jul 22, 2026
10 checks passed
@znz
znz deleted the server-auto-reload branch July 22, 2026 00:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

rake generate 後に bitclust server を再起動しなくて済むようにできないか

1 participant