From: Martin P. <ZR...@ch...> - 2017-09-17 14:41:15
Attachments:
hellopid.c
|
Hello, I'm writing a multi-threaded Fuse application and I'm interested about the process ids of those processes accessing the Fuse file system. I'm wondering if I can use the information provided by the fuse_get_context() call reliably to retrieve the process ids. I extended the hello.c example program a little bit to show the process ids and also to block the read call for a while to see what happens if I call fuse_get_context() during the within the call backs (hellopid.c): The loop within the read call back I added just to see what happens with the information provided by the fuse_get_context() call when call backs are executed in parallel. The following is my environment: RHEL 7.4 kernel: 3.10.0-693.el7.x86_64 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7 fuse-2.9.2-8.el7.x86_64 fuse-libs-2.9.2-8.el7.x86_64 fuse-devel-2.9.2-8.el7.x86_64 For the test the file system is mounted on "/tmp/pid" and I first ran cat /tmp/pid/hello and a short time later: tail /tmp/pid/hello I first started the Fuse file system single threaded: [root@visp C]# ./hellopid -s -f /tmp/pid exe(getattr): /usr/bin/cat exe(open): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(read,4708): /usr/bin/cat exe(getattr): /usr/bin/tail exe(getattr): /usr/bin/cat exe(open): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(read,4708): /usr/bin/tail exe(getattr): /usr/bin/umount For the read calls first the thread id of the the Fuse thread is shown (4708) and thereafter the path of the calling application (the name is looked up the path in the /proc file system by the thread is that is provided). As shown here first the read call for the cat command is processed and thereafter the read call for the tail command. If I now start the Fuse file system using multiple threads I can see the following: [root@visp C]# ./hellopid -f /tmp/pid exe(getattr): /usr/bin/cat exe(open): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(getattr): /usr/bin/tail exe(open): /usr/bin/tail exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(getattr): /usr/bin/cat exe(getattr): /usr/bin/tail exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(read,4750): /usr/bin/cat exe(getattr): /usr/bin/umount Here is looks like for the tail command the thread id from the first cat command is provided. Perhaps I cannot rely on the fuse_get_context() call in this case. Is there another way to retrieve the process id more reliably? Thanks! Regards Martin Petermann Phone: 41-44 724 86 95 E-mail: MA...@zu... Saeumerstrasse 4 Rueschlikon, 8803 Switzerland |
From: Michael T. <pig...@gm...> - 2017-09-17 16:12:11
|
Hi Martin, I wouldn't be surprised if your reads from a single file but from separate processes are serialized, unless they purposely read from unrelated offsets (i.e. not sequentially from beginning-of-file to end-of-file). I'm not sure what to expect for process id if readahead kicks in. I would test reading multiple files from multiple programs to verify concurrent requests. Regards, Michael Theall On Sun, Sep 17, 2017 at 8:49 AM, Martin Petermann <ZR...@ch...> wrote: > Hello, > > I'm writing a multi-threaded Fuse application and I'm interested about the > process ids of those processes accessing the Fuse file system. I'm > wondering if I can use the information provided by the fuse_get_context() > call reliably to retrieve the process ids. > > I extended the hello.c example program a little bit to show the process > ids and also to block the read call for a while to see what happens if I > call fuse_get_context() during the within the call backs (hellopid.c): > > > > The loop within the read call back I added just to see what happens with > the information provided by the fuse_get_context() call when call backs > are executed in parallel. > > The following is my environment: > > RHEL 7.4 > kernel: 3.10.0-693.el7.x86_64 > gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) > GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7 > fuse-2.9.2-8.el7.x86_64 > fuse-libs-2.9.2-8.el7.x86_64 > fuse-devel-2.9.2-8.el7.x86_64 > > For the test the file system is mounted on "/tmp/pid" and I first ran > > cat /tmp/pid/hello > > and a short time later: > > tail /tmp/pid/hello > > I first started the Fuse file system single threaded: > > [root@visp C]# ./hellopid -s -f /tmp/pid > exe(getattr): /usr/bin/cat > exe(open): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(read,4708): /usr/bin/cat > exe(getattr): /usr/bin/tail > exe(getattr): /usr/bin/cat > exe(open): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(read,4708): /usr/bin/tail > exe(getattr): /usr/bin/umount > > For the read calls first the thread id of the the Fuse thread is shown > (4708) and thereafter the path of the calling application (the name is > looked up the path in the /proc file system by the thread is that is > provided). As shown here first the read call for the cat command is > processed and thereafter the read call for the tail command. > > If I now start the Fuse file system using multiple threads I can see the > following: > > [root@visp C]# ./hellopid -f /tmp/pid > exe(getattr): /usr/bin/cat > exe(open): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(getattr): /usr/bin/tail > exe(open): /usr/bin/tail > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(getattr): /usr/bin/cat > exe(getattr): /usr/bin/tail > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(read,4750): /usr/bin/cat > exe(getattr): /usr/bin/umount > > Here is looks like for the tail command the thread id from the first cat > command is provided. Perhaps I cannot rely on the fuse_get_context() call > in this case. Is there another way to retrieve the process id more > reliably? > > Thanks! > > > Regards > > Martin Petermann > > > Phone: 41-44 724 86 95 > E-mail: MA...@zu... > > > Saeumerstrasse 4 > Rueschlikon, 8803 > Switzerland > > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > -- > fuse-devel mailing list > To unsubscribe or subscribe, visit https://lists.sourceforge.net/lists/listinfo/fuse-devel > |