)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow triggering cleanup from API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now that we support having multiple c-vol services using the same"},{"line_number":10,"context_line":"storage backend under one cluster, they no longer clean all resources"},{"line_number":11,"context_line":"from that backend on start, only those from their own host.  So we need"},{"line_number":12,"context_line":"a way to trigger the cleanup of resources that were being processed by"},{"line_number":13,"context_line":"another c-vol service that failed in the same cluster."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"1a6eadb0_4846f44f","line":11,"range":{"start_line":10,"start_character":35,"end_line":11,"end_character":26},"updated":"2016-12-21 15:43:41.000000000","message":"That\u0027s probably longest commit message I\u0027ve ever reviewed, but can you also include a very brief explanation that we\u0027re talking about resource status cleanup? I would expect people to misunderstand that this is some kind of volume data cleanup, or anything.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow triggering cleanup from API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now that we support having multiple c-vol services using the same"},{"line_number":10,"context_line":"storage backend under one cluster, they no longer clean all resources"},{"line_number":11,"context_line":"from that backend on start, only those from their own host.  So we need"},{"line_number":12,"context_line":"a way to trigger the cleanup of resources that were being processed by"},{"line_number":13,"context_line":"another c-vol service that failed in the same cluster."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"fa48f94a_7b46d3c0","line":11,"range":{"start_line":10,"start_character":35,"end_line":11,"end_character":26},"in_reply_to":"1a6eadb0_4846f44f","updated":"2016-12-21 19:56:40.000000000","message":"I\u0027ll rephrase this sentence to try to prevent that misunderstanding.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"}],"cinder/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"3.18"},{"line_number":211,"context_line":"----"},{"line_number":212,"context_line":"  New API endpoint /workers/cleanup allows triggering cleanup for cinder-volume"},{"line_number":213,"context_line":"   services."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"  The cleanup will be performed by other services belonging to the same"},{"line_number":216,"context_line":"  cluster, so at least one of them must be up to be able to do the cleanup."}],"source_content_type":"text/x-rst","patch_set":36,"id":"1a6eadb0_08715c76","line":213,"range":{"start_line":212,"start_character":0,"end_line":213,"end_character":12},"updated":"2016-12-21 15:43:41.000000000","message":"Same here, maybe call it \"resource status cleanup\"? Or \"failed operation cleanup\"? Just something to give people notion of what you\u0027re writing about here.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"3.18"},{"line_number":211,"context_line":"----"},{"line_number":212,"context_line":"  New API endpoint /workers/cleanup allows triggering cleanup for cinder-volume"},{"line_number":213,"context_line":"   services."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"  The cleanup will be performed by other services belonging to the same"},{"line_number":216,"context_line":"  cluster, so at least one of them must be up to be able to do the cleanup."}],"source_content_type":"text/x-rst","patch_set":36,"id":"fa48f94a_5b202ff8","line":213,"range":{"start_line":212,"start_character":0,"end_line":213,"end_character":12},"in_reply_to":"1a6eadb0_08715c76","updated":"2016-12-21 19:56:40.000000000","message":"Here it\u0027s even more important, because this is not for developers.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"}],"cinder/objects/service.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        return cls._get_minimum_version(\u0027object_current_version\u0027, context,"},{"line_number":192,"context_line":"                                        binary)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @property"},{"line_number":195,"context_line":"    def is_up(self):"},{"line_number":196,"context_line":"        \"\"\"Check whether a service is up based on last heartbeat.\"\"\""},{"line_number":197,"context_line":"        return (self.updated_at and"},{"line_number":198,"context_line":"                self.updated_at \u003e\u003d utils.service_expired_time(True))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_e827c00f","line":198,"range":{"start_line":194,"start_character":0,"end_line":198,"end_character":68},"updated":"2016-12-21 15:43:41.000000000","message":"Can you explain this change? It\u0027s not obvious to me why it\u0027s needed and if it won\u0027t break something else, as this property is widely used in the code.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        return cls._get_minimum_version(\u0027object_current_version\u0027, context,"},{"line_number":192,"context_line":"                                        binary)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @property"},{"line_number":195,"context_line":"    def is_up(self):"},{"line_number":196,"context_line":"        \"\"\"Check whether a service is up based on last heartbeat.\"\"\""},{"line_number":197,"context_line":"        return (self.updated_at and"},{"line_number":198,"context_line":"                self.updated_at \u003e\u003d utils.service_expired_time(True))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa48f94a_c69fe2b2","line":198,"range":{"start_line":194,"start_character":0,"end_line":198,"end_character":68},"in_reply_to":"1a6eadb0_e827c00f","updated":"2016-12-21 19:56:40.000000000","message":"Sure, this is one of the problems of having really old patches...\n\nIf you look at patch 6 [1] you can see I had this code already here back in October, but then more than a month later we merged this patch [2] but during the review we didn\u0027t notice/remember that we no longer need to check for the created_at field since July/Newton [3].\n\nSo the rebase to account for [2] took care of that little mistake.\n\nI have moved to another patch [4] of which this one is dependent, I just didn\u0027t do it earlier because I didn\u0027t notice at the time of the rebase (I do too many of those).\n\n[1] https://review.openstack.org/#/c/363010/6/cinder/objects/service.py\n[2] https://review.openstack.org/#/c/389726/\n[3] https://review.openstack.org/#/c/318572/22/cinder/db/sqlalchemy/models.py@73\n[4] https://review.openstack.org/413758","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"}],"cinder/scheduler/manager.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return min_version \u003c self.rpc_api_version"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def _cleanup_destination(self, clusters, service):"},{"line_number":390,"context_line":"        \"\"\"Determines the RPC method, detination service and name."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        The name is only used for logging, and it is the topic queue."},{"line_number":393,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_43b97714","line":390,"range":{"start_line":390,"start_character":38,"end_line":390,"end_character":48},"updated":"2016-12-21 15:43:41.000000000","message":"destination","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        return min_version \u003c self.rpc_api_version"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def _cleanup_destination(self, clusters, service):"},{"line_number":390,"context_line":"        \"\"\"Determines the RPC method, detination service and name."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        The name is only used for logging, and it is the topic queue."},{"line_number":393,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"da4df55a_d198846d","line":390,"range":{"start_line":390,"start_character":38,"end_line":390,"end_character":48},"in_reply_to":"1a6eadb0_43b97714","updated":"2016-12-21 19:56:40.000000000","message":"Done","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"43dfe112104623f27881e8710e15560de20f2fbb","unresolved":false,"context_lines":[{"line_number":422,"context_line":"        Here we retrieve from the DB which services we want to clean up based"},{"line_number":423,"context_line":"        on the request from the user."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        Then the send individual cleanup requests to each of the services that"},{"line_number":426,"context_line":"        are up, and we finally return a tuple with services that we have sent"},{"line_number":427,"context_line":"        a cleanup request and those that were not up and we couldn\u0027t send it."},{"line_number":428,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_c6ca1e4f","line":425,"updated":"2016-12-20 21:56:32.000000000","message":"\"Then the send...\" -\u003e \"Then send...\"","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":422,"context_line":"        Here we retrieve from the DB which services we want to clean up based"},{"line_number":423,"context_line":"        on the request from the user."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        Then the send individual cleanup requests to each of the services that"},{"line_number":426,"context_line":"        are up, and we finally return a tuple with services that we have sent"},{"line_number":427,"context_line":"        a cleanup request and those that were not up and we couldn\u0027t send it."},{"line_number":428,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"da4df55a_b1ba20bf","line":425,"in_reply_to":"1a6eadb0_c6ca1e4f","updated":"2016-12-21 19:56:40.000000000","message":"Done","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"2a1bb1c148ed6b1564914a704db7d3155468e34b","unresolved":false,"context_lines":[{"line_number":422,"context_line":"        Here we retrieve from the DB which services we want to clean up based"},{"line_number":423,"context_line":"        on the request from the user."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        Then the send individual cleanup requests to each of the services that"},{"line_number":426,"context_line":"        are up, and we finally return a tuple with services that we have sent"},{"line_number":427,"context_line":"        a cleanup request and those that were not up and we couldn\u0027t send it."},{"line_number":428,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_65b3ed9a","line":425,"in_reply_to":"1a6eadb0_c6ca1e4f","updated":"2016-12-21 09:20:09.000000000","message":"Will update if I submit another patch.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":474,"context_line":"                not_requested.append(service)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        LOG.info(_LI(\u0027Cleanup requests completed.\u0027))"},{"line_number":477,"context_line":"        return requested, not_requested"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_07222aa3","line":477,"range":{"start_line":477,"start_character":0,"end_line":477,"end_character":39},"updated":"2016-12-21 15:43:41.000000000","message":"I would feel better if this was modeled as o.vo instead of a tuple, as this would give us some more flexibility in backporting data if we ever wanted to change the structure. Thing is - I find it highly unlikely that we\u0027ll ever do that and if such situation happen we can always do backports based on RPC version. So - let\u0027s leave this as is.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":474,"context_line":"                not_requested.append(service)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        LOG.info(_LI(\u0027Cleanup requests completed.\u0027))"},{"line_number":477,"context_line":"        return requested, not_requested"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa48f94a_a65d7eee","line":477,"range":{"start_line":477,"start_character":0,"end_line":477,"end_character":39},"in_reply_to":"1a6eadb0_07222aa3","updated":"2016-12-21 19:56:40.000000000","message":"I admit I considered it at the time, but that would have meant to have yet another patch on this long list of patches, and I decided not to do it.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a03797183cefc20c65e4aeb7d11de8b09392a3ba","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        eventlet.sleep(CONF.periodic_interval)"},{"line_number":86,"context_line":"        self._startup_delay \u003d False"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def reset(self):"},{"line_number":89,"context_line":"        super(SchedulerManager, self).reset()"},{"line_number":90,"context_line":"        self.driver.reset()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":93,"context_line":"                                    host\u003dNone, capabilities\u003dNone,"}],"source_content_type":"text/x-python","patch_set":38,"id":"da4df55a_7e0cea42","line":90,"range":{"start_line":88,"start_character":0,"end_line":90,"end_character":27},"updated":"2016-12-22 10:10:35.000000000","message":"You also need to add resetting RPC APIs here to make sure cached RPC version pins will be correctly invalidated when SIGHUP is received. See [1] as example.\n\n[1] https://github.com/openstack/cinder/blob/e679627ddbcd494df64e51e82333fd7c71a88634/cinder/backup/manager.py#L222-L223","commit_id":"8d18b5c045951eea18254afcd2111b364332ca5d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"477056483ba22f8826c2f9d2d31271385107ea04","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        eventlet.sleep(CONF.periodic_interval)"},{"line_number":86,"context_line":"        self._startup_delay \u003d False"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def reset(self):"},{"line_number":89,"context_line":"        super(SchedulerManager, self).reset()"},{"line_number":90,"context_line":"        self.driver.reset()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def update_service_capabilities(self, context, service_name\u003dNone,"},{"line_number":93,"context_line":"                                    host\u003dNone, capabilities\u003dNone,"}],"source_content_type":"text/x-python","patch_set":38,"id":"da4df55a_12790f94","line":90,"range":{"start_line":88,"start_character":0,"end_line":90,"end_character":27},"in_reply_to":"da4df55a_7e0cea42","updated":"2016-12-22 12:30:41.000000000","message":"Done","commit_id":"8d18b5c045951eea18254afcd2111b364332ca5d"}],"cinder/scheduler/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"280376363c20b08b7ed477e393b7b33e6e16ff39","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            raise exception.ServiceTooOld(msg)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        cctxt \u003d self.client.prepare(version\u003d\u00273.3\u0027)"},{"line_number":227,"context_line":"        return cctxt.cast(ctxt, \u0027do_cleanup\u0027, cleanup_request\u003dcleanup_request)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a6eadb0_e369a3bf","line":227,"range":{"start_line":227,"start_character":8,"end_line":227,"end_character":15},"updated":"2016-12-21 15:43:41.000000000","message":"It\u0027s an RPC cast, so no need to return anything.","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"cd4dbd3de3a8840dfd427d1b3ea4bb8aad5274a5","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            raise exception.ServiceTooOld(msg)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        cctxt \u003d self.client.prepare(version\u003d\u00273.3\u0027)"},{"line_number":227,"context_line":"        return cctxt.cast(ctxt, \u0027do_cleanup\u0027, cleanup_request\u003dcleanup_request)"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa48f94a_86695a8e","line":227,"range":{"start_line":227,"start_character":8,"end_line":227,"end_character":15},"in_reply_to":"1a6eadb0_e369a3bf","updated":"2016-12-21 19:56:40.000000000","message":"Done","commit_id":"f96d2c626381d411c85e014928a1ef828aa50789"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"33bd5ef3de79efd75f59f4fc16377bdfeef738b9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        3.3 - Add cluster support to migrate_volume, and to"},{"line_number":67,"context_line":"              update_service_capabilities and send the timestamp from the"},{"line_number":68,"context_line":"              capabilities."},{"line_number":69,"context_line":"        3.3 - Adds work_cleanup and do_cleanup methods."},{"line_number":70,"context_line":"    \"\"\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    RPC_API_VERSION \u003d \u00273.3\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"7a3c09a3_688986ca","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":55},"updated":"2017-01-13 12:47:21.000000000","message":"That should be 3.4.","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c63f743ce177f2d64e35f7d76a8efce1eeae3e1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        3.3 - Add cluster support to migrate_volume, and to"},{"line_number":67,"context_line":"              update_service_capabilities and send the timestamp from the"},{"line_number":68,"context_line":"              capabilities."},{"line_number":69,"context_line":"        3.3 - Adds work_cleanup and do_cleanup methods."},{"line_number":70,"context_line":"    \"\"\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    RPC_API_VERSION \u003d \u00273.3\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"7a3c09a3_5568e2f5","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":55},"in_reply_to":"7a3c09a3_688986ca","updated":"2017-01-13 13:24:34.000000000","message":"Done","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"}],"cinder/tests/unit/policy.json":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"33bd5ef3de79efd75f59f4fc16377bdfeef738b9","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    \"clusters:get_all\": \"rule:admin_api\","},{"line_number":146,"context_line":"    \"clusters:update\": \"rule:admin_api\","},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    \"workers:cleanup\": \"rule:admin_api\""},{"line_number":149,"context_line":"}"}],"source_content_type":"application/json","patch_set":41,"id":"7a3c09a3_f949d28f","line":148,"updated":"2017-01-13 12:47:21.000000000","message":"Ending this with a comma will simplify future diffs.","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c63f743ce177f2d64e35f7d76a8efce1eeae3e1","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    \"clusters:get_all\": \"rule:admin_api\","},{"line_number":146,"context_line":"    \"clusters:update\": \"rule:admin_api\","},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    \"workers:cleanup\": \"rule:admin_api\""},{"line_number":149,"context_line":"}"}],"source_content_type":"application/json","patch_set":41,"id":"7a3c09a3_554f0292","line":148,"in_reply_to":"7a3c09a3_f949d28f","updated":"2017-01-13 13:24:34.000000000","message":"this is json, ending it with a comma is a syntax error","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"33bd5ef3de79efd75f59f4fc16377bdfeef738b9","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        destination \u003d cleanup_request.service_topic_queue"},{"line_number":406,"context_line":"        cctxt \u003d self._get_cctxt(destination, \u00273.7\u0027)"},{"line_number":407,"context_line":"        # NOTE(geguileo): This call goes to do_cleanup code in"},{"line_number":408,"context_line":"        # cinder.manager.CleanableManager unless in the future we overwritte it"},{"line_number":409,"context_line":"        # in cinder.volume.manager"},{"line_number":410,"context_line":"        cctxt.cast(ctxt, \u0027do_cleanup\u0027, cleanup_request\u003dcleanup_request)"}],"source_content_type":"text/x-python","patch_set":41,"id":"7a3c09a3_e87816fb","line":408,"range":{"start_line":408,"start_character":66,"end_line":408,"end_character":76},"updated":"2017-01-13 12:47:21.000000000","message":"overwrite","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c63f743ce177f2d64e35f7d76a8efce1eeae3e1","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        destination \u003d cleanup_request.service_topic_queue"},{"line_number":406,"context_line":"        cctxt \u003d self._get_cctxt(destination, \u00273.7\u0027)"},{"line_number":407,"context_line":"        # NOTE(geguileo): This call goes to do_cleanup code in"},{"line_number":408,"context_line":"        # cinder.manager.CleanableManager unless in the future we overwritte it"},{"line_number":409,"context_line":"        # in cinder.volume.manager"},{"line_number":410,"context_line":"        cctxt.cast(ctxt, \u0027do_cleanup\u0027, cleanup_request\u003dcleanup_request)"}],"source_content_type":"text/x-python","patch_set":41,"id":"7a3c09a3_b55e6643","line":408,"range":{"start_line":408,"start_character":66,"end_line":408,"end_character":76},"in_reply_to":"7a3c09a3_e87816fb","updated":"2017-01-13 13:24:34.000000000","message":"Done","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"}],"etc/cinder/policy.json":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"33bd5ef3de79efd75f59f4fc16377bdfeef738b9","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"clusters:get_all\": \"rule:admin_api\","},{"line_number":140,"context_line":"    \"clusters:update\": \"rule:admin_api\","},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    \"workers:cleanup\": \"rule:admin_api\""},{"line_number":143,"context_line":"}"}],"source_content_type":"application/json","patch_set":41,"id":"7a3c09a3_f962b215","line":142,"updated":"2017-01-13 12:47:21.000000000","message":"Ending this with a comma will simplify future diffs.","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3c63f743ce177f2d64e35f7d76a8efce1eeae3e1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"clusters:get_all\": \"rule:admin_api\","},{"line_number":140,"context_line":"    \"clusters:update\": \"rule:admin_api\","},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    \"workers:cleanup\": \"rule:admin_api\""},{"line_number":143,"context_line":"}"}],"source_content_type":"application/json","patch_set":41,"id":"7a3c09a3_38ffcd02","line":142,"in_reply_to":"7a3c09a3_f962b215","updated":"2017-01-13 13:24:34.000000000","message":"for json that would be a syntax error, it cannot end with a comma","commit_id":"68d7623ca8bcd4ffdac55baddb1f6a3c1b2c2398"}]}
