Skip to content

poll: stop the tests from depending on second boundaries - #979

Merged
JohnTitor merged 2 commits into
notify-rs:mainfrom
daandemeyer:push-ttlpuxxxvpur
Aug 15, 2026
Merged

poll: stop the tests from depending on second boundaries#979
JohnTitor merged 2 commits into
notify-rs:mainfrom
daandemeyer:push-ttlpuxxxvpur

Conversation

@daandemeyer

Copy link
Copy Markdown
Contributor

PathData::mtime has whole-second resolution and is compared before the content hash, so the kind of event a change produces depends on whether it crossed a wall-clock second. Six poll tests asserted one of the two outcomes and failed about one run in ten under the load of the full suite.

Mutating a watched directory bumps its own write time, so create_file, create_dir, remove_file and rename_file can get an extra Modify(Metadata(WriteTime)) for the directory; accept it as optional. modify_file and create_write_overwrite leave an entry with both new contents and a new write time, reported as Data within a second and as Metadata(WriteTime) across one. Set that entry's write time an hour ahead before the baseline scan and the comparison always falls through to the hash. Restoring the old write time after the change is not enough: on macOS the scan can still stat the write time of the change.

poll-watcher-hashing.rs did restore it, but polled every 10ms, so a scan could land between the write and the restore. Poll it manually instead and skip the directory's own event. Trailing optional expectations also needed a harness fix, since is_empty counted a queue holding only optionals as non-empty and the waiter blocked until it timed out.

Sleeping a second before each mutation fails all six tests before this change and passes after.

daandemeyer and others added 2 commits August 11, 2026 10:57
PathData::mtime has whole-second resolution and is compared before the
content hash, so the kind of event a change produces depends on whether
it crossed a wall-clock second. Six poll tests asserted one of the two
outcomes and failed about one run in ten under the load of the full
suite.

Mutating a watched directory bumps its own write time, so create_file,
create_dir, remove_file and rename_file can get an extra
Modify(Metadata(WriteTime)) for the directory; accept it as optional.
modify_file and create_write_overwrite leave an entry with both new
contents and a new write time, reported as Data within a second and as
Metadata(WriteTime) across one. Set that entry's write time an hour
ahead before the baseline scan and the comparison always falls through
to the hash. Restoring the old write time after the change is not
enough: on macOS the scan can still stat the write time of the change.

poll-watcher-hashing.rs did restore it, but polled every 10ms, so a scan
could land between the write and the restore. Poll it manually instead
and skip the directory's own event. Trailing optional expectations also
needed a harness fix, since is_empty counted a queue holding only
optionals as non-empty and the waiter blocked until it timed out.

Sleeping a second before each mutation fails all six tests before this
change and passes after.

Signed-off-by: Daan De Meyer <daan@amutable.com>

@JohnTitor JohnTitor left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, thanks!

@JohnTitor
JohnTitor merged commit 4e7c08d into notify-rs:main Aug 15, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants