Database left unlocked by Tcl bindings
Olly Betts
olly at survex.com
Thu Feb 25 02:24:51 GMT 2016
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...
> > 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.
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
> > More recent Xapian versions will try to use the new OFD locks and avoid
> > the need to fork() and execl(), so will presumably avoid whatever is
> > going on here. But the OFD locks were added in Linux 3.15, so your
> > kernel isn't quite new enough.
>
> Yes, I saw that, and it is good, but my chances of moving up soon are
> not good. And I would like to get to the bottom of this anyway.
Indeed - I was noting it more as something to be aware of when testing
newer versions.
Cheers,
Olly
Cheers,
Olly
More information about the Xapian-discuss
mailing list