背景
Issue #46(大規模ペイロード向けWebSocketベースのIPCストリーミング)の分割Issue。
AS IS(現状)
notify-debouncer-fullで500msデバウンス付きのファイル監視
vscode:fs_changeグローバルイベントとしてemit(fire-and-forget)
- バックプレッシャーなし
- 自動再起動機能なし
ThrottledDelayerによるウォッチ要求のバルク送信なし
関連コード
src-tauri/src/commands/file_watcher.rs — ファイルウォッチャーコマンド
src/vs/platform/files/common/watcher.ts — 本家のウォチャーアーキテクチャ(参考)
TO BE(目標状態)
- ウォッチ要求のバッチ送信(
ThrottledDelayerパターン)
- イベントのcoalesce(重複排除)強化
- 自動再起動(最大5回)
- オプション: correlated watcher(correlationIdによるイベントフィルタリング)
想定アプローチ
- Rust側のウォッチャーイベント処理の改善
- バックプレッシャーは本家も実装していないため、まずはバッチ最適化を優先
本家(Electron版)の実装
アーキテクチャ(3層構造)
- OSレベルウォッチャー — フォークした子プロセスで動作
- ウォッチャークライアント — Shared Process内でIPC接続管理
- FileService — レンダラーでイベント受信
バッチ処理
ThrottledDelayerでウォッチ要求を蓄積して一括送信
- 新規ウォッチ要求は既存のものと重複排除
イベント処理
coalesceEvents()で同一パスの重複イベントを統合
- correlated watcher(
correlationId付き)で特定のウォッチャーにのみイベント配信
再起動
AbstractWatcherClientで予期しない終了時に自動再起動(最大5回)
関連コード(本家)
src/vs/platform/files/common/watcher.ts — AbstractWatcherClient、イベントcoalesce
src/vs/platform/files/common/diskFileSystemProvider.ts — ウォッチルーティング
src/vs/platform/files/node/watcher/watcherClient.ts — 子プロセスIPC実装
バックプレッシャー
- 本家も明示的なバックプレッシャーなし(fire-and-forget)
- ただし専用プロセスで分離されているため、レンダラーへの影響が少ない
参考
背景
Issue #46(大規模ペイロード向けWebSocketベースのIPCストリーミング)の分割Issue。
AS IS(現状)
notify-debouncer-fullで500msデバウンス付きのファイル監視vscode:fs_changeグローバルイベントとしてemit(fire-and-forget)ThrottledDelayerによるウォッチ要求のバルク送信なし関連コード
src-tauri/src/commands/file_watcher.rs— ファイルウォッチャーコマンドsrc/vs/platform/files/common/watcher.ts— 本家のウォチャーアーキテクチャ(参考)TO BE(目標状態)
ThrottledDelayerパターン)想定アプローチ
本家(Electron版)の実装
アーキテクチャ(3層構造)
バッチ処理
ThrottledDelayerでウォッチ要求を蓄積して一括送信イベント処理
coalesceEvents()で同一パスの重複イベントを統合correlationId付き)で特定のウォッチャーにのみイベント配信再起動
AbstractWatcherClientで予期しない終了時に自動再起動(最大5回)関連コード(本家)
src/vs/platform/files/common/watcher.ts—AbstractWatcherClient、イベントcoalescesrc/vs/platform/files/common/diskFileSystemProvider.ts— ウォッチルーティングsrc/vs/platform/files/node/watcher/watcherClient.ts— 子プロセスIPC実装バックプレッシャー
参考