[Xapian-devel] multiple writers and remotetcp backends

Richard Boulton richard at lemurconsulting.com
Tue May 1 09:27:31 BST 2007


Mark Hammond wrote:
> It seems there are 2 general solutions we can implement:
> 
> * Only ever allow a single connection to the writable server.  When a second
> connection is attempted, we either refuse the connection, or allow the
> connection just to send back an authorative 'writer already connected'
> response, and then close the connection.
> 
> * Implement a kind of 'queue' or some other way to block the incoming
> connection.  In this case we would accept the connection, respond with a
> message indicating they are in a queue (your call is important!) and then
> block until the first writer is complete.  The client side of the connection
> then has a choice regarding waiting in the queue, or hanging up and trying
> again later.
 >
> In my opinion, the second option sounds the "best", but the first option
> seems "good enough" and easier to implement.

I agree. If we implement the first solution, I imagine that many clients 
will need to emulate the behaviour of the second solution by repeatedly 
opening a connection to poll for the lock.  While the first option is 
slightly simpler to implement, I think that the majority of the 
implementation work is likely to be in enforcing the single-writer 
constraint.  I recommend attempting to implement the first solution 
first anyway, since the second solution requires everything that it 
does: once we've got reliable checking of the locks on the connection, 
we can implement a queue on top of that.

One thing which both of these will probably need is a change to the 
remote protocol to allow a connection to specify whether it is writable 
or readonly at the time the connection is opened.  This would allow the 
lock on the database to be checked and obtained at this point for 
writable database, rather than waiting for the connection to attempt a 
write operation.

In theory, Xapian itself is meant to prevent there being two instances 
of a Writable database for the same path in existence concurrently: 
however, the tcpserver avoids the check for this by opening the database 
in its server process, and then passing it through a fork to the 
sub-processes.  I don't think there's any way we can check for this 
state in the core Xapian library, so the tcpserver itself needs to 
enforce the single-writer constraint.

I'm not sure what happens for the windows variant of the server (which 
is a threaded implementation), but I imagine that there the same 
instance of the database is accessed by each connection: if this is 
correct, there are likely to be other problems since the database is not 
safe for concurrent access.  A threaded implementation needs to create a 
new instance of the database for each thread.

 > I'm sure there are both other
> options and opinions on this topic, so I'm soliciting all feedback on this,
> with the intention of opening a xapian bug to track the status, and
> ultimately end up with a patch.

Opening a bug sooner than later would probably be advisable, so that the 
history of this discussion is easy to find in future.

In particular, discussion of this bug may make it clear whether it 
should block the 1.0.0 release, and if so we

-- 
Richard



More information about the Xapian-devel mailing list