リソース後始末の try/finally は core 処理だけでなく setup も覆う外側に置く
並行処理
信頼性
エラーハンドリング
知識
原則
非同期 worker などで確保したリソース(lock、一時状態、markAsFailed 等の終端処理)を、core 処理関数(例: processTask)の finally だけで解放すると、その手前の setup(例: buildUserSession = ユーザーセッション構築、認可、テナント解決)で例外が出たときに解放されずリークする。
setup 段階でも throw は起きる(ユーザーが非 ACTIVE 化・テナント削除・一時的な DB エラーなど、タスク作成〜処理開始の間の状態変化)。後始末は setup を含む外側の try の catch/finally で担保し、解放操作は冪等(例: deleteByTenantIdAndJobId を何度呼んでも安全)にする。
これは「処理主体がロック所有権を再確認する」話とは別軸で、finally スコープが処理本体だけを覆い setup を覆っていない構造的な穴。cleanup の対象範囲を『確保した瞬間から』にそろえる。