[openstack-dev] [Neutron ML2] Potential DB lock when developing new mechanism driver

Kevin Benton blak111 at gmail.com
Wed Jun 25 21:05:50 UTC 2014


I'm not sure what you mean about it being 'truly committed' even though the
transaction has ended. When would it be committed? There are not more calls
to sqlalchemy after that. The only way it wouldn't be committed is if
another transaction was started before calling create_port.

Regardless, a db lock wait exception does not indicate anything about the
state of a particular transaction. Transactions do not lock tables on their
own. A lock has to be explicitly set with a "with_lockmode('update')" on a
query.

I think you will probably need to share some sample code with the mailing
list demonstrating what you are trying to do.

--
Kevin Benton


On Wed, Jun 25, 2014 at 3:21 AM, Li Ma <skywalker.nick at gmail.com> wrote:

> Hi Kevin,
>
> Thanks for your reply. Actually, it is not that straightforward.
> Even if postcommit is outside the 'with' statement, the transaction is not
> 'truly' committed immediately. Because when I put my db code (reading and
> writing ml2-related tables) in postcommit, db lock wait exception is still
> thrown.
>
> Li Ma
>
> ----- Original Message -----
> From: "Kevin Benton" <blak111 at gmail.com>
> To: "OpenStack Development Mailing List (not for usage questions)" <
> openstack-dev at lists.openstack.org>
> Sent: 星期三, 2014年 6 月 25日 下午 4:59:26
> Subject: Re: [openstack-dev] [Neutron ML2] Potential DB lock when
> developing new mechanism driver
>
>
>
> The post_commit methods occur outside of the transactions. You should be
> able to perform the necessary database calls there.
>
>
> If you look at the code snippet in the email you provided, you can see
> that the 'try' block surrounding the postcommit method is at the same
> indentation-level as the 'with' statement for the transaction so it will be
> closed at that point.
>
>
> Cheers,
> Kevin Benton
>
>
> --
> Kevin Benton
>
>
>
> On Tue, Jun 24, 2014 at 8:33 PM, Li Ma < skywalker.nick at gmail.com > wrote:
>
>
> Hi all,
>
> I'm developing a new mechanism driver. I'd like to access ml2-related
> tables in create_port_precommit and create_port_postcommit. However I find
> it hard to do that because the two functions are both inside an existed
> database transaction defined in create_port function of ml2/plugin.py.
>
> The related code is as follows:
>
> def create_port(self, context, port):
> ...
> session = context.session
> with session.begin(subtransactions=True):
> ...
> self.mechanism_manager.create_port_precommit(mech_context)
> try:
> self.mechanism_manager.create_port_postcommit(mech_context)
> ...
> ...
> return result
>
> As a result, I need to carefully deal with the database nested transaction
> issue to prevent from db lock when I develop my own mechanism driver. Right
> now, I'm trying to get the idea behind the scene. Is it possible to
> refactor it in order to make precommit and postcommit out of the db
> transaction? I think it is perfect for those who develop mechanism driver
> and do not know well about the functioning context of the whole ML2 plugin.
>
> Thanks,
> Li Ma
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
>
>
> --
>
> Kevin Benton
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>



-- 
Kevin Benton
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20140625/88859113/attachment.html>


More information about the OpenStack-dev mailing list