[PATCH] TDB traverse lock changes for massive AD DC perf improvement

Andrew Bartlett abartlet at samba.org
Wed Apr 5 18:56:16 UTC 2017


On Wed, 2017-04-05 at 15:40 +0200, Stefan Metzmacher via samba-
technical wrote:
> Hi Andrew,
> 
> > > > Please review.  If reviewed, I'll push with a patch that adds
> > > > new
> > > > performance tests that I'm keen to get in. 
> > > 
> > > I'm wondering about all the readonly checks in
> > > _tdb_transaction_prepare_commit(),
> > > we already handle that in _tdb_transaction_start().
> > > 
> > > I'm a bit nervous about the solaris10 problem.
> > 
> > I am to.  I only got game to formally propose it when Jeremy
> > essentially proclaimed it dead :-)
> 
> I discussed this with Volker and we think we have an understanding
> of what the solaris problem might be.
> 
> The pattern with the traverse_read and prepare_commit interaction is
> the following:
> 
> 1. transaction_start got the allrecord lock with F_RDLCK.
> 
> 2. the traverse_read code walks the database in a sequence like this
> (per chain):
>    2.1  chainlock(chainX, F_RDLCK)
>    2.2  recordlock(chainX.record1, F_RDLCK)
>    2.3  chainunlock(chainX, F_RDLCK)
>    2.4  callback(chainX.record1)
>    2.5  chainlock(chainX, F_RDLCK)
>    2.6  recordunlock(chainX.record1, F_RDLCK)
>    2.7  recordlock(chainX.record2, F_RDLCK)
>    2.8  chainunlock(chainX, F_RDLCK)
>    2.9  callback(chainX.record2)
>    2.10 chainlock(chainX, F_RDLCK)
>    2.11 recordunlock(chainX.record2, F_RDLCK)
>    2.12 chainunlock(chainX, F_RDLCK)
>    2.13 goto next chain
> 
>    So it has always one record locked in F_RDLCK mode and tries to
>    get the 2nd one before it releases the first one.
> 
> 3. prepare_commit tries to upgrade the allrecord lock to F_RWLCK
>    If that happens at the time of 2.4, the operation of
>    2.5 may deadlock with the allrecord lock upgrade.
>    On Linux step 2.5 works in order to make some progress with the
>    locking, but on solaris it might fail because the kernel
>    wants to satisfy the 1st lock requester before the 2nd one.
> 
> I think the first step is a standalone test that does this:
> 
> process1: F_RDLCK for ofs=0 len=2
> process2: F_RDLCK for ofs=0 len=1
> process1: upgrade ofs=0 len=2 to F_RWLCK (in blocking mode)
> process2: F_RDLCK for ofs=1 len=1
> process2: unlock ofs=0 len=2
> process1: should continue at that point
> 
> Once we have such a test we can run it on several solaris, freebsd,
> linux or whatever.
> 
> Then we can decide if we want a configure and/or runtime check for
> this.
> And only avoid the transaction F_RDLCK lock in traverse_read if the
> kernel
> behaves as expected.
> 
> Can you write such a standalone test?

I'll give it a shot today.  Can I do it in python?

Thanks!

Andrew Bartlett
-- 
Andrew Bartlett                       http://samba.org/~abartlet/
Authentication Developer, Samba Team  http://samba.org
Samba Developer, Catalyst IT          http://catalyst.net.nz/services/samba




More information about the samba-technical mailing list