IDEA-94524 (tolerate short-living directories)
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 15 Nov 2012 12:32:53 +0000 (13:32 +0100)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 15 Nov 2012 12:33:17 +0000 (13:33 +0100)
bin/linux/fsnotifier
bin/linux/fsnotifier64
native/fsNotifier/linux/inotify.c

index 9e8153a3cd24bc90a99f7a2c19ce0a42ea734948..3918875ad48e361c23c3e457f1cb493c78b74de1 100755 (executable)
Binary files a/bin/linux/fsnotifier and b/bin/linux/fsnotifier differ
index 3afd9f704de9b62623c2d7a1ba2ccf307cc77659..3ec94a535f0a98e329761bfd1b8d0f7154b363dc 100755 (executable)
Binary files a/bin/linux/fsnotifier64 and b/bin/linux/fsnotifier64 differ
index bfb117d513478a74e5e08d0980978b07b7cf2207..75a97abc13397cf5162f92c58747c65b5cee1f15 100644 (file)
@@ -122,11 +122,19 @@ inline bool watch_limit_reached() {
 static int add_watch(const char* path, watch_node* parent) {
   int wd = inotify_add_watch(inotify_fd, path, EVENT_MASK);
   if (wd < 0) {
-    if (errno == ENOSPC) {
+    if (errno == EACCES || errno == ENOENT) {
+      userlog(LOG_DEBUG, "inotify_add_watch(%s): %s", path, strerror(errno));
+      return ERR_IGNORE;
+    }
+    else if (errno == ENOSPC) {
+      userlog(LOG_WARNING, "inotify_add_watch(%s): %s", path, strerror(errno));
       limit_reached = true;
+      return ERR_CONTINUE;
+    }
+    else {
+      userlog(LOG_ERR, "inotify_add_watch(%s): %s", path, strerror(errno));
+      return ERR_ABORT;
     }
-    userlog(LOG_ERR, "inotify_add_watch(%s): %s", path, strerror(errno));
-    return ERR_CONTINUE;
   }
   else {
     userlog(LOG_DEBUG, "watching %s: %d", path, wd);
@@ -228,7 +236,7 @@ static int walk_tree(const char* path, watch_node* parent, bool recursive, array
   DIR* dir = NULL;
   if (recursive) {
     if ((dir = opendir(path)) == NULL) {
-      if (errno == EACCES || errno == ENOENT) {
+      if (errno == EACCES || errno == ENOENT || errno == ENOTDIR) {
         userlog(LOG_DEBUG, "opendir(%s): %d", path, errno);
         return ERR_IGNORE;
       }
@@ -321,8 +329,7 @@ static bool process_inotify_event(struct inotify_event* event) {
   }
 
   bool is_dir = (event->mask & IN_ISDIR) == IN_ISDIR;
-  userlog(LOG_DEBUG, "inotify: wd=%d mask=%d dir=%d name=%s",
-      event->wd, event->mask & (~IN_ISDIR), is_dir, node->name);
+  userlog(LOG_DEBUG, "inotify: wd=%d mask=%d dir=%d name=%s", event->wd, event->mask & (~IN_ISDIR), is_dir, node->name);
 
   char path[PATH_MAX];
   strcpy(path, node->name);
@@ -335,7 +342,7 @@ static bool process_inotify_event(struct inotify_event* event) {
 
   if (is_dir && ((event->mask & IN_CREATE) == IN_CREATE || (event->mask & IN_MOVED_TO) == IN_MOVED_TO)) {
     int result = walk_tree(path, node, true, NULL);
-    if (result < 0 && result != ERR_IGNORE) {
+    if (result < 0 && result != ERR_IGNORE && result != ERR_CONTINUE) {
       return false;
     }
   }