How to do nonblocking writes to CIFS networkshares?
Sebastian Rasmussen
sebastian.rasmussen at axis.com
Wed Jan 21 07:50:36 MST 2015
Hi!
I'm new to this mailing list, so please help out if I'm adressing the
wrong forum. :)
I'm working on an application accessing a mounted networkshare. Under
normal circumstances there is no problem accessing reading and writing
to the networkshare using POSIX open(2)/read(2)/write(2) etc. However if
there is intermittent connectivity problems to the networkshare my
application experiences calls blocking for long periods of time when
accessing the missing networkshare. I have e.g. observed write(2) calls
being blocked for up to 5 minutes.
Worth noting is that my samba 4.1.13-based networkshare is running on a
Linux 3.14.15 server and is mounted from a Linux-3.14 client system like so:
mount -t cifs -o nounix,noserverino,nobrl //192.168.0.42/myshare
/tmp/mountpoint
In order not to block in these POSIX calls I attempted to open(2) the
file for writing using O_NONBLOCK and then use select(2) to try to
determine if the file descriptor was writable before attemping to call
write(2). The idea being that if the fd claims not to be writable the
application then has a chance to both wait in the select(2) call for a
reasonable time and also try to timeout and let the application fail
gracefully, should it detect that it cannot write to the fd. I assume
that any previously successful writes may not have been transferred to
the networkshare, but instead have been cached in the page cache to be
transferred if the networkshare responds again (within the ~5 minut
timeout).
My attempt resulted in the application being able to write lots of data
to the share while it was unavailable, and the timeout in select(2) was
never triggered. This was a surprise to me as I expected the fd to
indicate that it was blocking at some point and that the timeout would
be triggered.
Now, I need some advice: Have I glossed over something fundamental about
how CIFS networkshares work? Is it possible to write applications that
will not block indefinitely (5 minuts would be considered indefinitely
in my application)? If yes, then what alternatives exists to O_NONBLOCK
to do this?
/ Sebastian
PS. I contemplated fusesmb but it doesn't look like it handles
O_NONBLOCK or similar either, so I think that is not viable.
More information about the samba-technical
mailing list