tdb_reopen

Andrew Tridgell tridge at au1.ibm.com
Thu Jun 15 05:08:24 GMT 2006


Jim,

(CCd to samba-technical, hope you don't mind)

 > The question both Herb and I are asking is: why does it it matter if the 
 > device no. or inode have changed?  Any thoughts on this?

It matters for two reasons.

1) because tdb_reopen() does not re-read the tdb header. When you
   initially open a tdb, the code reads the header to determine things
   like the hash size, byte order etc. That information is stored in
   the tdb_context structure, and it is vital that the information
   match the structure of the tdb on disk.

2) because it could indicate that some processes are still using the
   old tdb (even if it is unlinked) and some will be using the new
   one. The point of a tdb is that it is a persistent shared store
   between processes. If different processes use a different file then
   it loses the 'shared' property, which could easily lead to data
   corruption (think what would happen if this is the locking db)

I don't understand under what circumstances you'd want to continue
when the dev/inode has changed on a tdb_reopen(). You could get around
(1) by re-reading the header and validating it, but (2) is much
harder.

Also note that on some platforms we could avoid calling tdb_reopen()
at all. It's mostly needed for broken platforms that don't have a real
pread()/pwrite() system call. On those we simulate pread()/pwrite()
using lseek(), which doesn't work unless you re-open the file
descriptor after a fork(), as the silly posix fork() semantics leave
us with the seek pointer shared on file descriptors, which means we
would have a corruption race condition if we didn't close and re-open.

Cheers, Tridge


More information about the samba-technical mailing list