Database left unlocked by Tcl bindings

Eric J eric at deptj.eu
Sat Feb 27 18:39:11 GMT 2016


On Thu, 25 Feb 2016 23:37:52 +0000, Olly Betts <olly at survex.com> wrote:
> On Thu, Feb 25, 2016 at 05:21:17PM +0100, Eric J wrote:
> > On Thu, 25 Feb 2016 02:24:51 +0000, Olly Betts <olly at survex.com> wrote:
> > > It's clearly not as simple as execl() always releasing the lock, but I
> > > don't think we've ruled out the OS entirely yet - the above isn't
> > > exactly equivalent to the Tcl code, as the two databases are created by
> > > the same process in Tcl but different processes with simpleindex.
> > 
> > but the same problem happens from two different Tcl processes - both
> > succeed because there is no lock.
> 
> Ah, OK - I missed that detail.
> 
> > Finally, it appears that it does work with Tcl 8.5 (actually a tclkit,
> > but does not work with an 8.6 tclkit).
> 
> I'm testing with Tcl 8.6 (Debian package 8.6.4+dfsg-3), and it works for
> me.
> 
> So it does seem it must be due to something your Tcl interpreter is
> doing, but I'm struggling to think what that could be.
> 
> If O_CLOEXEC was set on the lock fd when execl() was called, the fd
> would get closed and the lock released.  But your lsof shows the fd open
> but not locked in the child process after it has exec-ed cat.
> 
> If there were a second fd open on the lock file which gets closed
> in the child process after the lock is taken, that would release the
> lock.  But we carefully close all other open fds before taking the
> lock to avoid that.

I have tried Tcl 8.6.4 now, and it too has the problem. However with the
very new Tcl 8.6.5rc2 it works! I still intend to try to find out what
the problem was, but I can use the 8.5 tclkit for what I was doing when
this all started, and then move to 8.6.5 when it becomes a real release.

Thanx very much,

Eric
-- 
ms fnd in a lbry



More information about the Xapian-discuss mailing list