Fanotify und NFS



  • Hallo,
    Ich hab ein komisches Problem:
    Ich hab mir mit Fanotify einen Daemon geschrieben, der bei änderung einer Datei eine Datenbank updaten soll. Das funktioniert perfekt solange ich die Datei lokal ändere. Ändere ich die Datei aber über NFS werden weder Zugriff noch Änderung erkannt. Es scheint als würden die Zugriffe durch den NFS Daemon vollkommen ignoriert.
    Mein Fanotifycode lautet wiefolgt:

    void service()
    {
        char buf[4096];
        int fd;
        const struct fanotify_event_metadata *metadata;
        int len;
        char path[PATH_MAX];
        int path_len;
        if (-1 == (fd = fanotify_init(FAN_CLOEXEC | FAN_CLASS_NOTIF,
                O_RDONLY | O_LARGEFILE))) {
            perror("Cannot init");
            return;
        }
        if (-1 == (fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
    				FAN_CLOSE_WRITE| FAN_OPEN, FAN_NOFD, "/media/stripe"))) {
            perror("Cannot mark");
            close(fd);
            return;
        }
        while (-1 != (len = read(fd, (void *) &buf, sizeof (buf)))) {
            metadata = (struct fanotify_event_metadata *) buf;
            while (FAN_EVENT_OK(metadata, len)) {
                if (metadata->fd != FAN_NOFD) {
                    if (metadata->fd >= 0) {
                        if (metadata->mask & FAN_CLOSE_WRITE) {
                            printf("FAN_CLOSE_WRITE: ");
                        }
                        sprintf(path, "/proc/self/fd/%d", metadata->fd);
                        path_len = readlink(path, path, sizeof (path) - 1);
                        if (path_len > 0) {
    
                            path[path_len] = 0x00;
                            printf("File %s", path);
                            check_file(path);
                        }
                        close(metadata->fd);
                    }
                    printf("\n");
                }
                metadata = FAN_EVENT_NEXT(metadata, len);
            }
        }
        close(fd);
    }
    

    Um es zu verdeutlichen damit es nicht zu verwechlungen kommt:
    Mein Service läuft auf dem NFS Server nicht auf dem Client.

    MFG Thalhammer



  • PS: Was mir grade auffällt ist, das zugriffe durch den Sambaserver oder andere Services ganz normal geloggt werden.
    Kann es sein das der NFS Server irgendwie ne sonder Rolle spielt ?

    MFG Thalhammer



  • Also es liegt vermutlich daran, dass der NFS Server im Kernel ist und somit von Fanotify nicht erfasst wird.
    Jetzt gibt es zwei möglichkeiten:
    1. Fanotify dazu bewegen auch Kernelspaceanfragen zu erkennen (geht das überhaupt?).
    2. NFS in den Userspace bewegen

    1. Wird vermutlich nicht möglich sein, bleibt noch 2. .
    Weis jemand wie groß der Performanceunterschied zwischen Userspace und Kernelspace ist bei einer 2Gbit/s Netzwerkanbindung und einem (aktuellen) HW Raid0 als Datenspeicher ?



  • Keiner ne idee ?


Anmelden zum Antworten