On 13/08/2026 19:22, Iván Ezequiel Rodriguez wrote:
Replace the O(N) scan of watched names on each directory inotify event
with a Hash_table keyed by (parent_wd, basename), addressing the
long-standing FIXME in tail_forever_inotify.

Keep ownership consistent with wd_to_name: parent_by_name is created
only for Follow_name and returned to the caller, so fallback paths can
return without local hash cleanup.

Matching cost for N directory events that each compare against N names
(illustrative host timings of the scan vs hash lookup alone):

   N=1000:  ~0.018s -> ~0.000s
   N=5000:  ~0.39s  -> ~0.000s
   N=10000: ~1.5s   -> ~0.000s

End-to-end recreate storms remain largely file-system bound on this
host; the hash removes the quadratic name-matching CPU from that path.

+/* Hash Follow_name watches by parent directory wd + basename so directory
+   inotify events can be matched in expected O(1) instead of scanning all
+   files.  */
+static size_t
+parent_name_hasher (const void *entry, size_t tabsize)
+{
+  const struct File_spec *spec = entry;
+  char const *name = spec->name + spec->basename_start;

+  size_t value = spec->parent_wd;
+  for (unsigned char c; (c = *name); name++)
+    value = value * 31 + c;
+  return value % tabsize;

As discussed recently, we could use hash_string() for that.

In general the patch looks sensible.
I'll give it a full review tomorrow hopefully.

thanks,
Padraig



Reply via email to