fossilの backoffice 処理についての説明
fossilの Hook書いたけど実行されない!って場合はここら辺を確認すると良いかもしれません。
概要
fossilでは backofficeと呼ばれる処理があって、一般的には daemon等で処理される通知や、定期実行されるメンテナンス処理が該当すると思えば良い感じ。
backoffice処理の内容
backofficeのドキュメントには以下の様に書いてあります。
- Sending email alerts and notifications
- Sending out daily digests of email notifications
- Future - Other background email handling chores
- Future - Automatic syncing of peer repositories
- Future - Repository maintenance and optimization
ただ、2.15.1時点の処理は backoffice.cを確認すると、Hook実行が追加されています。
- Alertの通知(上の1-2の処理)
- Hookの実行
backoffice処理の起動タイミング
backoffice処理が起動されるタイミングは、いくつかあります1。
- WebUIのrendering完了時の自動実行
- コマンドラインからの手動実行(cron等と連携)
- pollingによる レポジトリ更新時及び定間隔実行
特に設定をしていない場合は WebUIページ完了時の自動実行のみです。
backoffice処理の自動実行
この処理は fossilが WebUIを renderingする時に自動的に行われているので、特別な daemonの起動等は 意識する必要が無い様になってます。
自動実行の処理時間と間隔
backofficeの処理時間は60秒以内と定義されています。
とは言っても WebUIの表示毎にWebサーバを60秒止めるわけにはいかないので、通常この処理はサーバ上でバックグラウンドで起動されます。
このバックグラウンド処理が多重実行されないように 60秒のlease時間が設定されており、この間は同時に起動されない様になっています。
起動されないと書きましたが実際には 実行中のプロセスに加えて、更に 1プロセスまでは Queuingされて待ち状態になり、Lease時間経過後に 実行される事になります。
自動実行の停止
WebUIの rendering 時の自動実行は停止する事が可能です。
fossil settings backoffice-disable 1
1 じゃなくても true でも yes でも on でも 大丈夫です。
backoffice処理の手動実行
コマンドラインから明示的に起動が可能です。
fossil backoffice -R /repo/repository.fossil
これを crontabに仕込む事で 定期的に通知や Hook等の処理を実行するようにします。
leaseが衝突した場合でも Queuingしないで良い場合は --nodelay オプションを追加します。
fossil を pollerにする
cron等の外部スケジューラに頼らずに fossilを pollerにする事が可能です。
時間間隔等を設定しますが、backoffice処理の定期実行ではなく 変更検出のpolling です。
変更が無ければ(= repositoryファイルのmtimeが更新されていなければ) backofficeの処理は走りません。
また、Pollerによる backoffice処理は --nolease オプションがついた状態で実行されます2。
このため、「自動実行を停止した上でコマンドによる手動実行はしないようにする」か、「Hook側で多重実行を許す/防ぐ/短時間で完了するよう実装する」等が必要になるかと思います。
PollerになったFossilは以下の様に動作します。
- pollerは 指定されたポーリング間隔で Backofficeの実行が必要かどうかを確認する
- 「実行が必要」=「Repositoryのファイルが変更された」または「前回の実行から--min時間が経過した」
- 必要な場合は バックグラウンドで leaseを取らずに backofficeを実行する
pollerとして起動するには --poll ポーリング間隔秒数 を指定します。
fossil backoffice --poll 60 --min 3600 -R /repo/repository.fossil
まとめ
- fossilの 通知・Hookの処理は Backofficeで処理されている
- Backoffice処理は Webページレンダリング時に自動実行がデフォルト
- Webページレンダリングが定期的に行われない様な環境では cronと連携するか pollerを置く
- pollerを置く場合は backoffice-disable を有効にする