知識マップ: FileSystemWatcher実務ガイド - 取りこぼしと重複対策
記事「FileSystemWatcher実務ガイド - 取りこぼしと重複対策」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、FileSystemWatcherのCreated/Changedイベントを完了通知として扱う誤りや、内部バッファのoverflowによる通知の取りこぼし、イベント列から状態を復元しようとする設計を避け、通知はすべて1種類の再スキャン要求に畳んでfull rescanで現物を確認する設計を提案する。完了は送信側がtemp->rename/done・manifestで明示し、受信側は再スキャンで見つけたready候補に対して原子的claimを取り、複数回見に行くことを前提にidempotencyで受け止める。常時起動できない、あるいは取りこぼしが許されない要件にはUSNチェンジジャーナルという選択肢もあると位置付けている。
flowchart LR
accTitle: FileSystemWatcher実務ガイドの知識マップ
accDescr: FileSystemWatcherの通知が完了通知ではなく変化の気配に過ぎないこと、通知を再スキャン要求へ畳んでfull rescanとclaimと組み合わせること、内部バッファのoverflowによる通知の取りこぼしとUSNチェンジジャーナルという代替の関係を示す図
filesystemwatcher["FileSystemWatcher"]
full_rescan["full rescan(ディレクトリの全体再走査)"]
buffer_overflow_event_loss["内部バッファのoverflowによる通知の取りこぼし"]
periodic_directory_listing["定期的なディレクトリ列挙"]
change_notification_loss["変更通知の取りこぼし"]
internal_buffer_size_tuning["InternalBufferSizeの調整"]
error_event_ignored_antipattern["Errorイベントをログだけ出して無視するアンチパターン"]
created_event_misinterpreted_as_complete["Createdを完了通知だと誤解する"]
partial_write_read["書き込み途中ファイルの読み込み事故"]
sender_side_completion_signaling["送信側での完了条件の明示"]
temp_then_rename_publish["temp -> close -> rename/replaceでの公開"]
done_manifest_file["done/manifestファイル"]
scan_request_coalescing["通知を再スキャン要求に畳む"]
changed_event_order_assumption["Changedの回数・順序を信じるアンチパターン"]
event_log_state_reconstruction_antipattern["イベント列から状態を復元しようとするアンチパターン"]
duplicate_processing["二重処理(二重計上・二重送信・更新の消失)"]
atomic_claim["原子的claim"]
bundle["bundle(連携単位のディレクトリ)"]
idempotent_processing["idempotency(冪等性)を前提にした処理"]
watcher_downtime_gap["watcher停止中の変更取りこぼし"]
usn_journal["USNジャーナル(変更ジャーナル)"]
ntfs["NTFS"]
admin_rights["管理者権限"]
filesystemwatcher -->|"原因になり得る"| buffer_overflow_event_loss
full_rescan -.->|"利用する"| periodic_directory_listing
full_rescan -->|"推奨される対応"| change_notification_loss
full_rescan -->|"推奨される対応"| buffer_overflow_event_loss
internal_buffer_size_tuning -->|"用いるのは非推奨"| buffer_overflow_event_loss
error_event_ignored_antipattern -.->|"原因になり得る"| change_notification_loss
filesystemwatcher -.->|"原因になり得る"| created_event_misinterpreted_as_complete
created_event_misinterpreted_as_complete -->|"原因になり得る"| partial_write_read
sender_side_completion_signaling -->|"推奨される対応"| created_event_misinterpreted_as_complete
sender_side_completion_signaling -->|"利用する"| temp_then_rename_publish
sender_side_completion_signaling -->|"利用する"| done_manifest_file
scan_request_coalescing -->|"推奨される対応"| changed_event_order_assumption
scan_request_coalescing -->|"推奨される対応"| event_log_state_reconstruction_antipattern
full_rescan -->|"推奨される対応"| event_log_state_reconstruction_antipattern
changed_event_order_assumption -->|"原因になり得る"| duplicate_processing
atomic_claim -->|"防止する"| duplicate_processing
bundle -->|"利用する"| atomic_claim
bundle -->|"利用する"| done_manifest_file
idempotent_processing -->|"推奨される対応"| duplicate_processing
full_rescan -->|"より先に行うべき"| atomic_claim
scan_request_coalescing -->|"より先に行うべき"| full_rescan
filesystemwatcher -->|"原因になり得る"| watcher_downtime_gap
full_rescan -->|"軽減する"| watcher_downtime_gap
usn_journal -->|"推奨される対応"| watcher_downtime_gap
usn_journal -->|"前提とする"| ntfs
usn_journal -.->|"前提とする"| admin_rights
概念間の関係(全26件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- FileSystemWatcherは内部バッファのoverflowによる通知の取りこぼしの原因になることがあります。
- full rescan(ディレクトリの全体再走査)は定期的なディレクトリ列挙を利用します。
- full rescan(ディレクトリの全体再走査)は変更通知の取りこぼしに対する本記事の推奨です。
- full rescan(ディレクトリの全体再走査)は内部バッファのoverflowによる通知の取りこぼしに対する本記事の推奨です。
- InternalBufferSizeの調整を内部バッファのoverflowによる通知の取りこぼしに用いることは推奨されません。
- Errorイベントをログだけ出して無視するアンチパターンは変更通知の取りこぼしの原因になることがあります。
- FileSystemWatcherはCreatedを完了通知だと誤解するの原因になることがあります。
- Createdを完了通知だと誤解するは書き込み途中ファイルの読み込み事故の原因になることがあります。
- 送信側での完了条件の明示はCreatedを完了通知だと誤解するに対する本記事の推奨です。
- 送信側での完了条件の明示はtemp -> close -> rename/replaceでの公開を利用します。
- 送信側での完了条件の明示はdone/manifestファイルを利用します。
- 通知を再スキャン要求に畳むはChangedの回数・順序を信じるアンチパターンに対する本記事の推奨です。
- 通知を再スキャン要求に畳むはイベント列から状態を復元しようとするアンチパターンに対する本記事の推奨です。
- full rescan(ディレクトリの全体再走査)はイベント列から状態を復元しようとするアンチパターンに対する本記事の推奨です。
- Changedの回数・順序を信じるアンチパターンは二重処理(二重計上・二重送信・更新の消失)の原因になることがあります。
- 原子的claimは二重処理(二重計上・二重送信・更新の消失)を防ぎます。
- bundle(連携単位のディレクトリ)は原子的claimを利用します。
- bundle(連携単位のディレクトリ)はdone/manifestファイルを利用します。
- idempotency(冪等性)を前提にした処理は二重処理(二重計上・二重送信・更新の消失)に対する本記事の推奨です。
- full rescan(ディレクトリの全体再走査)は原子的claimより先に行うべきです。
- 通知を再スキャン要求に畳むはfull rescan(ディレクトリの全体再走査)より先に行うべきです。
- FileSystemWatcherはwatcher停止中の変更取りこぼしの原因になることがあります。
- full rescan(ディレクトリの全体再走査)はwatcher停止中の変更取りこぼしを軽減します。
- USNジャーナル(変更ジャーナル)はwatcher停止中の変更取りこぼしに対する本記事の推奨です。
- USNジャーナル(変更ジャーナル)はNTFSを前提とします。
- USNジャーナル(変更ジャーナル)は管理者権限を前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。