)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e121789d8de69bc90df9df2abc9c81f2777e5a4d","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one of memcahced server is rebooted, all tokens it holds"},{"line_number":10,"context_line":"are lost. In that case, admin token, that neutronclient holds become invalid."},{"line_number":11,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":12,"context_line":"make attempt to get new token from keystone in case of 401 errors."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_d4bf63a8","line":9,"updated":"2015-09-03 15:51:53.000000000","message":"I think that it should be rephrased. It should be something like \"when memcache is used as token backend with multiple hosts and a one of memcache nodes gets rebooted...\"","commit_id":"1fd2d558bfc8dbbb967cba969d19a3e1f5ff332b"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"9efc01a2ca1d01931011eff0f260d8e8dd9e70ce","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one of memcahced server is rebooted, all tokens it holds"},{"line_number":10,"context_line":"are lost. In that case, admin token, that neutronclient holds become invalid."},{"line_number":11,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":12,"context_line":"make attempt to get new token from keystone in case of 401 errors."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_b73431de","line":9,"in_reply_to":"da20952f_5447d376","updated":"2015-09-03 16:01:24.000000000","message":"OK, I agree. Just mention please that memcache should is used as token backend in keystone, not in nova :)","commit_id":"1fd2d558bfc8dbbb967cba969d19a3e1f5ff332b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"8744871e278eed56cb7b95e770e8b0fb1d664541","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one of memcahced server is rebooted, all tokens it holds"},{"line_number":10,"context_line":"are lost. In that case, admin token, that neutronclient holds become invalid."},{"line_number":11,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":12,"context_line":"make attempt to get new token from keystone in case of 401 errors."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_6ad0ec53","line":9,"in_reply_to":"da20952f_b73431de","updated":"2015-09-03 16:25:12.000000000","message":"Done","commit_id":"1fd2d558bfc8dbbb967cba969d19a3e1f5ff332b"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"50336e5384365f8a43f2d4524a97b14cffe68ad3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one of memcahced server is rebooted, all tokens it holds"},{"line_number":10,"context_line":"are lost. In that case, admin token, that neutronclient holds become invalid."},{"line_number":11,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":12,"context_line":"make attempt to get new token from keystone in case of 401 errors."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_b4f2ef98","line":9,"in_reply_to":"da20952f_d4bf63a8","updated":"2015-09-03 15:52:47.000000000","message":"*as token persistence backend in keystone","commit_id":"1fd2d558bfc8dbbb967cba969d19a3e1f5ff332b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"74a62a980fd001f3de277254eabd400bb5cf9957","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one of memcahced server is rebooted, all tokens it holds"},{"line_number":10,"context_line":"are lost. In that case, admin token, that neutronclient holds become invalid."},{"line_number":11,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":12,"context_line":"make attempt to get new token from keystone in case of 401 errors."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_5447d376","line":9,"in_reply_to":"da20952f_d4bf63a8","updated":"2015-09-03 15:58:05.000000000","message":"hm, I belive one node would be enough to reproduce this. multiple hosts just changed hit chance.","commit_id":"1fd2d558bfc8dbbb967cba969d19a3e1f5ff332b"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"4a44fb7f30a44faf0835fc3c9f43c6d3a9baec37","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If keystone uses memcached as token backend, and memcached service "},{"line_number":10,"context_line":"is rebooted, all tokens it holds are lost. In that case, admin token, "},{"line_number":11,"context_line":"that neutronclient holds become invalid."},{"line_number":12,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_034c9fc6","line":9,"updated":"2015-09-04 09:39:42.000000000","message":"keystone using memcache as a backend is kind of a bad idea.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"d42f4ec6538fabb7e81b1974b9bab892afadfa29","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change auth_plugin for neutron_client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If keystone uses memcached as token backend, and memcached service "},{"line_number":10,"context_line":"is rebooted, all tokens it holds are lost. In that case, admin token, "},{"line_number":11,"context_line":"that neutronclient holds become invalid."},{"line_number":12,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_68bc1ddc","line":9,"in_reply_to":"da20952f_034c9fc6","updated":"2015-09-07 01:30:35.000000000","message":"I think \u0027and memcached service\u0027 \u003d\u003e \u0027when memcached service\u0027 should be more understandable.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3514867f6ce831a39460522d474dd5e657785938","unresolved":false,"context_lines":[{"line_number":11,"context_line":"that neutronclient holds become invalid."},{"line_number":12,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":13,"context_line":"make attempt to get new token from keystone in case of 401 errors."},{"line_number":14,"context_line":"To fix this identity.v2.Password is now used by neutronclient."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-bug: #1491905"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_a3adb39c","line":14,"updated":"2015-09-04 09:38:41.000000000","message":"it\u0027s not necessarily the v2.Password plugin - ideally it\u0027s something else.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"b3128644e62b73909904efbc2f6780adcb9e15bd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"that neutronclient holds become invalid."},{"line_number":12,"context_line":"token_endpoint.Token plugin, that was used by nova, doesn\u0027t"},{"line_number":13,"context_line":"make attempt to get new token from keystone in case of 401 errors."},{"line_number":14,"context_line":"To fix this identity.v2.Password is now used by neutronclient."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-bug: #1491905"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_39d31406","line":14,"in_reply_to":"da20952f_a3adb39c","updated":"2015-09-04 10:33:26.000000000","message":"As a default implementation I mean:) Nova has functionality to specify auth_plugin for neutron over conf","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"289fb93e1fafeb0ef8605366a48f760851b14ccc","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    global _ADMIN_AUTH"},{"line_number":155,"context_line":"    global _SESSION"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    _ADMIN_AUTH.auth_plugin \u003d None"},{"line_number":158,"context_line":"    _SESSION \u003d None"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_2970bda3","line":157,"range":{"start_line":157,"start_character":4,"end_line":157,"end_character":15},"updated":"2015-09-03 18:21:11.000000000","message":"So, reset_state() is for clearing everything, not just auth_plugin for this specific thread. Right? Shouldn\u0027t we be setting _ADMIN_AUTH to a fresh ThreadLocalAuthPlugin()? If we do that then we still won\u0027t need 219/220 below.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"b757d158223bb88e06c2c154f036efe3022c8b98","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    global _ADMIN_AUTH"},{"line_number":155,"context_line":"    global _SESSION"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    _ADMIN_AUTH.auth_plugin \u003d None"},{"line_number":158,"context_line":"    _SESSION \u003d None"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_cc4caf44","line":157,"in_reply_to":"da20952f_2970bda3","updated":"2015-09-03 18:41:50.000000000","message":"it\u0027s a good question:) in fact there is no reset_state usage in code, except unittests, at least i haven\u0027t found it. as for me reset_state should be thread specific op for plugin.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3514867f6ce831a39460522d474dd5e657785938","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    raise neutron_client_exc.Unauthorized(message\u003derr_msg)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class ThreadLocalAuthPlugin(threading.local):"},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        super(ThreadLocalAuthPlugin, self).__init__()"},{"line_number":193,"context_line":"        self.auth_plugin \u003d _load_auth_plugin(CONF)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_437e171a","line":190,"updated":"2015-09-04 09:38:41.000000000","message":"does this need an object all of it\u0027s own? does this normally work by setting\n\nthreading.local.auth_plugin \u003d value","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"b3128644e62b73909904efbc2f6780adcb9e15bd","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    raise neutron_client_exc.Unauthorized(message\u003derr_msg)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class ThreadLocalAuthPlugin(threading.local):"},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        super(ThreadLocalAuthPlugin, self).__init__()"},{"line_number":193,"context_line":"        self.auth_plugin \u003d _load_auth_plugin(CONF)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_d9bc58bd","line":190,"in_reply_to":"da20952f_161b7fcb","updated":"2015-09-04 10:33:26.000000000","message":"Thank you for comments. initialisation of auth_plugin here won\u0027t work the same way,as subclass is. We have to change logic in line 220 with try/except(see https://pymotw.com/2/threading/). I\u0027d prefer to leave this subclass","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"3e5017cf13fa19e7785bf1c505bb9fe5b5945cf2","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    raise neutron_client_exc.Unauthorized(message\u003derr_msg)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class ThreadLocalAuthPlugin(threading.local):"},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        super(ThreadLocalAuthPlugin, self).__init__()"},{"line_number":193,"context_line":"        self.auth_plugin \u003d _load_auth_plugin(CONF)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_161b7fcb","line":190,"in_reply_to":"da20952f_437e171a","updated":"2015-09-04 10:07:11.000000000","message":"Then it should be:\n\n  _ADMIN_AUTH \u003d threading.local()\n  _ADMIN_AUTH.auth_plugin \u003d _load_auth_plugin(CONF)\n\nif local() is not initialised, the data will be shared between threads AFAIR.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"cb0ab3805e82b8109fddae935fcae300061e4083","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # reauthentication. We then use the static token plugin to issue the"},{"line_number":218,"context_line":"        # actual request with that current token in a thread safe way."},{"line_number":219,"context_line":"        if _ADMIN_AUTH.auth_plugin is None:"},{"line_number":220,"context_line":"            _ADMIN_AUTH.auth_plugin \u003d _load_auth_plugin(CONF)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        auth_plugin \u003d _ADMIN_AUTH.auth_plugin"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_08e37806","line":220,"updated":"2015-09-03 17:04:34.000000000","message":"Do we really need this? Isn\u0027t this loaded already in line 193?","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"dd5bd78821044ae110a6607b745d92e7c0803e40","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # reauthentication. We then use the static token plugin to issue the"},{"line_number":218,"context_line":"        # actual request with that current token in a thread safe way."},{"line_number":219,"context_line":"        if _ADMIN_AUTH.auth_plugin is None:"},{"line_number":220,"context_line":"            _ADMIN_AUTH.auth_plugin \u003d _load_auth_plugin(CONF)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        auth_plugin \u003d _ADMIN_AUTH.auth_plugin"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_b9b98017","line":220,"in_reply_to":"da20952f_08e37806","updated":"2015-09-03 18:01:36.000000000","message":"Yes, we do. See reset_state at line 157.","commit_id":"e8937fdd06c1aee526dd36a9320f5cf34a886079"}]}
