Sebastian Rasmussen
2015-Jan-22 10:50 UTC
[Samba] How to do nonblocking writes to CIFS networkshares?
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.