Database left unlocked by Tcl bindings

Eric J eric at deptj.eu
Thu Feb 25 16:21:17 GMT 2016


On Thu, 25 Feb 2016 02:24:51 +0000, Olly Betts <olly at survex.com> wrote:
> On Wed, Feb 24, 2016 at 04:30:55PM +0100, Eric J wrote:
>> On Wed, 24 Feb 2016 03:17:35 +0000, Olly Betts <olly at survex.com> wrote:
>>>On Mon, Feb 22, 2016 at 12:26:27PM +0100, Eric wrote:
>>>> % package require xapian 1.0.0
>>>> 1.2.18
>>> 
>>> I've tested with 1.2.18 and can't reproduce this with that version
>>> either (is that also the version of xapian-core you're running?  The
>>> 1.2.18 above is the bindings version I think).
> 
> You didn't answer this...

Sorry, core is 1.2.18 as well.

>>> What FS are you running this on?
>> 
>> ext4
> 
> Pretty standard then, and what I tested with.
> 
>>> Is use of Tcl actually a factor here, or can you reproduce it with
>>> just C++ code?
>>> 
>>> E.g. using the "simpleindex" example from the xapian-core sources:
>>> 
>>> examples/simpleindex tmp.db &
>>> examples/simpleindex tmp.db
>> 
>>   lfs at bruno [ /usr/src/sources-deptj/xapian-core-1.2.18 ]$ examples/simpleindex tmp.db &
>>   [1] 26157
>>   lfs at bruno [ /usr/src/sources-deptj/xapian-core-1.2.18 ]$ examples/simpleindex tmp.db
>>   DatabaseLockError: Unable to get write lock on tmp.db: already locked
>>   
>>   [1]+  Stopped                 examples/simpleindex tmp.db
>> 
>> so it is presumably not anything to do with the FS or the OS. I am
>> hoping that the right Tcl person (whoever that is) may pick something up
>> in an strace.
> 
> 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.

> Could you try this C++ version:
> 
> #include <xapian.h>
> int main() {
>     Xapian::WritableDatabase db("tmp.db", Xapian::DB_CREATE_OR_OPEN);
>     Xapian::WritableDatabase db2("tmp.db", Xapian::DB_CREATE_OR_OPEN);
> }
> 
> Compile with:
> 
> g++ -O2 `xapian-config --cxxflags --libs` doubleopen.cc
> 
> And then run:
> 
> ./a.out
> 
> If locking is working, this should fail (and does for me) like so:
> 
> terminate called after throwing an instance of 'Xapian::DatabaseLockError'
> Aborted

Got exactly that.

Finally, it appears that it does work with Tcl 8.5 (actually a tclkit,
but does not work with an 8.6 tclkit).

Thanx,

Eric
-- 
ms fnd in a lbry



More information about the Xapian-discuss mailing list