)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"41fc19ac7cf18e9fc7a909e88e3eee7474c651c6","unresolved":false,"context_lines":[{"line_number":10,"context_line":"multiattach volume retyping operations.  If saved features are not found"},{"line_number":11,"context_line":"because the volume was created with an earlier revision of this driver,"},{"line_number":12,"context_line":"an exception is raised which causes the driver-optimized retype to"},{"line_number":13,"context_line":"dropped in favor of volume migration.  In the migration, a new volume of"},{"line_number":14,"context_line":"correct type is created and this volume will have the proper features"},{"line_number":15,"context_line":"both disabled and stored as metadata.  No additional steps are required"},{"line_number":16,"context_line":"to migrate from earlier code revisions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fb8cfa7_dacaad6c","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":36},"updated":"2019-06-21 15:16:25.000000000","message":"I wonder if it would be worth adding a release note to point out this behavior, since an unassisted migration could be a much longer and more resource intensive operation.","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"}],"cinder/volume/drivers/rbd.py":[{"author":{"_account_id":7488,"name":"Jeffrey Zhang","email":"zhang.lei.fly@gmail.com","username":"Jeffrey4l"},"change_message_id":"b88ef430355875e20155660b20694ba5cbd932a0","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            self.rbd.RBD_FEATURE_JOURNALING,"},{"line_number":765,"context_line":"            self.rbd.RBD_FEATURE_FAST_DIFF,"},{"line_number":766,"context_line":"            self.rbd.RBD_FEATURE_OBJECT_MAP,"},{"line_number":767,"context_line":"            self.rbd.RBD_FEATURE_EXCLUSIVE_LOCK,"},{"line_number":768,"context_line":"        ]"},{"line_number":769,"context_line":"        vol_name \u003d utils.convert_str(volume.name)"},{"line_number":770,"context_line":"        image_features \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_7224afaf","line":767,"updated":"2019-05-29 08:27:50.000000000","message":"do we really need remove exclusive-lock here?\n\nfrom http://lists.ceph.com/pipermail/ceph-users-ceph.com/2015-September/004857.html , it says\n\n\u003e The naming of the \"exclusive-lock\" feature probably implies too much compared to what it actually does.  In reality, when you enable the \"exclusive-lock\" feature, only one RBD client is able to modify the image while the lock is held.  However, that won\u0027t stop other RBD clients from *requesting* that maintenance operations be performed on the image (e.g. snapshot, resize).\n\n\u003e Behind the scenes, librbd will detect that another client currently owns the lock and will proxy its request over to the current watch owner.  This ensures that we only have one client modifying the image while at the same time not crippling other use cases.  librbd also supports cooperative exclusive lock transfer, which is used in the case of qemu VM migrations where the image needs to be opened R/W by two clients at the same time.\n\nadd based on my test, we can attach the same rbd image , who has the exclusive-lock feature\n\n$ rbd -p volumes info volume-7a11183a-136e-4ecc-a7d4-8b27414dec2a\nrbd image \u0027volume-7a11183a-136e-4ecc-a7d4-8b27414dec2a\u0027:\n\tsize 1024 MB in 256 objects\n\torder 22 (4096 kB objects)\n\tblock_name_prefix: rbd_data.3807e35bfabb6\n\tformat: 2\n\tfeatures: layering, exclusive-lock, deep-flatten\n\tflags: \n\tcreate_timestamp: Wed May 29 07:15:46 2019\n\n$ rbd -p volumes status volume-7a11183a-136e-4ecc-a7d4-8b27414dec2a\nWatchers:\n\twatcher\u003d172.17.3.22:0/1095177498 client.229775 cookie\u003d94090534792704\n\twatcher\u003d172.17.3.22:0/1822156634 client.239476 cookie\u003d94540706885120","commit_id":"f3fae37b8600c6ac7a84e8c300e3a66b4f2dafc6"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"4fe5de017d6432a108a8bdc1444ad05a5bd3087c","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            self.rbd.RBD_FEATURE_JOURNALING,"},{"line_number":765,"context_line":"            self.rbd.RBD_FEATURE_FAST_DIFF,"},{"line_number":766,"context_line":"            self.rbd.RBD_FEATURE_OBJECT_MAP,"},{"line_number":767,"context_line":"            self.rbd.RBD_FEATURE_EXCLUSIVE_LOCK,"},{"line_number":768,"context_line":"        ]"},{"line_number":769,"context_line":"        vol_name \u003d utils.convert_str(volume.name)"},{"line_number":770,"context_line":"        image_features \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_169e7906","line":767,"in_reply_to":"bfb3d3c7_7224afaf","updated":"2019-05-29 19:56:19.000000000","message":"The purpose of multi-attach is exactly to have to multiple RBD clients modifying the image at once.  Allowing exclusive-lock can only cause problems with the multi-attach feature.\n\nSo, yes, it\u0027s correct that exclusive-lock is disabled.","commit_id":"f3fae37b8600c6ac7a84e8c300e3a66b4f2dafc6"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"41fc19ac7cf18e9fc7a909e88e3eee7474c651c6","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                msg \u003d _(\u0027Could not find saved image features.\u0027)"},{"line_number":799,"context_line":"                raise RBDDriverException(reason\u003dmsg)"},{"line_number":800,"context_line":"            for feature in multipath_feature_exclusions:"},{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_5a31dda1","line":801,"range":{"start_line":801,"start_character":34,"end_line":801,"end_character":35},"updated":"2019-06-21 15:16:25.000000000","message":"I don\u0027t think you actually want to be doing a bitwise check here.","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"04c6dca0ca5367a36722844f85760a023de6ada5","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                msg \u003d _(\u0027Could not find saved image features.\u0027)"},{"line_number":799,"context_line":"                raise RBDDriverException(reason\u003dmsg)"},{"line_number":800,"context_line":"            for feature in multipath_feature_exclusions:"},{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_8577fa3a","line":801,"range":{"start_line":801,"start_character":34,"end_line":801,"end_character":35},"in_reply_to":"9fb8cfa7_05ab0a89","updated":"2019-06-21 16:00:44.000000000","message":"Oh, I see. Nevermind, just ignore me. :)","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"bbcb27354bdfe614a44a383e03ba740c054715b0","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                msg \u003d _(\u0027Could not find saved image features.\u0027)"},{"line_number":799,"context_line":"                raise RBDDriverException(reason\u003dmsg)"},{"line_number":800,"context_line":"            for feature in multipath_feature_exclusions:"},{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_05ab0a89","line":801,"range":{"start_line":801,"start_character":34,"end_line":801,"end_character":35},"in_reply_to":"9fb8cfa7_5a31dda1","updated":"2019-06-21 15:58:55.000000000","message":"Quite intentional, did you have something else in mind?","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"fcf8bb44c06b37a41842b18ebc5729f2d093ea27","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                msg \u003d _(\u0027Could not find saved image features.\u0027)"},{"line_number":799,"context_line":"                raise RBDDriverException(reason\u003dmsg)"},{"line_number":800,"context_line":"            for feature in multipath_feature_exclusions:"},{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_05354a46","line":801,"range":{"start_line":801,"start_character":34,"end_line":801,"end_character":35},"in_reply_to":"9fb8cfa7_8577fa3a","updated":"2019-06-21 16:07:22.000000000","message":"No worries ;)  I cleaned up the outer parens here:\n\nhttps://review.opendev.org/#/c/666885","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"5d8a9fa8b545ce4bef97ff41896dae2c29c2acf4","unresolved":false,"context_lines":[{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    def _is_replicated_type(self, volume_type):"},{"line_number":807,"context_line":"        # We do a safe attribute get because volume_type could be None"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_eb9b09c6","line":804,"range":{"start_line":804,"start_character":8,"end_line":804,"end_character":42},"updated":"2019-06-24 20:11:54.000000000","message":"Why are you returning None? Would it be possible to have any information other then saved_features, or other features you should keep under saved_features?","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"44745295ce4f9ccf80dbb6a12524299b8443be9e","unresolved":false,"context_lines":[{"line_number":801,"context_line":"                if image_features \u0026 feature:"},{"line_number":802,"context_line":"                    image.update_features(feature, True)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"        return {\u0027provider_location\u0027: None}"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    def _is_replicated_type(self, volume_type):"},{"line_number":807,"context_line":"        # We do a safe attribute get because volume_type could be None"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_d80a8777","line":804,"range":{"start_line":804,"start_character":8,"end_line":804,"end_character":42},"in_reply_to":"9fb8cfa7_eb9b09c6","updated":"2019-06-25 17:38:26.000000000","message":"Thanks for the question.  I return None here because I want this field to return to it\u0027s default unused state when multiattach is no longer in use.  provider_location is a free-form field that we /can/ use to store whatever we choose, but it\u0027s limited in size with no structure or validation.  So I don\u0027t want encourage its use except where completely necessary.","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"41fc19ac7cf18e9fc7a909e88e3eee7474c651c6","unresolved":false,"context_lines":[{"line_number":839,"context_line":"                try:"},{"line_number":840,"context_line":"                    volume_update.update(self._enable_replication(volume))"},{"line_number":841,"context_line":"                except Exception:"},{"line_number":842,"context_line":"                    err_msg \u003d (_(\u0027Failed to enable image replication\u0027))"},{"line_number":843,"context_line":"                    raise exception.ReplicationError(reason\u003derr_msg,"},{"line_number":844,"context_line":"                                                     volume_id\u003dvolume.id)"},{"line_number":845,"context_line":"        elif had_replication:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_bae6d915","line":842,"range":{"start_line":842,"start_character":70,"end_line":842,"end_character":71},"updated":"2019-06-21 15:16:25.000000000","message":"nit: Outer () not really needed here.","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"41fc19ac7cf18e9fc7a909e88e3eee7474c651c6","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            try:"},{"line_number":847,"context_line":"                volume_update.update(self._disable_replication(volume))"},{"line_number":848,"context_line":"            except Exception:"},{"line_number":849,"context_line":"                err_msg \u003d (_(\u0027Failed to disable image replication\u0027))"},{"line_number":850,"context_line":"                raise exception.ReplicationError(reason\u003derr_msg,"},{"line_number":851,"context_line":"                                                 volume_id\u003dvolume.id)"},{"line_number":852,"context_line":"        elif self._is_replication_enabled:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_3abc29db","line":849,"range":{"start_line":849,"start_character":67,"end_line":849,"end_character":68},"updated":"2019-06-21 15:16:25.000000000","message":"Same.","commit_id":"91f8ef4d23a95f6e25259387f5f2c7430f4bf36b"}]}
