[ubuntu-mono] [Bug 455884] [NEW] beagle package should modify fs.inotify.max_user_watches in /etc/sysctl.conf

jimav james_avera at yahoo.com
Mon Oct 19 23:38:54 BST 2009

Public bug reported:

Binary package hint: beagle

The need for Beagle users to increase the kernel's inotify watch limit
has been discussed in many places.

However, it is not really reasonable to ask ordinary users to edit
/etc/sysctl.conf just because they use Beagle.  Especially because
currently Beagle just logs obscure ioctl errors when the limit is
exceeded and otherwise silently fails to index part of the file system.

 Some completely automatic solution is needed so that Beagle "just works".

Here are some ideas (all completely speculative on my part!) :

TEMP FIX #1:  Make the beagle package install scripts modify
/etc/sysctl.conf to set fs.inotify.max_user_watches to a huge value
"high enough for almost everybody" (256K?  512K?).  This is not a good
solution, but may be good enough.

I've read posts which say that kernel memory is only actually allocated
in proportion to the number of directories watched; if that is correct
then the max_user_watches limit has no useful purpose except to prevent
using up so much memory that the system can not operate efficiently --
in which case Beagle can not scale to work on such a system.

TEMP FIX #2: Instead of modifying /etc/sysctl.conf at install time, make
beagled (via a suid-root helper program) dynamically set the limit in
the running kernel.   This avoids hassles with the mods to
/etc/sysctl.conf being lost during a system upgrade.  Also the limit
could be set as a percentage of system ram, which would make choosing
the limit somewhat easier.

PERMANENT FIX #1: This is really a kernel design bug, because the kernel should not require locked memory proportional to the size of disk storage (which is apparently the case when Beagle is indexing "/").   This is a fundamental scalability problem.

Instead, the kernel could keep a MRU cache of 'hot' directory nodes,
with the complete watch list stored in user space, with a daemon process
managing everything.  Cached watch info in the kernel would include
entries for not-watched dirs (and perhaps whole sub-trees), so that
accesses to non-watched directories would not always "miss the cache"
and notify the daemon.    Inotify notifications would be routed through
the daemon when a "cache miss" occurred; the daemon would issue the
inotify event if appropriate, and adjust the kernel's cache as it deemed

PERM FIX #2: Change the inotify API so that the kernel is allowed to
notify applications about changes outside of the directories they have
requested; this would allow the kernel to "merge" watch-list entries
when the table became full, retaining only the nearest common ancestor
dir.  It would then be up to each application, such as Beagle, to filter
out notifications it was not really interested in.   This would make the
max_user_watches limit be just a performance-tuning parameter, not a
functional limit.

This might not be possible if directories can be opened by means other than a path-search, because in such cases there would be no way to know if a dir was under a sub-tree being watched.
However if dirs are always first read into ram via path, e.g. as part of opendir, then two bits per in-memory inode would be enough storage (in addition to the watched-dir table). These 'watch state' bits ("this inode only", "this and all descendents", or "not watched") would be enough to propagate inclusive watches when relative paths were used to open subdirectories.

ProblemType: Bug
Architecture: amd64
Date: Mon Oct 19 14:25:09 2009
DistroRelease: Ubuntu 9.10
ExecutablePath: /usr/lib/beagle/BeagleDaemon.exe
InterpreterPath: /usr/bin/mono
Package: beagle 0.3.9-3ubuntu1
 PATH=(custom, user)
ProcVersionSignature: Ubuntu 2.6.31-12.41-generic
SourcePackage: beagle
Uname: Linux 2.6.31-12-generic x86_64
 (gnome-settings-daemon:1942): GLib-CRITICAL **: g_propagate_error: assertion `src != NULL' failed
 (gnome-settings-daemon:1942): GLib-CRITICAL **: g_propagate_error: assertion `src != NULL' failed
 (polkit-gnome-authentication-agent-1:2015): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed
 (nautilus:1977): Eel-CRITICAL **: eel_preferences_get_boolean: assertion `preferences_is_initialized ()' failed

** Affects: beagle (Ubuntu)
     Importance: Undecided
         Status: New

** Tags: amd64 apport-bug

beagle package should modify fs.inotify.max_user_watches in /etc/sysctl.conf
You received this bug notification because you are a member of MOTU Mono
Team, which is subscribed to beagle in ubuntu.

More information about the Ubuntu-mono mailing list