-
Notifications
You must be signed in to change notification settings - Fork 103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix the inotify event handling in ReloadingYamlFileDisplayConfig::auto_reload() #3636
Conversation
So here's what I understand you're doing:
Is my understanding correct? |
We interpret the data we read as a series of events which we loop over. The old code embodied a misconception that only a single event would be read. We never looked at the second or subsequent event in a series. That meant when writing a file (and getting an We don't want to try reading a file when it is created, because it may not have been written. |
src/miral/static_display_config.cpp
Outdated
{ | ||
static size_t const sizeof_inotify_event = sizeof(inotify_event); | ||
|
||
// A union ensures buffer is aligned for inotify_event |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This could instead be
alignas(inotify_event) char buffer[sizeof(inotify_event) + NAME_MAX + 1];
right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm, done to one of the copies of this logic, but not to the one directly below here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could be marking the inotify fd O_NONBLOCK
and read
ing until we hit EAGAIN
, but that'd just by a tiny optimisation.
Once the second union is replaced by alignas
, this looks good to go.
(It also might be nice to deduplicate this logic into a helper, but there's only two copies at this point...)
src/miral/static_display_config.cpp
Outdated
{ | ||
static size_t const sizeof_inotify_event = sizeof(inotify_event); | ||
|
||
// A union ensures buffer is aligned for inotify_event |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm, done to one of the copies of this logic, but not to the one directly below here?
Agreed: #3645 In fact there ARE three copies - the original is in Frame (and has the same bug) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Once the second union is replaced by alignas, this looks good to go.
# rc1 * New upstream release 2.19.0 - ABI summary: . miral ABI unchanged at 7 . mircommon ABI unchanged at 10 . mircore ABI unchanged at 2 . miroil ABI unchanged at 5 . mirplatform ABI bumped to 30 . mirserver ABI bumped to 61 . mirwayland ABI unchanged at 5 . mirplatformgraphics ABI unchanged at 22 . mirinputplatform ABI unchanged at 9 - Enhancements: . [x11-kiosk] defer fullscreening of applications until they are placed once (#3670) . [x11-kiosk] Ensure windows are placed and repainted on X11 "CONFIGURE" (#3619) . [x11-kiosk] change enable-x11 default to true . Initial atomic-kms platform . [Wayland] Add support for xdg_activation_v1 (#3639) . Do not default window size (especially to weird values) (#3623) . DesktopFileManager::resolve_app_id no longer returns an app id with a .desktop file suffix (Fixes #3608) . [Configuration] Split options into global and per-module configuration (#3590) - Bugs fixed: . Ensure we always send an initial output enter (#3680) . Fix stuck-frame-after-mode-switch bug (#3673) . Fix rendering of resized XWayland applications with client side decorations (#3587) . Aspect ratios shouldn't contain zero (Fixes: #3663) . Use PkgConfig to find development headers (#3661) . Fix the inotify event handling in ReloadingYamlFileDisplayConfig::auto_reload() (#3636) . The `miral::ConfigFile` "Watcher" can be destroyed before the main loop (Fixes: #3612) . [xwayland] Don't allow clients to place X11 windows (#3622) . Surfaces track scale changes on outputs they appear on. (Fixes: #3552) . New attached windows need to be placed (#3676) ---- [Test Plan](https://canonical-mir.readthedocs-hosted.com/latest/how-to/how-to-test-mir-for-a-release/) ### Platforms || 24.04 | 24.10 | |-|-|-| | gbm-kms |@AlanGriffiths|@AlanGriffiths| | atomic-kms |@AlanGriffiths|@AlanGriffiths| | eglstream-kms |@tarek-y-ismail|| | eglstream-kms + gbm-kms hybrid |@tarek-y-ismail|| | x11 |@AlanGriffiths|@AlanGriffiths| | wayland |@AlanGriffiths|@AlanGriffiths| | virtual |@AlanGriffiths|@AlanGriffiths| ### Console Providers || 24.04 | 24.10 | |-|-|-| | vt |@AlanGriffiths|@AlanGriffiths| | logind |@AlanGriffiths|@AlanGriffiths| | minimal |@AlanGriffiths|| ### Window Manager Examples || 24.04 | 24.10 | |-|-|-| | --window-manager=floating |@AlanGriffiths|@AlanGriffiths| | --window-manager=tiling |@AlanGriffiths|| | -kiosk |@AlanGriffiths||
ReloadingYamlFileDisplayConfig::auto_reload() incorrectly triggered on
IN_CREATE
.The reason for that is that
IN_CREATE
andIN_CLOSE_WRITE
events can often be read as pairs and we were not handling multiple events correctly.Note:
This is a backport of the logic in ConfigFile's Watcher::handler(). Ideally, we'd unify the code. But that's awkward as Watcher currently only handles changes to a single file.
It would make sense to rework Watcher to have a single watch on the configuration directory and register multiple files with it.