)]}'
{"gnocchi/cli.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"19cc91456e36ab11876af2531f5e2e9dc4e24f74","unresolved":false,"context_lines":[{"line_number":112,"context_line":"def _metricd_cleanup(workers):"},{"line_number":113,"context_line":"    for worker in workers:"},{"line_number":114,"context_line":"        worker.terminate()"},{"line_number":115,"context_line":"        worker.join()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def _metricd_terminate(signum, frame):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_d33fd9b3","line":115,"updated":"2015-09-08 17:56:57.000000000","message":"Should be faster to terminate all and then join all","commit_id":"c6ea03938f355148e8b7c0f7a76da9642c30ac71"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ad1c2f079bf06508ec4cf5b46183effd1a5407dc","unresolved":false,"context_lines":[{"line_number":112,"context_line":"def _metricd_cleanup(workers):"},{"line_number":113,"context_line":"    for worker in workers:"},{"line_number":114,"context_line":"        worker.terminate()"},{"line_number":115,"context_line":"        worker.join()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def _metricd_terminate(signum, frame):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_2c1c99c0","line":115,"in_reply_to":"da20952f_d33fd9b3","updated":"2015-09-09 09:34:33.000000000","message":"Sure but is speed during shutdown a critical factor that overrides nice simple easy to read code?","commit_id":"c6ea03938f355148e8b7c0f7a76da9642c30ac71"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c442f93e30063950d5c053b2db1d63b640cfff9b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.conf \u003d conf"},{"line_number":54,"context_line":"        self.delay \u003d worker_number"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @retrying.retry(stop_max_attempt_number\u003d10,"},{"line_number":57,"context_line":"                    wait_fixed\u003d500)"},{"line_number":58,"context_line":"    def _configure(self):"},{"line_number":59,"context_line":"        self.store \u003d storage.get_driver(self.conf)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_5bf3da73","line":56,"updated":"2015-09-14 12:37:04.000000000","message":"I\u0027m not sure we should ever stop. I think we should keep trying forever until everything works again.\n\nif the operator wants the process to stop, it just has to stop the process, that\u0027s it.\n\n\nI think it\u0027s more robust to keep trying (with an exponential delay maybe).","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"9ef901ef38d78ce17d6d893a82562c4f58c1205d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.conf \u003d conf"},{"line_number":54,"context_line":"        self.delay \u003d worker_number"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @retrying.retry(stop_max_attempt_number\u003d10,"},{"line_number":57,"context_line":"                    wait_fixed\u003d500)"},{"line_number":58,"context_line":"    def _configure(self):"},{"line_number":59,"context_line":"        self.store \u003d storage.get_driver(self.conf)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_b689ebcc","line":56,"in_reply_to":"ba15a1d1_16b0d7f3","updated":"2015-09-14 12:59:55.000000000","message":"With my operator hat, I can\u0027t agree with that. Having a daemon dying just because you had a 5 minutes outage on your SQL database is a terrible thing.\n\nMonitoring the logs and being sure that the system works is anyway mandatory for any operator, so they\u0027ll do it. I\u0027d expect someone that deploys manually going to read the log or stdout anyway.\n\nOn the other hand, I am not sure that anything here is solid enough to handle a 30 second database failure, so I\u0027m not sure it changes anything in the end.","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"384de011f1855c7ba369d988a35ac065aa40456e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.conf \u003d conf"},{"line_number":54,"context_line":"        self.delay \u003d worker_number"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @retrying.retry(stop_max_attempt_number\u003d10,"},{"line_number":57,"context_line":"                    wait_fixed\u003d500)"},{"line_number":58,"context_line":"    def _configure(self):"},{"line_number":59,"context_line":"        self.store \u003d storage.get_driver(self.conf)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_16b0d7f3","line":56,"in_reply_to":"ba15a1d1_5bf3da73","updated":"2015-09-14 12:55:47.000000000","message":"I considered that but then you don\u0027t get a clear signal that things have failed in a disastrous way (if in fact they have); you either have to notice that no metrics have been saved or be monitoring the logs.\n\nFor a huge deployment that\u0027s reasonable, but for someone kicking around gnocchi for fun and (small) profit the process actually dying is the most expected way to be notified that stuff is broken in an unrecoverable way.","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c442f93e30063950d5c053b2db1d63b640cfff9b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        while True:"},{"line_number":69,"context_line":"            try:"},{"line_number":70,"context_line":"                self._process(self.store, self.index)"},{"line_number":71,"context_line":"                time.sleep(self.conf.storage.metric_processing_delay)"},{"line_number":72,"context_line":"            except KeyboardInterrupt:"},{"line_number":73,"context_line":"                # Ignore KeyboardInterrupt so parent handler can kill"},{"line_number":74,"context_line":"                # all children."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_fbb50e7e","line":71,"updated":"2015-09-14 12:37:04.000000000","message":"I\u0027d prefer we use the StopWatch we have in oslo_utils.timeutils, so we don\u0027t over-sleep if there are a lot of work to be done.\n\nThat means sleep metric_processing_delay if nothing to do, otherwise sleep max(0, (metric_process_delay - delay_spent_processing))","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"384de011f1855c7ba369d988a35ac065aa40456e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        while True:"},{"line_number":69,"context_line":"            try:"},{"line_number":70,"context_line":"                self._process(self.store, self.index)"},{"line_number":71,"context_line":"                time.sleep(self.conf.storage.metric_processing_delay)"},{"line_number":72,"context_line":"            except KeyboardInterrupt:"},{"line_number":73,"context_line":"                # Ignore KeyboardInterrupt so parent handler can kill"},{"line_number":74,"context_line":"                # all children."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_76db531c","line":71,"in_reply_to":"ba15a1d1_fbb50e7e","updated":"2015-09-14 12:55:47.000000000","message":"makes sense","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c442f93e30063950d5c053b2db1d63b640cfff9b","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"def _metricd_cleanup(workers):"},{"line_number":117,"context_line":"    for worker in workers:"},{"line_number":118,"context_line":"        worker.terminate()"},{"line_number":119,"context_line":"        worker.join()"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_9b4652be","line":117,"updated":"2015-09-14 12:37:04.000000000","message":"Forgot to publish my previous draft: I don\u0027t think having 2 loops makes it less readable and I think it can speed up the cleanup, so I\u0027d like that.\n\n(But can do in a next patch.)","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"384de011f1855c7ba369d988a35ac065aa40456e","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"def _metricd_cleanup(workers):"},{"line_number":117,"context_line":"    for worker in workers:"},{"line_number":118,"context_line":"        worker.terminate()"},{"line_number":119,"context_line":"        worker.join()"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_b6f80b7e","line":117,"in_reply_to":"ba15a1d1_9b4652be","updated":"2015-09-14 12:55:47.000000000","message":"I figured you thought so but never heard back. Now it all makes sense.","commit_id":"a1c0dd6894812bdaa045e4fd54028adde4569310"}]}
