[389-devel] Review of plugin code

Rich Megginson rmeggins at redhat.com
Mon Aug 10 14:28:31 UTC 2015


On 08/07/2015 05:54 PM, William Brown wrote:
>>> Say for example:
>>>
>>> begin
>>> add some object Y
>>> read Y
>>> commit
>>>
>>> Does read Y see the object within the transaction?
>> Yes.
>>
>>> Is there a way to make the
>>> search happen so that it occurs outside the transaction, IE it doesn't see
>>> Y?
>> Not a nested search operation.  A nested search operation will always
>> use the parent/context transaction.
>>
> Makes sense. Just wanted to clarify so that I understood how different apis etc
> will behave within a betxn context.
>
>
>>> Is there a piece of documentation (perhaps the plugin guide) that lists the
>>> order in which these operations are called?
>> Not sure, but in general it is:
>>
>> incoming operation from client
>> front end processing
>> preoperation
>> call backend
>> bepreoperation
>> start transaction
>> betxnpreoperation
>> do operation in the database
>> betxnpostoperation
>> end transaction
>> bepostoperation
>> return from backend
>> send result to client
>> postoperation
>>
> I found this list in the Redhat Directory Services Plugin Development guide, but
> thank you for it as well.
>
> So with the transaction, there is only one transaction that covers all betxn
> plugins?

Yes and no.  Yes, there is only one parent transaction corresponding to 
the initial database interaction from the original top level incoming 
client operation.  However, each plugin will create a nested transaction 
for its write.  For example, a top level modify operation will create a 
top level parent database transaction, and may cause the memberof plugin 
to trigger and write.  The nested memberof plugin operation will create 
a nested child transaction using the original top level transaction as 
the parent.

Note that all of these transactions are created/managed without any 
knowledge or participation of plugin code - the database code manages 
all of this for the plugins.

> And I also wouldn't need to do anything to start / end the transaction
> within a plugin either do I?

No.

>
>>>> The toughest part is the deadlock prevention.  At the start transaction,
>>>> it holds a DB lock.  And most plug-ins maintain its own mutex to protect
>>>> its resource.  It'd easily cause deadlock situation especially when
>>>> multiple plug-ins are enabled (which is common :). So, please be careful
>>>> not to acquire/free locks in the wrong order...
>>> Of course. This is always an issue in multi-threaded code and anything with
>>> locking. Stress tests are probably good to find these deadlocks, no?
>> Yes.  There is some code in dblayer.c that will stress the transaction
>> code by locking/unlocking many db pages concurrently with external
>> operations.
>> https://git.fedorahosted.org/cgit/389/ds.git/tree/ldap/servers/slapd/back-ldbm
>> /dblayer.c#n210
>> https://git.fedorahosted.org/cgit/389/ds.git/tree/ldap/servers/slapd/back-ldbm
>> /dblayer.c#n4131
> Are there some unit tests hooked up that call and test this?

No, not afaik.

>
>>> That answers some of my question. I guess the larger part of the question is
>>> how
>>> the plugin subsystem treats each pluginType differently and the value of
>>> having
>>> a plugin register to more than one pluginType. Are there some documents you
>>> can
>>> point me to about this?
>> I'm not sure if there are docs which answer your specific question. But
>> a plugin may want to perform tasks at different points in the
>> operation.  For example, DNA may want to generate a unique value in the
>> pretxn phase, then roll back that value in the posttxn phase if the
>> operation failed.  Replication wants to many tasks at many different
>> points in the operation.
> That makes sense.
>
> Again, I found some documents about this in the plugin developers guide, and
> I've re-read some other plugin code so I have a better grasp of this now.
>
>>> Additionally, with betxn, this seems quite black-or-white. It's either on a
>>> ds
>>> instance that has betxn support, so every update will be betxn capable, or
>>> it's
>>> not on such a system so you fall back to other methods. Is this correct?
>>> With
>>> new plugins is it even worth writing them without betxn support?
>> Correct.  It is not even worth writing a new plugin without betxn
>> support, if it does any update to the database that depends on other
>> updates to the database triggered by the incoming operation from the client.
>>
> Fantastic. Thanks for the clarification.
>
>
> For reference here is the plugin that this message references. It was a simple
> demo to just get my head into plugin writing from scratch. I'm happy to accept
> comments about it. I know that as a feature it's useless because
> nsDS5ReplicaType already covers the use case, but it's a nice simple exercise
> none the less.

Sure.  It is a complex area, so questions are expected and encouraged.

>
> Thanks for your time.
>
>
>
> --
> 389-devel mailing list
> 389-devel at lists.fedoraproject.org
> https://admin.fedoraproject.org/mailman/listinfo/389-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.fedoraproject.org/pipermail/389-devel/attachments/20150810/011fba4d/attachment.html>


More information about the 389-devel mailing list