Re: [openstack-dev] [Cinder] Question about synchronized decoration usage in cinder-volume
Thanks for your detailed explanation. > > 2. Specific to cinder.volume.manager.VolumeManager:attach_volume, all > operations in "do_attach" method are database related. As said in [1], > operations to the database will block the main thread of a service, so another > question I want to know is why this method is needed to be synchronized? > Currently db operations block the main thread of the service, but hopefully > this > will change in the future. There may be another reason here which is mentioned by DuncanT in IRC a few days ago. Cinder-backup will also call some methods (at least the "attach_volume) of manager, and since cinder-backup is a standalone process, "external=True" should be used here. -- zhangleiqiang (Trump) Best Regards > -Original Message- > From: Vishvananda Ishaya [mailto:vishvana...@gmail.com] > Sent: Wednesday, May 07, 2014 12:35 AM > To: OpenStack Development Mailing List (not for usage questions) > Subject: Re: [openstack-dev] [Cinder] Question about synchronized decoration > usage in cinder-volume > > > On Apr 26, 2014, at 2:56 AM, Zhangleiqiang (Trump) > wrote: > > > Hi, all: > > > > I find almost all of the @utils.synchronized decoration usage in > cinder-volume (cinder.volume.manager / cinder.volume.drivers.*) with an > "external=True" param. Such as > cinder.volume.manager.VolumeManager:attach_volume: > > > > def attach_volume(self, context, volume_id, instance_uuid, > host_name, > > mountpoint, mode): > >"""Updates db to show volume is attached.""" > >@utils.synchronized(volume_id, external=True) > >def do_attach(): > > > > However, in docstring of common.lockutils.synchronized, I find param > "external" is used for multi-workers scenario: > > > > :param external: The external keyword argument denotes whether > this lock > > should work across multiple processes. This means that if two > different > > workers both run a a method decorated with > @synchronized('mylock', > > external=True), only one of them will execute at a time. > > > > I have two questions about it. > > 1. As far as I know, cinder-api has supported multi-worker mode and > cinder-volume doesn't support it, does it? So I wonder why the "external=True" > param is used here? > > Before the multibackend support in cinder-volume it was common to run more > than one cinder-volume for different backends on the same host. This would > require external=True > > 2. Specific to cinder.volume.manager.VolumeManager:attach_volume, all > operations in "do_attach" method are database related. As said in [1], > operations to the database will block the main thread of a service, so another > question I want to know is why this method is needed to be synchronized? > Currently db operations block the main thread of the service, but hopefully > this > will change in the future. > > Vish > > > > > Thanks. > > > > [1] > http://docs.openstack.org/developer/cinder/devref/threading.html#mysql-acc > ess-and-eventlet > > -- > > zhangleiqiang (Trump) > > > > Best Regards > > > > > > > > ___ > > OpenStack-dev mailing list > > OpenStack-dev@lists.openstack.org > > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev ___ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
Re: [openstack-dev] [Cinder] Question about synchronized decoration usage in cinder-volume
On Apr 26, 2014, at 2:56 AM, Zhangleiqiang (Trump) wrote: > Hi, all: > > I find almost all of the @utils.synchronized decoration usage in > cinder-volume (cinder.volume.manager / cinder.volume.drivers.*) with an > "external=True" param. Such as > cinder.volume.manager.VolumeManager:attach_volume: > > def attach_volume(self, context, volume_id, instance_uuid, > host_name, > mountpoint, mode): >"""Updates db to show volume is attached.""" >@utils.synchronized(volume_id, external=True) >def do_attach(): > > However, in docstring of common.lockutils.synchronized, I find param > "external" is used for multi-workers scenario: > > :param external: The external keyword argument denotes whether > this lock > should work across multiple processes. This means that if two different > workers both run a a method decorated with @synchronized('mylock', > external=True), only one of them will execute at a time. > > I have two questions about it. > 1. As far as I know, cinder-api has supported multi-worker mode and > cinder-volume doesn't support it, does it? So I wonder why the > "external=True" param is used here? Before the multibackend support in cinder-volume it was common to run more than one cinder-volume for different backends on the same host. This would require external=True > 2. Specific to cinder.volume.manager.VolumeManager:attach_volume, all > operations in "do_attach" method are database related. As said in [1], > operations to the database will block the main thread of a service, so > another question I want to know is why this method is needed to be > synchronized? Currently db operations block the main thread of the service, but hopefully this will change in the future. Vish > > Thanks. > > [1] > http://docs.openstack.org/developer/cinder/devref/threading.html#mysql-access-and-eventlet > -- > zhangleiqiang (Trump) > > Best Regards > > > > ___ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev signature.asc Description: Message signed with OpenPGP using GPGMail ___ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
[openstack-dev] [Cinder] Question about synchronized decoration usage in cinder-volume
Hi, all: I find almost all of the @utils.synchronized decoration usage in cinder-volume (cinder.volume.manager / cinder.volume.drivers.*) with an "external=True" param. Such as cinder.volume.manager.VolumeManager:attach_volume: def attach_volume(self, context, volume_id, instance_uuid, host_name, mountpoint, mode): """Updates db to show volume is attached.""" @utils.synchronized(volume_id, external=True) def do_attach(): However, in docstring of common.lockutils.synchronized, I find param "external" is used for multi-workers scenario: :param external: The external keyword argument denotes whether this lock should work across multiple processes. This means that if two different workers both run a a method decorated with @synchronized('mylock', external=True), only one of them will execute at a time. I have two questions about it. 1. As far as I know, cinder-api has supported multi-worker mode and cinder-volume doesn't support it, does it? So I wonder why the "external=True" param is used here? 2. Specific to cinder.volume.manager.VolumeManager:attach_volume, all operations in "do_attach" method are database related. As said in [1], operations to the database will block the main thread of a service, so another question I want to know is why this method is needed to be synchronized? Thanks. [1] http://docs.openstack.org/developer/cinder/devref/threading.html#mysql-access-and-eventlet -- zhangleiqiang (Trump) Best Regards ___ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev