| Line 1: |
Line 1: |
| − | == Dump and restore of fsnotify events == | + | == Hardness in dumping and restoring of fsnotify == |
| | + | |
| | + | Fsnotify are implemented quite straightforth -- we can fetch watchees by their handled from procfs output: |
| | + | |
| | + | pos: 0 |
| | + | flags: 02000000 |
| | + | inotify wd:3 ino:9e7e sdev:800013 mask:800afce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:7e9e0000640d1b6d |
| | + | |
| | + | so that on dump we can remember a watchee file handler and open it back on restore retrieving path from file descriptor |
| | + | link provided by procfs. |
| | + | |
| | + | This all works just fine until watchees are represented as children of another watch descriptor. Consider one has a |
| | + | directory '''dir''' and two files under it '''a''' and '''b''': |
| | + | |
| | + | dir |
| | + | `- a |
| | + | `- b |
| | + | |
| | + | and a program sets up fsnotify mark on every file entry, i.e. on '''dir''' itself and both files. Then imagine |
| | + | a program open both '''a''' and '''b''' and then unlink them. This action generates notify events which a program |
| | + | may or may not read yet (thus events queue is not empty) but a user start dumping procedure. Because kernel has |
| | + | not yet any API to peek events from queue (note the ''peek'' here means to read events without removing them |
| | + | from the queue) we either should ignore the events or refuse to dump. |
| | + | |
| | + | Refusing dumping might be an option but due to current CRIU design it turns out that we might stuck in situation |
| | + | where any attempt to dump will force CRIU to generate events itself leading to endless cycle. This is mostly because |
| | + | of that named ''ghost'' files. The ''ghost'' files are the files which were removed by an application but its file |
| | + | descriptor is still alive. For such scenario we generate a hardlink to the deleted file at moment of dumping which |
| | + | of course generates notify events. |
| | + | |
| | + | Almost the same situation happens on restore procedure -- ''ghost'' files get unlinked which cause kernel to |
| | + | generate events. |
| | + | |
| | + | So until redesign of the dumping/restore procedure for fsnotify system we have to ignore nonempty notify queues |
| | + | on dump and live with the fact that we're generating own events on restore. |