Nikhil
2009-Jul-20 16:44 UTC
[Samba] Difference in Samba and CIFS interms of keeping the deleted files opened
Hi, We have a CIFS server running on a NetApp server and a Solaris host running Samba-3.3.2. When we mount both the filesystems to a Drive on a Windows using the net use command and then try to run a java program which basically does nothing but continuosly writes a data chunk to a file. On a side note, these same filesystems are accessible on a Solaris (unix) host too. When the java program is run and a file is being generated, I go to my unix terminal and happen to delete the file generated by the java program. Interestingly, there is an IOexception caught in the java program running on the Windows machine, when the file is deleted on the CIFS based filesystem (available on Solaris as a NFS filesystems) but there is no exception caught when the filesystem happens to be Samba (available on Solaris as /var , a regular partition). I delete the file from Unix as the process demands, but also there is no way to delete a in-use-file in Windows. I would like to understand the differences in Samba and CIFS in this context especially why is that so there is an IOexception for a CIFS based filesystem but not on the samba filesystem. This is reproducible at will. What could be wrong? What could be made to make samba filesystem also behave the same way to throw exceptions (Exceptions are good than that not at all knowing there is a file that is deleted but being still written onto.) I would be willing to work and share the procedure to reproduce this behaviour with anyone aware of the Samba/CIFS protocols. -- Nikhil
Jeremy Allison
2009-Jul-20 18:42 UTC
[Samba] Difference in Samba and CIFS interms of keeping the deleted files opened
On Mon, Jul 20, 2009 at 10:14:49PM +0530, Nikhil wrote:> Hi, > > We have a CIFS server running on a NetApp server and a Solaris host running > Samba-3.3.2. > > When we mount both the filesystems to a Drive on a Windows using the net use > command and then try to run a java program which basically does nothing but > continuosly writes a data chunk to a file. On a side note, these same > filesystems are accessible on a Solaris (unix) host too. > > When the java program is run and a file is being generated, I go to my unix > terminal and happen to delete the file generated by the java program. > Interestingly, there is an IOexception caught in the java program running on > the Windows machine, when the file is deleted on the CIFS based filesystem > (available on Solaris as a NFS filesystems) but there is no exception caught > when the filesystem happens to be Samba (available on Solaris as /var , a > regular partition). > > I delete the file from Unix as the process demands, but also there is no way > to delete a in-use-file in Windows. > > I would like to understand the differences in Samba and CIFS in this context > especially why is that so there is an IOexception for a CIFS based > filesystem but not on the samba filesystem. This is reproducible at will. > What could be wrong? What could be made to make samba filesystem also behave > the same way to throw exceptions (Exceptions are good than that not at all > knowing there is a file that is deleted but being still written onto.)Ok, I think the reason that you're having this problem is that you're running Samba on Solaris in this case, sad to say. I don't believe Sun have exposed kernel level oplock (lease) capability to user space processes, so Samba on Solaris has no way of knowing that a unix user deleted the file. Samba running on Linux, (or SGI Irix) has kernel level oplocks, so can detect access from the local filesystem. As the NetApp runs a custom kernel (derived a long time ago from FreeBSD I believe) then their CIFS implementation (like Samba on Linux) knows when a NFS user has modified the file. Jeremy.
Nikhil
2009-Jul-21 11:53 UTC
[Samba] Difference in Samba and CIFS interms of keeping the deleted files opened
On Tue, Jul 21, 2009 at 5:06 PM, Gerald Carter <jerry at plainjoe.org> wrote:> Nikhil, > > > I looked at the enabling kernel oplocks in the samba configuration file > and > > I have enabled "kernel oplocks = yes" in the [global] section on both of > > Linux-2.6.18-92 and Linux-2.4.21-47.0.1.ELsmp kernel machines running the > > samba and I notice that the behaviour is not as what is said. I still do > not > > see the exception being NOT caught on Windows java program when I delete > the > > file from a Unix terminal. > > > > Any idea, where I could be going wrong? > > It sounds more like smbd maintains the opens file descriptor > as long as the client has an open file handle. Standard > POSIX semantics allow you to delete open files with the inode > finally being released after the last open fd is closed. > I could speculate that it may be less to do with CIFS and more > to do with the server OS. But that is pure speculation. > > Have you looked at a network trace to see which SMB op caused > the IO Exception? Does truncating rather than removing the > file change the application behavior? > > > > > cheers, jerry > -- > ====================================================================> http://www.plainjoe.org/ > "What man is a man who does not make the world better?" --Balian > >Hi Jeremy, Yeah.. I tried oplocking thing (btw, is there any set-direct-go howto on oplocking configuration parameters to be used smb.conf?) and checked via the smbstatus that the file is being into the samba lock. But when I rm the file from the Unix terminal, the windows program does not detect the file deletion.>> it may be less to do with CIFS and more to do with the server OS. Butthat is pure speculation. agreed. I am running Solaris-10 where kernel oplock is not available, so will rule that out. I have linux box with 2.6 kernel and kernel oplocks=yes set in smb.conf; but that still does not help in getting the sync set.>> Does truncating rather than removing the file change the applicationbehavior? Interesting. I do "/bin/cp -f /dev/null /var/tmp/test.log" and I notice that ls -l does not show that the file is truncated at all.... even though I do it multiple times; ls -l still does not show that the file is truncated. Am I missing something that why is rm command or deleting the file behaviour would differ? BTW, this is the output of testparam -s -v | grep -i lock output: Load smb config files from /var/samba/smb.conf Processing section "[homes]" Processing section "[printers]" Processing section "[tmpdir]" Loaded services file OK. Server role: ROLE_STANDALONE kernel oplocks = Yes lock spin time = 200 oplock break wait time = 0 lock directory = /var/samba/locks usershare path = /var/samba/locks/usershares block size = 1024 veto oplock files blocking locks = Yes fake oplocks = No locking = Yes oplocks = Yes level2 oplocks = Yes oplock contention limit = 2 posix locking = Yes strict locking = Yes Can you please let me know if any of the parameters need something else/need not put? Thanks again, Jeremy. -- Nikhil
Possibly Parallel Threads
- Differences in Samba and CIFS in terms of keeping the deleted files open?
- Eclipse (Java) locking issues after upgrade (3.6.23 -> 4.4.3)
- FW: Weird Samba/CIFS behavior: client hangs
- alfresco with GFS2.0.0
- [LLVMdev] Using JIT to construct an invocation of a non-JIT function, or how do I interface to GCC exception handling