)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"a5fe3341b46fe295ee3e3c45544a630a402d21a7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"To make use of the coordinator on the different services we need to"},{"line_number":10,"context_line":"start and stop it together with the services."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch adds start and stop method calls in API, Volume and Backup"},{"line_number":13,"context_line":"nodes."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Restored from https://review.openstack.org/#/c/205839"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9abb7d3a_a0af247c","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":5},"updated":"2016-06-02 18:13:42.000000000","message":"Need to limit the scope of this statement.  You could say that this patch does the volume service and that if there is a need in the future similar code could be deployed for other services.  I think \u0027services\u0027 may be a better noun here than \u0027nodes\u0027.","commit_id":"c0a8bfa3df35ca2dffc7af90891b37d961ca52e8"}],"cinder/coordination.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71a57a8e43a4fb3527b93e516a824b0e41d9411f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # NOTE(bluex): Tooz expects lock name as a byte string."},{"line_number":117,"context_line":"        lock_name \u003d (self.prefix + name).encode(\u0027ascii\u0027)"},{"line_number":118,"context_line":"        if self.coordinator is not None:"},{"line_number":119,"context_line":"            return self.coordinator.get_lock(lock_name)"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            raise exception.LockCreationFailed(_(\u0027Coordinator uninitialized.\u0027))"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_6307ce81","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":55},"updated":"2016-06-03 14:52:27.000000000","message":"Can we do that universally in our coordinator layer?","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"affc1743bff78e7d8c2a0eff698f4ff654bfb541","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # NOTE(bluex): Tooz expects lock name as a byte string."},{"line_number":117,"context_line":"        lock_name \u003d (self.prefix + name).encode(\u0027ascii\u0027)"},{"line_number":118,"context_line":"        if self.coordinator is not None:"},{"line_number":119,"context_line":"            return self.coordinator.get_lock(lock_name)"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            raise exception.LockCreationFailed(_(\u0027Coordinator uninitialized.\u0027))"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_02cdaf84","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":55},"in_reply_to":"9abb7d3a_6307ce81","updated":"2016-06-08 14:48:27.000000000","message":"Nevermind, that is coordination layer, looks like my mind slipped.","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71a57a8e43a4fb3527b93e516a824b0e41d9411f","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _start(self):"},{"line_number":144,"context_line":"        # NOTE(bluex): Tooz expects member_id as a byte string."},{"line_number":145,"context_line":"        member_id \u003d (self.prefix + self.agent_id).encode(\u0027ascii\u0027)"},{"line_number":146,"context_line":"        self.coordinator \u003d coordination.get_coordinator("},{"line_number":147,"context_line":"            cfg.CONF.coordination.backend_url, member_id)"},{"line_number":148,"context_line":"        self.coordinator.start()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_03f9a280","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":65},"updated":"2016-06-03 14:52:27.000000000","message":"ditto","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"affc1743bff78e7d8c2a0eff698f4ff654bfb541","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _start(self):"},{"line_number":144,"context_line":"        # NOTE(bluex): Tooz expects member_id as a byte string."},{"line_number":145,"context_line":"        member_id \u003d (self.prefix + self.agent_id).encode(\u0027ascii\u0027)"},{"line_number":146,"context_line":"        self.coordinator \u003d coordination.get_coordinator("},{"line_number":147,"context_line":"            cfg.CONF.coordination.backend_url, member_id)"},{"line_number":148,"context_line":"        self.coordinator.start()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_a2a49bb9","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":65},"in_reply_to":"9abb7d3a_03f9a280","updated":"2016-06-08 14:48:27.000000000","message":"nvm","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"}],"cinder/service.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71a57a8e43a4fb3527b93e516a824b0e41d9411f","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                self.model_disconnected \u003d True"},{"line_number":368,"context_line":"                LOG.exception(_LE(\u0027Exception encountered: \u0027))"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def reset(self):"},{"line_number":371,"context_line":"        self.manager.reset()"},{"line_number":372,"context_line":"        super(Service, self).reset()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"class WSGIService(service.ServiceBase):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_c3e83a7f","line":372,"range":{"start_line":370,"start_character":0,"end_line":372,"end_character":36},"updated":"2016-06-03 14:52:27.000000000","message":"Can you take a look how it will behave in case of catching SIGHUP? Will coordinator get restarted correctly?","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4ecfaff095affe57b2193e92202bacbce264b205","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                self.model_disconnected \u003d True"},{"line_number":368,"context_line":"                LOG.exception(_LE(\u0027Exception encountered: \u0027))"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def reset(self):"},{"line_number":371,"context_line":"        self.manager.reset()"},{"line_number":372,"context_line":"        super(Service, self).reset()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"class WSGIService(service.ServiceBase):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_72a122f8","line":372,"range":{"start_line":370,"start_character":0,"end_line":372,"end_character":36},"in_reply_to":"9abb7d3a_c3e83a7f","updated":"2016-06-13 09:54:16.000000000","message":"Okay, I\u0027ve check that and it works okay.","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71a57a8e43a4fb3527b93e516a824b0e41d9411f","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        super(Service, self).reset()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"class WSGIService(service.ServiceBase):"},{"line_number":376,"context_line":"    \"\"\"Provides ability to launch API from a \u0027paste\u0027 configuration.\"\"\""},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def __init__(self, name, loader\u003dNone, coordination\u003dFalse):"},{"line_number":379,"context_line":"        \"\"\"Initialize, but do not start the WSGI server."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        :param name: The name of the WSGI server given to the loader."},{"line_number":382,"context_line":"        :param loader: Loads the WSGI application using the given name."},{"line_number":383,"context_line":"        :returns: None"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        \"\"\""},{"line_number":386,"context_line":"        self.name \u003d name"},{"line_number":387,"context_line":"        self.manager \u003d self._get_manager()"},{"line_number":388,"context_line":"        self.loader \u003d loader or wsgi.Loader(CONF)"},{"line_number":389,"context_line":"        self.app \u003d self.loader.load_app(name)"},{"line_number":390,"context_line":"        self.host \u003d getattr(CONF, \u0027%s_listen\u0027 % name, \"0.0.0.0\")"},{"line_number":391,"context_line":"        self.port \u003d getattr(CONF, \u0027%s_listen_port\u0027 % name, 0)"},{"line_number":392,"context_line":"        self.workers \u003d (getattr(CONF, \u0027%s_workers\u0027 % name, None) or"},{"line_number":393,"context_line":"                        processutils.get_worker_count())"},{"line_number":394,"context_line":"        self.coordination \u003d coordination"},{"line_number":395,"context_line":"        if self.workers and self.workers \u003c 1:"},{"line_number":396,"context_line":"            worker_name \u003d \u0027%s_workers\u0027 % name"},{"line_number":397,"context_line":"            msg \u003d (_(\"%(worker_name)s value of %(workers)d is invalid, \""},{"line_number":398,"context_line":"                     \"must be greater than 0.\") %"},{"line_number":399,"context_line":"                   {\u0027worker_name\u0027: worker_name,"},{"line_number":400,"context_line":"                    \u0027workers\u0027: self.workers})"},{"line_number":401,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":402,"context_line":"        setup_profiler(name, self.host)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        self.server \u003d wsgi.Server(CONF,"},{"line_number":405,"context_line":"                                  name,"},{"line_number":406,"context_line":"                                  self.app,"},{"line_number":407,"context_line":"                                  host\u003dself.host,"},{"line_number":408,"context_line":"                                  port\u003dself.port)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _get_manager(self):"},{"line_number":411,"context_line":"        \"\"\"Initialize a Manager object appropriate for this service."},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        Use the service name to look up a Manager subclass from the"},{"line_number":414,"context_line":"        configuration and initialize an instance. If no class name"},{"line_number":415,"context_line":"        is configured, just return None."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        :returns: a Manager instance, or None."},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        \"\"\""},{"line_number":420,"context_line":"        fl \u003d \u0027%s_manager\u0027 % self.name"},{"line_number":421,"context_line":"        if fl not in CONF:"},{"line_number":422,"context_line":"            return None"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        manager_class_name \u003d CONF.get(fl, None)"},{"line_number":425,"context_line":"        if not manager_class_name:"},{"line_number":426,"context_line":"            return None"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        manager_class \u003d importutils.import_class(manager_class_name)"},{"line_number":429,"context_line":"        return manager_class()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def start(self):"},{"line_number":432,"context_line":"        \"\"\"Start serving this service using loaded configuration."},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        Also, retrieve updated port number in case \u00270\u0027 was passed in, which"},{"line_number":435,"context_line":"        indicates a random port should be used."},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        :returns: None"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if self.manager:"},{"line_number":441,"context_line":"            self.manager.init_host()"},{"line_number":442,"context_line":"        self.server.start()"},{"line_number":443,"context_line":"        self.port \u003d self.server.port"},{"line_number":444,"context_line":"        if self.coordination:"},{"line_number":445,"context_line":"            coordination.COORDINATOR.start()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def stop(self):"},{"line_number":448,"context_line":"        \"\"\"Stop serving this API."},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        :returns: None"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        self.server.stop()"},{"line_number":454,"context_line":"        if self.coordination:"},{"line_number":455,"context_line":"            try:"},{"line_number":456,"context_line":"                coordination.COORDINATOR.stop()"},{"line_number":457,"context_line":"            except Exception:"},{"line_number":458,"context_line":"                pass"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def wait(self):"},{"line_number":461,"context_line":"        \"\"\"Wait for the service to stop serving this API."},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        :returns: None"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        \"\"\""},{"line_number":466,"context_line":"        self.server.wait()"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def reset(self):"},{"line_number":469,"context_line":"        \"\"\"Reset server greenpool size to default."},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_03b1a28f","line":468,"range":{"start_line":375,"start_character":0,"end_line":468,"end_character":20},"updated":"2016-06-03 14:52:27.000000000","message":"I would ignore WSGI service in this patch. Hopefully we won\u0027t need to add DLM to our supposed-to-be-stateless API service.","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d730da7d80a6a7680dd8abb19c2336e6d8369ba","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        super(Service, self).reset()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"class WSGIService(service.ServiceBase):"},{"line_number":376,"context_line":"    \"\"\"Provides ability to launch API from a \u0027paste\u0027 configuration.\"\"\""},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def __init__(self, name, loader\u003dNone, coordination\u003dFalse):"},{"line_number":379,"context_line":"        \"\"\"Initialize, but do not start the WSGI server."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        :param name: The name of the WSGI server given to the loader."},{"line_number":382,"context_line":"        :param loader: Loads the WSGI application using the given name."},{"line_number":383,"context_line":"        :returns: None"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        \"\"\""},{"line_number":386,"context_line":"        self.name \u003d name"},{"line_number":387,"context_line":"        self.manager \u003d self._get_manager()"},{"line_number":388,"context_line":"        self.loader \u003d loader or wsgi.Loader(CONF)"},{"line_number":389,"context_line":"        self.app \u003d self.loader.load_app(name)"},{"line_number":390,"context_line":"        self.host \u003d getattr(CONF, \u0027%s_listen\u0027 % name, \"0.0.0.0\")"},{"line_number":391,"context_line":"        self.port \u003d getattr(CONF, \u0027%s_listen_port\u0027 % name, 0)"},{"line_number":392,"context_line":"        self.workers \u003d (getattr(CONF, \u0027%s_workers\u0027 % name, None) or"},{"line_number":393,"context_line":"                        processutils.get_worker_count())"},{"line_number":394,"context_line":"        self.coordination \u003d coordination"},{"line_number":395,"context_line":"        if self.workers and self.workers \u003c 1:"},{"line_number":396,"context_line":"            worker_name \u003d \u0027%s_workers\u0027 % name"},{"line_number":397,"context_line":"            msg \u003d (_(\"%(worker_name)s value of %(workers)d is invalid, \""},{"line_number":398,"context_line":"                     \"must be greater than 0.\") %"},{"line_number":399,"context_line":"                   {\u0027worker_name\u0027: worker_name,"},{"line_number":400,"context_line":"                    \u0027workers\u0027: self.workers})"},{"line_number":401,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":402,"context_line":"        setup_profiler(name, self.host)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        self.server \u003d wsgi.Server(CONF,"},{"line_number":405,"context_line":"                                  name,"},{"line_number":406,"context_line":"                                  self.app,"},{"line_number":407,"context_line":"                                  host\u003dself.host,"},{"line_number":408,"context_line":"                                  port\u003dself.port)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _get_manager(self):"},{"line_number":411,"context_line":"        \"\"\"Initialize a Manager object appropriate for this service."},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        Use the service name to look up a Manager subclass from the"},{"line_number":414,"context_line":"        configuration and initialize an instance. If no class name"},{"line_number":415,"context_line":"        is configured, just return None."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        :returns: a Manager instance, or None."},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        \"\"\""},{"line_number":420,"context_line":"        fl \u003d \u0027%s_manager\u0027 % self.name"},{"line_number":421,"context_line":"        if fl not in CONF:"},{"line_number":422,"context_line":"            return None"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        manager_class_name \u003d CONF.get(fl, None)"},{"line_number":425,"context_line":"        if not manager_class_name:"},{"line_number":426,"context_line":"            return None"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        manager_class \u003d importutils.import_class(manager_class_name)"},{"line_number":429,"context_line":"        return manager_class()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def start(self):"},{"line_number":432,"context_line":"        \"\"\"Start serving this service using loaded configuration."},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        Also, retrieve updated port number in case \u00270\u0027 was passed in, which"},{"line_number":435,"context_line":"        indicates a random port should be used."},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        :returns: None"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if self.manager:"},{"line_number":441,"context_line":"            self.manager.init_host()"},{"line_number":442,"context_line":"        self.server.start()"},{"line_number":443,"context_line":"        self.port \u003d self.server.port"},{"line_number":444,"context_line":"        if self.coordination:"},{"line_number":445,"context_line":"            coordination.COORDINATOR.start()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def stop(self):"},{"line_number":448,"context_line":"        \"\"\"Stop serving this API."},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        :returns: None"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        self.server.stop()"},{"line_number":454,"context_line":"        if self.coordination:"},{"line_number":455,"context_line":"            try:"},{"line_number":456,"context_line":"                coordination.COORDINATOR.stop()"},{"line_number":457,"context_line":"            except Exception:"},{"line_number":458,"context_line":"                pass"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def wait(self):"},{"line_number":461,"context_line":"        \"\"\"Wait for the service to stop serving this API."},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        :returns: None"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        \"\"\""},{"line_number":466,"context_line":"        self.server.wait()"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def reset(self):"},{"line_number":469,"context_line":"        \"\"\"Reset server greenpool size to default."},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_efc43893","line":468,"range":{"start_line":375,"start_character":0,"end_line":468,"end_character":20},"in_reply_to":"9abb7d3a_03b1a28f","updated":"2016-06-03 16:53:15.000000000","message":"+1","commit_id":"6170b8dd3d1e8ce5f75ae4d0c6f6a041bc43578b"}]}
