Class: BitClust::ReloadableRequestHandler
- Defined in:
- lib/bitclust/reloadable_request_handler.rb
Overview
bitclust server を再起動しなくても rake generate で再生成された DB を
読み直せるようにするラッパー(bitclust#275)。
MethodDatabase/FunctionDatabase はエントリを一度読むとメモリ上にメモ化 し続けるため、App#initialize で一度だけ生成した RequestHandler をずっと 使い回す従来の作りでは、DB をディスク上で再生成してもプロセスは古い内容 を返し続けてしまう。
新鮮さの判定は DB ディレクトリ直下の "properties" ファイルの mtime で行う。
rake generate は対象を rm_rf してから MethodDatabase#init(properties を
touch) → update という手順を踏むため、再生成のたびに properties は必ず
書き直される。#handle は毎リクエストその mtime を stat するだけなので
コストは無視できる。
再生成の途中(rm_rf 直後〜init 前)は properties が一時的に存在しない。 その間は新鮮さを判定できないので、古い RequestHandler をそのまま使い 続けてリクエストを失敗させない。次のリクエストで改めて判定する。
Instance Method Summary collapse
- #handle(req) ⇒ Object
-
#initialize(dbpath, capi, manager, request_handler_class) ⇒ ReloadableRequestHandler
constructor
A new instance of ReloadableRequestHandler.
Constructor Details
#initialize(dbpath, capi, manager, request_handler_class) ⇒ ReloadableRequestHandler
Returns a new instance of ReloadableRequestHandler.
31 32 33 34 35 36 37 38 |
# File 'lib/bitclust/reloadable_request_handler.rb', line 31 def initialize(dbpath, capi, manager, request_handler_class) @dbpath = dbpath @capi = capi @manager = manager @request_handler_class = request_handler_class @properties_mtime = properties_mtime @handler = build_handler end |
Instance Method Details
#handle(req) ⇒ Object
40 41 42 43 |
# File 'lib/bitclust/reloadable_request_handler.rb', line 40 def handle(req) reload_if_stale @handler.handle(req) end |