)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"85366da0090d38794a1708044454721c159589d6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add an option to run rootwrap daemon instead of usual rootwrap."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note that this patch won\u0027t work until corresponding patch to"},{"line_number":12,"context_line":"oslo.rootwrap is merged: https://review.openstack.org/81798"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Functionality is currently being turned on and tested in this patch to"},{"line_number":15,"context_line":"devstack: https://review.openstack.org/107386"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"baada198_4984460e","line":12,"updated":"2014-07-29 10:43:19.000000000","message":"FYI we will also need to receive a new oslo.rootwrap release, and put that version dependency in openstack/requirements and consequently openstack/neutron.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"eb77d8e259fd8b2dd1ef60eb6419bb9bce1fa422","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add an option to run rootwrap daemon instead of usual rootwrap."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note that this patch won\u0027t work until corresponding patch to"},{"line_number":12,"context_line":"oslo.rootwrap is merged: https://review.openstack.org/81798"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Functionality is currently being turned on and tested in this patch to"},{"line_number":15,"context_line":"devstack: https://review.openstack.org/107386"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"baada198_6a33b9c4","line":12,"in_reply_to":"baada198_242d7790","updated":"2014-07-29 11:40:50.000000000","message":"Hm... I think I\u0027ll have to think about it some more. I don\u0027t quite remember the main reason behind supporting previous versions of oslo.rootwrap.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9451702eb11c0a07040800bee9be59d54da58a62","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add an option to run rootwrap daemon instead of usual rootwrap."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note that this patch won\u0027t work until corresponding patch to"},{"line_number":12,"context_line":"oslo.rootwrap is merged: https://review.openstack.org/81798"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Functionality is currently being turned on and tested in this patch to"},{"line_number":15,"context_line":"devstack: https://review.openstack.org/107386"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"baada198_6932ea10","line":12,"in_reply_to":"baada198_4984460e","updated":"2014-07-29 11:02:57.000000000","message":"In general this patch works even with current version of rootwrap. It gate it won\u0027t pass unittests until that change request is merged.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df12b53022363fcfbddb3dde0acc2208398c9ef1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add an option to run rootwrap daemon instead of usual rootwrap."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note that this patch won\u0027t work until corresponding patch to"},{"line_number":12,"context_line":"oslo.rootwrap is merged: https://review.openstack.org/81798"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Functionality is currently being turned on and tested in this patch to"},{"line_number":15,"context_line":"devstack: https://review.openstack.org/107386"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"baada198_242d7790","line":12,"in_reply_to":"baada198_6932ea10","updated":"2014-07-29 11:08:13.000000000","message":"Yes, that\u0027s for gate, because gate runs on trunk. But we still should bump version requirements for deployers.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"27b1683d33c4708b48a21bc13e3f53f3888f1960","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Functionality is currently being turned on and tested in this patch to"},{"line_number":15,"context_line":"devstack: https://review.openstack.org/107386"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements: blueprint rootwrap-daemon-mode"},{"line_number":18,"context_line":"Change-Id: I88abe0c6caa4024dd7db01dca800f5d1686d9c28"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"5a890539_dc02d90b","line":16,"updated":"2014-12-05 07:08:12.000000000","message":"DocImpact?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"}],"neutron/agent/common/config.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"29666fcf4f7f8598929aed74b0a0d984d1f753c2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"ROOT_HELPER_OPTS \u003d ["},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Root helper application.\u0027)),"},{"line_number":32,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dTrue,"},{"line_number":33,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":35,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Tnk%3D","line":32,"updated":"2014-04-07 10:37:37.000000000","message":"I think it make sense to start from existing defaults  (e.g. default\u003dFalse)","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b4c7e97ac0779c6e30084d1224d3bfd7714e604","unresolved":false,"context_lines":[{"line_number":29,"context_line":"ROOT_HELPER_OPTS \u003d ["},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Root helper application.\u0027)),"},{"line_number":32,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dTrue,"},{"line_number":33,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":35,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9RpQ%3D","line":32,"in_reply_to":"AAAAWH%2F9Tnk%3D","updated":"2014-04-07 13:51:45.000000000","message":"I will bring back default behavior when tests will pass.","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"041b5e477b877519e56959cf9f64b0278997ac09","unresolved":false,"context_lines":[{"line_number":27,"context_line":"ROOT_HELPER_OPTS \u003d ["},{"line_number":28,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Root helper application.\u0027)),"},{"line_number":30,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dFalse,"},{"line_number":31,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_2ec1d84e","line":30,"updated":"2014-07-29 10:20:26.000000000","message":"why are we setting it to False by default? If we think it\u0027s the right way to go and that it adds huge perf boost, I would just enable it by default.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9451702eb11c0a07040800bee9be59d54da58a62","unresolved":false,"context_lines":[{"line_number":27,"context_line":"ROOT_HELPER_OPTS \u003d ["},{"line_number":28,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Root helper application.\u0027)),"},{"line_number":30,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dFalse,"},{"line_number":31,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_09f88e49","line":30,"in_reply_to":"baada198_2ec1d84e","updated":"2014-07-29 11:02:57.000000000","message":"As it was discussed with Neutron team (and mentioned in the blueprint), this functionality is turned off by default because of probable impact it can have on deployers. We can make it default (or even the only) option in some future release.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"27b1683d33c4708b48a21bc13e3f53f3888f1960","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dFalse,"},{"line_number":31,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"AGENT_STATE_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":34,"id":"5a890539_c70cc23c","line":33,"updated":"2014-12-05 07:08:12.000000000","message":"needs an upgrade procedure documented?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"49881d10e1379b9dc2c65fcdcce30afd4c2ed3fd","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    cfg.BoolOpt(\u0027use_rootwrap_daemon\u0027, default\u003dFalse,"},{"line_number":31,"context_line":"                help\u003d_(\"Use rootwrap daemon mode.\")),"},{"line_number":32,"context_line":"    cfg.StrOpt(\u0027rootwrap_config\u0027, default\u003d\u0027/etc/neutron/rootwrap.conf\u0027,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Rootwrap config file.\u0027)),"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"AGENT_STATE_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_50b906e8","line":33,"in_reply_to":"5a890539_c70cc23c","updated":"2015-02-03 11:06:11.000000000","message":"I don\u0027t think so. Once enabled it should enough to restart the relevant service(s)","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"}],"neutron/agent/linux/utils.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"004fa742793a883ec8f2da5e0a08522e1d2f8667","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"},{"line_number":100,"context_line":"        with cls._clients_mutex:"},{"line_number":101,"context_line":"            try:"},{"line_number":102,"context_line":"                return cls._clients[rootwrap_config]"}],"source_content_type":"text/x-python","patch_set":21,"id":"7adec928_4530b907","line":99,"updated":"2014-05-20 20:31:58.000000000","message":"Is _get_client called often ? if so, the following will avoid lock usage except on first call(s)\n\n  try:\n    return cls._clients[rootwrap_config]\n  except KeyError:\n    with cls._clients_mutex:\n      try:\n        return cls._clients[rootwrap_config]\n      except KeyError:\n        ...","commit_id":"a6076898916a915425d90df3be75c79769171ec1"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2e9293e9e235a4755b93822cf0d44f3409f16235","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"},{"line_number":100,"context_line":"        with cls._clients_mutex:"},{"line_number":101,"context_line":"            try:"},{"line_number":102,"context_line":"                return cls._clients[rootwrap_config]"}],"source_content_type":"text/x-python","patch_set":21,"id":"7adec928_6f04abc6","line":99,"in_reply_to":"7adec928_4530b907","updated":"2014-05-21 04:17:09.000000000","message":"No, it\u0027s not. If the agent is good-written it\u0027ll be called once for the process. It\u0027s not so for DHCP agent but it\u0027s a bug: https://bugs.launchpad.net/bugs/1318528 \n\nI thought about adding double-checked locking here but it\u0027s just won\u0027t ever be a bottleneck. I don\u0027t want to make this code messier.","commit_id":"a6076898916a915425d90df3be75c79769171ec1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"041b5e477b877519e56959cf9f64b0278997ac09","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                return cls._clients[rootwrap_config]"},{"line_number":102,"context_line":"            except KeyError:"},{"line_number":103,"context_line":"                from oslo.rootwrap import client"},{"line_number":104,"context_line":"                new_client \u003d client.Client(["},{"line_number":105,"context_line":"                    \"sudo\", \"neutron-rootwrap-daemon\", rootwrap_config])"},{"line_number":106,"context_line":"                cls._clients[rootwrap_config] \u003d new_client"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_ae36c84f","line":103,"updated":"2014-07-29 10:20:26.000000000","message":"again, why local import here?","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df12b53022363fcfbddb3dde0acc2208398c9ef1","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                return cls._clients[rootwrap_config]"},{"line_number":102,"context_line":"            except KeyError:"},{"line_number":103,"context_line":"                from oslo.rootwrap import client"},{"line_number":104,"context_line":"                new_client \u003d client.Client(["},{"line_number":105,"context_line":"                    \"sudo\", \"neutron-rootwrap-daemon\", rootwrap_config])"},{"line_number":106,"context_line":"                cls._clients[rootwrap_config] \u003d new_client"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_4470aba7","line":103,"in_reply_to":"baada198_098faece","updated":"2014-07-29 11:08:13.000000000","message":"We\u0027ll still require the new oslo.rootwrap, right? Meaning, it will be present in any case.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"eb77d8e259fd8b2dd1ef60eb6419bb9bce1fa422","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                return cls._clients[rootwrap_config]"},{"line_number":102,"context_line":"            except KeyError:"},{"line_number":103,"context_line":"                from oslo.rootwrap import client"},{"line_number":104,"context_line":"                new_client \u003d client.Client(["},{"line_number":105,"context_line":"                    \"sudo\", \"neutron-rootwrap-daemon\", rootwrap_config])"},{"line_number":106,"context_line":"                cls._clients[rootwrap_config] \u003d new_client"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_4a2d158f","line":103,"in_reply_to":"baada198_4470aba7","updated":"2014-07-29 11:40:50.000000000","message":"Yes, oslo.rootwrap will be present. But current versions doesn\u0027t have client module, so improting this module would fail unless you have the future version of oslo.rootwrap if this import will be global.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9451702eb11c0a07040800bee9be59d54da58a62","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                return cls._clients[rootwrap_config]"},{"line_number":102,"context_line":"            except KeyError:"},{"line_number":103,"context_line":"                from oslo.rootwrap import client"},{"line_number":104,"context_line":"                new_client \u003d client.Client(["},{"line_number":105,"context_line":"                    \"sudo\", \"neutron-rootwrap-daemon\", rootwrap_config])"},{"line_number":106,"context_line":"                cls._clients[rootwrap_config] \u003d new_client"}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_098faece","line":103,"in_reply_to":"baada198_ae36c84f","updated":"2014-07-29 11:02:57.000000000","message":"To avoid hard dependency on a new oslo.rootwrap version. With old rootwrap all the code will work as long as you don\u0027t turn on use_rootwrap_daemon. With new rootwrap it\u0027ll work in any case.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"49161b3d41376eae487b5e7383e97a09b88c7e95","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return NotImplemented"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1abeadc6_b302663c","line":94,"updated":"2014-08-19 14:16:39.000000000","message":"the class should overload __eq__? If testing type(self) in WrappedProcessHelper.__eq__ is no more required.","commit_id":"533ed14d07eb62d2effb3735767cedc29dea6c62"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"49881d10e1379b9dc2c65fcdcce30afd4c2ed3fd","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self.root_helper + cmd, env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __eq__(self, other):"},{"line_number":87,"context_line":"        if type(self) is WrappedProcessHelper and \\"},{"line_number":88,"context_line":"                type(other) is WrappedProcessHelper:"},{"line_number":89,"context_line":"            return other.root_helper \u003d\u003d self.root_helper"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_b0a082a0","line":87,"updated":"2015-02-03 11:06:11.000000000","message":"if you ever push another patchset can you just consider removing that backslash?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8b22d1c89dd150531919187d36c9f5d8cc8794be","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self.root_helper + cmd, env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __eq__(self, other):"},{"line_number":87,"context_line":"        if type(self) is WrappedProcessHelper and \\"},{"line_number":88,"context_line":"                type(other) is WrappedProcessHelper:"},{"line_number":89,"context_line":"            return other.root_helper \u003d\u003d self.root_helper"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_da217aa0","line":87,"in_reply_to":"da86d52c_9b02b109","updated":"2015-02-03 18:38:24.000000000","message":"possibly because that would return true even if you pass None or Meh as a type.","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"18f37ecdd0aa3dbe427e44865c69dbbcb9470e57","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self.root_helper + cmd, env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __eq__(self, other):"},{"line_number":87,"context_line":"        if type(self) is WrappedProcessHelper and \\"},{"line_number":88,"context_line":"                type(other) is WrappedProcessHelper:"},{"line_number":89,"context_line":"            return other.root_helper \u003d\u003d self.root_helper"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_9b02b109","line":87,"in_reply_to":"da86d52c_b0a082a0","updated":"2015-02-03 16:19:12.000000000","message":"I don\u0027t understand why we need to check self type ... using:\n\n  type(self) \u003d\u003d type(other)\n\nseems more general?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9811346709cf8b5ea32a002cbd957170ea656c70","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self.root_helper + cmd, env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __eq__(self, other):"},{"line_number":87,"context_line":"        if type(self) is WrappedProcessHelper and \\"},{"line_number":88,"context_line":"                type(other) is WrappedProcessHelper:"},{"line_number":89,"context_line":"            return other.root_helper \u003d\u003d self.root_helper"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_fca2b549","line":87,"in_reply_to":"da86d52c_da217aa0","updated":"2015-02-03 22:23:02.000000000","message":"__eq__ methods here are for testing purposes only. We assert here that we can compare only instances of the same type and with same data.","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"27b1683d33c4708b48a21bc13e3f53f3888f1960","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return NotImplemented"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"5a890539_5c418962","line":94,"updated":"2014-12-05 07:08:12.000000000","message":"a comment to say that this doesn\u0027t always use daemon mode (ie. create_process) would be helpful.","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"49881d10e1379b9dc2c65fcdcce30afd4c2ed3fd","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_70f9aa7f","line":96,"updated":"2015-02-03 11:06:11.000000000","message":"are you sure this is eventlet-friendly?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"18f37ecdd0aa3dbe427e44865c69dbbcb9470e57","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_9e51bfda","line":96,"in_reply_to":"da86d52c_70f9aa7f","updated":"2015-02-03 16:19:12.000000000","message":"iirc, eventlet overloads threading.Lock implementation with default config.","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"b6d139625ce930ad0c71d23c35aa28cb5c6d5e57","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_8568de88","line":96,"in_reply_to":"da86d52c_9c653920","updated":"2015-02-08 23:10:28.000000000","message":"there is a patch for moving monkey patching in neutron/ __init__.py - that shoudl address the issue","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8b22d1c89dd150531919187d36c9f5d8cc8794be","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_fa5b9e2b","line":96,"in_reply_to":"da86d52c_9e51bfda","updated":"2015-02-03 18:38:24.000000000","message":"what do you reckon of using lockutlis.lock?","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9811346709cf8b5ea32a002cbd957170ea656c70","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class RootwrapDaemonHelper(WrappedProcessHelper):"},{"line_number":95,"context_line":"    _clients \u003d {}"},{"line_number":96,"context_line":"    _clients_mutex \u003d threading.Lock()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def _get_client(cls, rootwrap_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"da86d52c_9c653920","line":96,"in_reply_to":"da86d52c_fa5b9e2b","updated":"2015-02-03 22:23:02.000000000","message":"It is eventlet-friendly as long as monkey patching happens before import of this module. And monkey patching should be done as early as possible anyway.","commit_id":"20afdeaa9f044b1d00d3a57cb3f2480f74e04aed"}],"neutron/rootwrap/client.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"29666fcf4f7f8598929aed74b0a0d984d1f753c2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        atexit.register(self.shutdown)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _ensure_initialized(self):"},{"line_number":40,"context_line":"        with self._mutex:"},{"line_number":41,"context_line":"            if not self._initialized:"},{"line_number":42,"context_line":"                self._initialize()"},{"line_number":43,"context_line":"                self._initialized \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Tl8%3D","line":40,"updated":"2014-04-07 10:37:37.000000000","message":"suggest double-checked locking, e.g.:\n if not self._initialized:\n   with self._mutex:\n      if not ...","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b4c7e97ac0779c6e30084d1224d3bfd7714e604","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        atexit.register(self.shutdown)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _ensure_initialized(self):"},{"line_number":40,"context_line":"        with self._mutex:"},{"line_number":41,"context_line":"            if not self._initialized:"},{"line_number":42,"context_line":"                self._initialize()"},{"line_number":43,"context_line":"                self._initialized \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Rlk%3D","line":40,"in_reply_to":"AAAAWH%2F9Tl8%3D","updated":"2014-04-07 13:51:45.000000000","message":"I thought of it as of some premature optimization. This logic might already be implemented in Lock itself. Will check that.","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"29666fcf4f7f8598929aed74b0a0d984d1f753c2","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _initialize(self):"},{"line_number":46,"context_line":"        if self._process is not None and self._process.poll() is not None:"},{"line_number":47,"context_line":"            LOG.warning(\"Leaving behind already spawned process with pid %d\","},{"line_number":48,"context_line":"                        self._process.pid)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        process_obj \u003d subprocess.Popen(self._start_command,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Tes%3D","line":47,"updated":"2014-04-07 10:37:37.000000000","message":"it\u0027s a common practice to wrap log msgs with i18n:\n LOG.warning(_(\"...\"))","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b4c7e97ac0779c6e30084d1224d3bfd7714e604","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _initialize(self):"},{"line_number":46,"context_line":"        if self._process is not None and self._process.poll() is not None:"},{"line_number":47,"context_line":"            LOG.warning(\"Leaving behind already spawned process with pid %d\","},{"line_number":48,"context_line":"                        self._process.pid)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        process_obj \u003d subprocess.Popen(self._start_command,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Rkc%3D","line":47,"in_reply_to":"AAAAWH%2F9Tes%3D","updated":"2014-04-07 13:51:45.000000000","message":"rootwrap package here is copied from the latest version of oslo.rootwrap change request at https://review.openstack.org/81798 . There\u0027s no internationalization there.","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"004fa742793a883ec8f2da5e0a08522e1d2f8667","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self._process \u003d None"},{"line_number":37,"context_line":"        atexit.register(self.shutdown)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _ensure_initialized(self):"},{"line_number":40,"context_line":"        with self._mutex:"},{"line_number":41,"context_line":"            if not self._initialized:"},{"line_number":42,"context_line":"                self._initialize()"}],"source_content_type":"text/x-python","patch_set":21,"id":"7adec928_2502cd0b","line":39,"updated":"2014-05-20 20:31:58.000000000","message":"same performance remark:\n\n  if not self._initialized:\n    with self._mutex:\n       if not self._initialized:\n         ..","commit_id":"a6076898916a915425d90df3be75c79769171ec1"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2e9293e9e235a4755b93822cf0d44f3409f16235","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self._process \u003d None"},{"line_number":37,"context_line":"        atexit.register(self.shutdown)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _ensure_initialized(self):"},{"line_number":40,"context_line":"        with self._mutex:"},{"line_number":41,"context_line":"            if not self._initialized:"},{"line_number":42,"context_line":"                self._initialize()"}],"source_content_type":"text/x-python","patch_set":21,"id":"7adec928_af25d35d","line":39,"in_reply_to":"7adec928_2502cd0b","updated":"2014-05-21 04:17:09.000000000","message":"The same response: I thought about it and decided to avoid premature optimization - locking is nothing compared to process spawning. Although here it won\u0027t make code as messy as in previous case.","commit_id":"a6076898916a915425d90df3be75c79769171ec1"}],"neutron/rootwrap/daemon.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"29666fcf4f7f8598929aed74b0a0d984d1f753c2","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        with nonblocking():"},{"line_number":54,"context_line":"            return connection.XmlClient(*args, **kwargs)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    managers.listener_client[\u0027xmlrpclib\u0027] \u003d XmlListener, XmlClient"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class RootwrapClass(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9TeQ%3D","line":56,"updated":"2014-04-07 10:37:37.000000000","message":"why xml and not json?","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b4c7e97ac0779c6e30084d1224d3bfd7714e604","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        with nonblocking():"},{"line_number":54,"context_line":"            return connection.XmlClient(*args, **kwargs)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    managers.listener_client[\u0027xmlrpclib\u0027] \u003d XmlListener, XmlClient"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class RootwrapClass(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9RjU%3D","line":56,"in_reply_to":"AAAAWH%2F9TeQ%3D","updated":"2014-04-07 13:51:45.000000000","message":"xmlrpclib is supported by multiprocessing while JSON RPC isn\u0027t.","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"}],"neutron/rootwrap/filters.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"29666fcf4f7f8598929aed74b0a0d984d1f753c2","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_exec(self, exec_dirs\u003d[]):"},{"line_number":31,"context_line":"        \"\"\"Returns existing executable, or empty string if none found.\"\"\""},{"line_number":32,"context_line":"        if self.real_exec is not None:"},{"line_number":33,"context_line":"            return self.real_exec"},{"line_number":34,"context_line":"        self.real_exec \u003d \"\""},{"line_number":35,"context_line":"        if os.path.isabs(self.exec_path):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9TQg%3D","line":32,"updated":"2014-04-07 10:37:37.000000000","message":"nit: if self.real_exec:","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b4c7e97ac0779c6e30084d1224d3bfd7714e604","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_exec(self, exec_dirs\u003d[]):"},{"line_number":31,"context_line":"        \"\"\"Returns existing executable, or empty string if none found.\"\"\""},{"line_number":32,"context_line":"        if self.real_exec is not None:"},{"line_number":33,"context_line":"            return self.real_exec"},{"line_number":34,"context_line":"        self.real_exec \u003d \"\""},{"line_number":35,"context_line":"        if os.path.isabs(self.exec_path):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9Rio%3D","line":32,"in_reply_to":"AAAAWH%2F9TQg%3D","updated":"2014-04-07 13:51:45.000000000","message":"That\u0027s some old code from oslo.rootwrap.","commit_id":"f126fd08b576b6a82c0ec77fb8145f257a9e4478"}],"neutron/tests/unit/test_agent_config.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"041b5e477b877519e56959cf9f64b0278997ac09","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def test_agent_root_helper(self):"},{"line_number":34,"context_line":"        self.conf.set_override(\u0027root_helper\u0027, \u0027my_root_helper\u0027, \u0027AGENT\u0027)"},{"line_number":35,"context_line":"        self.conf.set_override(\u0027use_rootwrap_daemon\u0027, False, \u0027AGENT\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(config.get_root_helper(self.conf),"},{"line_number":37,"context_line":"                         utils.WrappedProcessHelper(\u0027my_root_helper\u0027))"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_8e7f44df","line":35,"updated":"2014-07-29 10:20:26.000000000","message":"If that\u0027s default, why bothering?","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df12b53022363fcfbddb3dde0acc2208398c9ef1","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def test_agent_root_helper(self):"},{"line_number":34,"context_line":"        self.conf.set_override(\u0027root_helper\u0027, \u0027my_root_helper\u0027, \u0027AGENT\u0027)"},{"line_number":35,"context_line":"        self.conf.set_override(\u0027use_rootwrap_daemon\u0027, False, \u0027AGENT\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(config.get_root_helper(self.conf),"},{"line_number":37,"context_line":"                         utils.WrappedProcessHelper(\u0027my_root_helper\u0027))"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_846ac3b3","line":35,"in_reply_to":"baada198_6964aa21","updated":"2014-07-29 11:08:13.000000000","message":"Fair.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9451702eb11c0a07040800bee9be59d54da58a62","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def test_agent_root_helper(self):"},{"line_number":34,"context_line":"        self.conf.set_override(\u0027root_helper\u0027, \u0027my_root_helper\u0027, \u0027AGENT\u0027)"},{"line_number":35,"context_line":"        self.conf.set_override(\u0027use_rootwrap_daemon\u0027, False, \u0027AGENT\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(config.get_root_helper(self.conf),"},{"line_number":37,"context_line":"                         utils.WrappedProcessHelper(\u0027my_root_helper\u0027))"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baada198_6964aa21","line":35,"in_reply_to":"baada198_8e7f44df","updated":"2014-07-29 11:02:57.000000000","message":"Defaults can change, tests are to stay. I\u0027m testing get_root_helper method, so I don\u0027t want test to depend on defaults set in a whole other module.","commit_id":"cb697748c522b1781bded9c62dd168a19b591503"}]}
