)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9cdfa719d948b5e7645d3e59c14dd32173ef948e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Publish samples on other threads"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The bug (https://bugs.launchpad.net/ceilometer/+bug/1337761) reports that "},{"line_number":10,"context_line":"\"publish_sample\" is a main cause of performance degradation as a result of"},{"line_number":11,"context_line":" re-measurement without the \"self.publish_sample()\" execution."},{"line_number":12,"context_line":"The publish_sample publishes samples to pipeline. The sample is sequential"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"baada198_2d1d3463","line":9,"updated":"2014-07-30 07:45:07.000000000","message":"remove trailing spaces please :)","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9cdfa719d948b5e7645d3e59c14dd32173ef948e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The bug (https://bugs.launchpad.net/ceilometer/+bug/1337761) reports that "},{"line_number":10,"context_line":"\"publish_sample\" is a main cause of performance degradation as a result of"},{"line_number":11,"context_line":" re-measurement without the \"self.publish_sample()\" execution."},{"line_number":12,"context_line":"The publish_sample publishes samples to pipeline. The sample is sequential"},{"line_number":13,"context_line":"ly published. A GET/PUT request is published twice and a DELETE request is"},{"line_number":14,"context_line":" published once. The performance is degraded with the behavior above. "}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"baada198_8d33a0f6","line":11,"range":{"start_line":11,"start_character":1,"end_line":11,"end_character":3},"updated":"2014-07-30 07:45:07.000000000","message":"space in the beginning is not useful really :)","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9cdfa719d948b5e7645d3e59c14dd32173ef948e","unresolved":false,"context_lines":[{"line_number":11,"context_line":" re-measurement without the \"self.publish_sample()\" execution."},{"line_number":12,"context_line":"The publish_sample publishes samples to pipeline. The sample is sequential"},{"line_number":13,"context_line":"ly published. A GET/PUT request is published twice and a DELETE request is"},{"line_number":14,"context_line":" published once. The performance is degraded with the behavior above. "},{"line_number":15,"context_line":"Therefore, publish samples on asynchronous from main thread. The performan"},{"line_number":16,"context_line":"ce is improved by reducing the publishing cost."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"baada198_4d2268a4","line":14,"range":{"start_line":14,"start_character":69,"end_line":14,"end_character":70},"updated":"2014-07-30 07:45:07.000000000","message":"ditto - in the beginning and in the end of line :)","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"}],"ceilometer/objectstore/swift_middleware.py":[{"author":{"_account_id":7729,"name":"Ilya Tyaptin","email":"ityaptin@mirantis.com","username":"ityaptin"},"change_message_id":"b805e85f355a2fbaecd315000b0568d3fb959852","unresolved":false,"context_lines":[{"line_number":65,"context_line":"from ceilometer import sample"},{"line_number":66,"context_line":"from ceilometer import service"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"import eventlet"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"class CeilometerMiddleware(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0c6f99c8","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":15},"updated":"2014-08-13 14:51:50.000000000","message":"Move this import upper to the needed section of third-party libraries. In python code there are usually three groups of imports:\n* built-in modules (like collections, time) - python standard libraries\n* third-party modules - the ones you set in requirements.txt and test-requirements.txt\n* local modules - modules from current project","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":8052,"name":"Nejc Saje","email":"nejc@saje.info","username":"nsaje"},"change_message_id":"4eb7c901eaf7802e156d9cc56745d0dcf1148704","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        if self.reseller_prefix and self.reseller_prefix[-1] !\u003d \u0027_\u0027:"},{"line_number":88,"context_line":"            self.reseller_prefix +\u003d \u0027_\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.expire \u003d conf.get(\u0027publisher_expire\u0027, \u0027forever\u0027)"},{"line_number":91,"context_line":"        if not self.expire.lower() \u003d\u003d \u0027forever\u0027:"},{"line_number":92,"context_line":"            self.expire \u003d int(self.expire)"},{"line_number":93,"context_line":"        self.workers \u003d int(conf.get(\u0027publisher_workers\u0027, 1))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_9b38393d","line":90,"updated":"2014-07-30 07:29:56.000000000","message":"Perhaps I\u0027m wrong, but I think the retry semantics are handled in the pipeline itself. This at least doesn\u0027t seem the right place to handle it.","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":8052,"name":"Nejc Saje","email":"nejc@saje.info","username":"nsaje"},"change_message_id":"4eb7c901eaf7802e156d9cc56745d0dcf1148704","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            self.expire \u003d int(self.expire)"},{"line_number":93,"context_line":"        self.workers \u003d int(conf.get(\u0027publisher_workers\u0027, 1))"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.queue \u003d eventlet.Queue()"},{"line_number":96,"context_line":"        pool \u003d eventlet.GreenPool(self.workers)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        for i in xrange(self.workers):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_1b62693d","line":95,"updated":"2014-07-30 07:29:56.000000000","message":"Eventlet threading is a bit different than regular threading. Eventlet threads are very lightweight, so you can create hundreds of them without performance impact. The common pattern for this type of problem would be to just have a `publish(sample)` method and then call\n\n eventlet.spawn_n(publish, sample)\n\n, which would spawn a new greenthread, execute the provided function in it and discard the result once it finishes. No need for queues (and even pool is unnecessary here, I think, as is in https://github.com/openstack/ceilometer/blob/master/ceilometer/alarm/notifier/rest.py#L101 , but someone might correct me).","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":8052,"name":"Nejc Saje","email":"nejc@saje.info","username":"nsaje"},"change_message_id":"a243a42de143f5ebbfea17c04bbe3d75c8bf73da","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            self.expire \u003d int(self.expire)"},{"line_number":93,"context_line":"        self.workers \u003d int(conf.get(\u0027publisher_workers\u0027, 1))"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.queue \u003d eventlet.Queue()"},{"line_number":96,"context_line":"        pool \u003d eventlet.GreenPool(self.workers)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        for i in xrange(self.workers):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1abeadc6_e1133a5a","line":95,"in_reply_to":"baada198_0d9dd0bb","updated":"2014-08-19 07:36:24.000000000","message":"Currently, we have eventlet. When we switch over to asyncio,\n\n eventlet.spawn_n(publish, sample)\n\nwill simply be changed to something like\n\n asyncio_loop.call_soon(publish, sample)\n\nThere\u0027s no way around using eventlet at the moment - that is until we switch over to asyncio.","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9cdfa719d948b5e7645d3e59c14dd32173ef948e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            self.expire \u003d int(self.expire)"},{"line_number":93,"context_line":"        self.workers \u003d int(conf.get(\u0027publisher_workers\u0027, 1))"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.queue \u003d eventlet.Queue()"},{"line_number":96,"context_line":"        pool \u003d eventlet.GreenPool(self.workers)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        for i in xrange(self.workers):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0d9dd0bb","line":95,"in_reply_to":"baada198_1b62693d","updated":"2014-07-30 07:45:07.000000000","message":"well, yeah - Nejc, your variant is better I guess... although eventlet usage is a little bit suspicious itself - we\u0027re trying to get rid of it in future to have py33 compatibility - please ignore my crying here, I think there is no way to use smth different right now :)","commit_id":"b71820dba76411bfeba6f2089006ca83b702766c"}]}
