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
[email protected]
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to