)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix memcache issue due to the __new__ attribute reassign."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Switch from python-memcached to pymemcache."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This is avoid problems due to threading.local and attribute"},{"line_number":12,"context_line":"override since pymemcache remove this kind of stuffs."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"9fdfeff1_407a0124","line":9,"updated":"2019-02-27 16:14:55.000000000","message":"I think I\u0027d prefer this to be the first line of the commit message. While this does fix the __new__ problem, it\u0027s also a much larger change than that. If I\u0027m looking through commit messages for this change I\u0027d expect to see this, not the __new__ part.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"022f09621d818e65afdc68e50171982ce530b0d2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Hervé Beraud \u003chberaud@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-03-12 14:22:11 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Switch from python-memcached to pymemcache."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix memcache issue due to the __new__ attribute reassign."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"5fc1f717_7cd28002","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":43},"updated":"2019-03-12 16:01:28.000000000","message":"This is nit-picky, but important, please communicate this is for the memcache-pool only. We are not changing non-pool uses over to pymemcache.","commit_id":"2021353398155e2101907e4697d4a7dc45323aa0"}],"oslo_cache/_memcache_pool.py":[{"author":{"_account_id":20172,"name":"Michele Baldessari","email":"michele@acksyn.org","username":"michele"},"change_message_id":"9aa276747a653a8e8ae6630f6614ccc805e0221a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    As client is inherited from threading.local we have to restore object"},{"line_number":43,"context_line":"    methods overloaded by threading.local so we can reuse clients in"},{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    __delattr__ \u003d object.__delattr__"},{"line_number":47,"context_line":"    __getattribute__ \u003d object.__getattribute__"},{"line_number":48,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _new__(cls, *args, **kwargs):"},{"line_number":51,"context_line":"        return object.__new__(cls)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_50c94156","line":48,"range":{"start_line":45,"start_character":3,"end_line":48,"end_character":36},"updated":"2019-02-01 17:48:33.000000000","message":"Should we override these with proper def calls as well?","commit_id":"1af30bbea0a24da52ac9f993db434bc5e5dfced4"},{"author":{"_account_id":20172,"name":"Michele Baldessari","email":"michele@acksyn.org","username":"michele"},"change_message_id":"9aa276747a653a8e8ae6630f6614ccc805e0221a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    __getattribute__ \u003d object.__getattribute__"},{"line_number":48,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _new__(cls, *args, **kwargs):"},{"line_number":51,"context_line":"        return object.__new__(cls)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __del__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b0baedbd","line":50,"range":{"start_line":50,"start_character":1,"end_line":50,"end_character":16},"updated":"2019-02-01 17:48:33.000000000","message":"typo, missing _ at the beginning? Likely it worked in my tests because we removed the offending code, but it probably does not behave as expected (i.e. the overload did not kick in appropriately)","commit_id":"1af30bbea0a24da52ac9f993db434bc5e5dfced4"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"851884568757967482d5b676dfe84169a200d12c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    __getattribute__ \u003d object.__getattribute__"},{"line_number":48,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _new__(cls, *args, **kwargs):"},{"line_number":51,"context_line":"        return object.__new__(cls)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __del__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_347ca870","line":50,"range":{"start_line":50,"start_character":1,"end_line":50,"end_character":16},"in_reply_to":"9fdfeff1_b0baedbd","updated":"2019-02-02 11:39:55.000000000","message":"I have retest on my env with the typo fixed and it work","commit_id":"1af30bbea0a24da52ac9f993db434bc5e5dfced4"},{"author":{"_account_id":20172,"name":"Michele Baldessari","email":"michele@acksyn.org","username":"michele"},"change_message_id":"f132cd97eb5bb730be0af951d544564fdae19515","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    methods overloaded by threading.local so we can reuse clients in"},{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return object.__delattr__(self)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return object.__getattribute__(self)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_7d9a0c14","line":56,"range":{"start_line":46,"start_character":0,"end_line":56,"end_character":34},"updated":"2019-02-04 07:57:59.000000000","message":"Should we pass down all those *args + **kwargs to the object class while we\u0027re at it?","commit_id":"71783604de02e9e7bd19a59643de15eb16df58e2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"763eaf7a125f620146a94e6bd77f449fee375bd0","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    methods overloaded by threading.local so we can reuse clients in"},{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return object.__delattr__(self, *args, **kwargs)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return object.__getattribute__(self, *args, **kwargs)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_fed7cd4e","line":53,"range":{"start_line":46,"start_character":0,"end_line":53,"end_character":56},"updated":"2019-02-04 16:24:11.000000000","message":"I think we should not touch this part of code and stay focus on the error which is related to __new__ [0].\n\n[0] https://hg.python.org/cpython/file/3.6/Objects/typeobject.c#l3468","commit_id":"9e971f5023635c51fc996f96562a401a31830dfa"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"763eaf7a125f620146a94e6bd77f449fee375bd0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_5e5e19ea","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":51},"updated":"2019-02-04 16:24:11.000000000","message":"Yes I discussed with Victor Stinner, He also suggested to me that to not use assignment. But as Corey said that does not look to fix the problem.\n\nI think we should take the problem in the opposite way, why are we trying to rewrite this function?","commit_id":"9e971f5023635c51fc996f96562a401a31830dfa"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"a18ae49da452e982db1fcb34f91386dff52cf78c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_644b505f","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":51},"in_reply_to":"9fdfeff1_091dbd0e","updated":"2019-02-04 17:30:41.000000000","message":"It\u0027s not really clear, it\u0027s not because you are doing inheritance that you need to rewrite methods. Or Please can you point me why we should do that for __new__ when a class inherits from threads.local?\n\nAlso as suggested, don\u0027t you think we should keep this change small and avoid to touch the other methods. Just __new__ is in case right now.\n\nIn my sense, I would prefer we just remove that thing until we found a real cause to add it. Does that make sense?","commit_id":"9e971f5023635c51fc996f96562a401a31830dfa"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"35586567784cc690c8d5bfc2a8f331c99e83334a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_091dbd0e","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":51},"in_reply_to":"9fdfeff1_5e5e19ea","updated":"2019-02-04 16:59:58.000000000","message":"Seems to be rewrited due to the fact that memcache.client was inherited from threading.local.\n\nhttps://github.com/linsomniac/python-memcached/blob/master/memcache.py#L109\n\nUsing super doesn\u0027t work:\nhttps://thingspython.wordpress.com/2010/09/27/another-super-wrinkle-raising-typeerror/\nhttp://thomas-cokelaer.info/blog/2011/09/382/\n\nMy last patch seems to avoid all issues (IRL use case and the Corey sample).","commit_id":"9e971f5023635c51fc996f96562a401a31830dfa"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f1eb682ff958c4b39be24e2e940574e4db0f250","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return object.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return object.__new__(cls, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_8492f44a","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":51},"in_reply_to":"9fdfeff1_644b505f","updated":"2019-02-04 17:49:46.000000000","message":"With memcache 1.54 memcache.Client calls super() in __init__() so inheritance has to be preserved in order not to overwrite entire memcache.Client.\n\nYep we can keep this change focused on __new__ but I would appreciate to have opinions from @bnemec and oslo team on this topic before remove it.\n\nI don\u0027t think that remove __new__ is really a good idea since we already had issue when this override wasn\u0027t implemented...","commit_id":"9e971f5023635c51fc996f96562a401a31830dfa"},{"author":{"_account_id":11805,"name":"Corey Bryant","email":"corey.bryant@canonical.com","username":"coreycb"},"change_message_id":"30433b4d3972ab60fe2ca1c90050335273015c33","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return memcache.Client.__delattr__(self, *args, **kwargs)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return memcache.Client.__getattribute__(self, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_a9d8311e","line":47,"updated":"2019-02-04 17:20:59.000000000","message":"For my own education, what makes this behave different from not overriding memcache.Client.__delattr__() at all? Similar comment for everything else other than __del__().","commit_id":"67d64522b7d94db94000eef3016d9aac6a384ab9"},{"author":{"_account_id":11805,"name":"Corey Bryant","email":"corey.bryant@canonical.com","username":"coreycb"},"change_message_id":"129d2f54968265f62496b673cbc6b013e717a233","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return memcache.Client.__delattr__(self, *args, **kwargs)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return memcache.Client.__getattribute__(self, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_7893f001","line":47,"in_reply_to":"9fdfeff1_189e6454","updated":"2019-02-04 18:43:24.000000000","message":"Thanks for the explanation. I\u0027m still confused about the current patch but I think, like you said, you\u0027ll want oslo core reviewer input. Happy to remove my -1 if one of the core\u0027s is good with your patch.","commit_id":"67d64522b7d94db94000eef3016d9aac6a384ab9"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8090bc9d6b222432334bc4a8ebff949f7d2b051a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return memcache.Client.__delattr__(self, *args, **kwargs)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return memcache.Client.__getattribute__(self, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_189e6454","line":47,"in_reply_to":"9fdfeff1_a9d8311e","updated":"2019-02-04 18:26:03.000000000","message":"History of this part of code:\nThe original code come from changes applied in python-memcached (1.54) who introduced a call to super in the __init__ of the memcache.Client, but this class inherit from threading.local and at start they try to remove the original parents (threading.local) from the inheritance hierarchy but doesn\u0027t work due to the usage of super in __init__.\n\nThreading.local define the following attributes:\n* __new__\n* __getattribute__\n* __setattr__\n* __delattr__\n\nSo I suppose if we facing issues with __new__ we potentially can facing others issues with the other methods too, so I think we need to redefine them properly.\n\n__del__ was not defined by threading.local and I\u0027m not sure why this special case was introduced...\n\nhttps://review.openstack.org/#/c/170835/3/keystone/common/cache/_memcache_pool.py\n\nI hope these elements can help us to more understand if we need to keep override all these methods.","commit_id":"67d64522b7d94db94000eef3016d9aac6a384ab9"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"a7bdeab4f3049f65cf1994e546f9c5109aaebd0a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"class _MemcacheClient(memcache.Client):"},{"line_number":40,"context_line":"    \"\"\"Thread global memcache client"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    As client is inherited from threading.local we have to restore object"},{"line_number":43,"context_line":"    methods overloaded by threading.local so we can reuse clients in"},{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return memcache.Client.__delattr__(self, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_7a511bd9","line":44,"range":{"start_line":42,"start_character":4,"end_line":44,"end_character":21},"updated":"2019-02-12 17:11:49.000000000","message":"This comment suggests we would break use of the client in multiple threads with this change.","commit_id":"534343b146e9ebd4dd1f6111297e13d92704290b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"a7bdeab4f3049f65cf1994e546f9c5109aaebd0a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    methods overloaded by threading.local so we can reuse clients in"},{"line_number":44,"context_line":"    different threads"},{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __delattr__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        return memcache.Client.__delattr__(self, *args, **kwargs)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __getattribute__(self, *args, **kwargs):"},{"line_number":50,"context_line":"        return memcache.Client.__getattribute__(self, *args, **kwargs)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __setattr__(self, *args, **kwargs):"},{"line_number":53,"context_line":"        return memcache.Client.__setattr__(self, *args, **kwargs)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":56,"context_line":"        return memcache.Client.__new__(cls, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __del__(self):"},{"line_number":59,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_ba746369","line":56,"range":{"start_line":46,"start_character":4,"end_line":56,"end_character":60},"updated":"2019-02-12 17:11:49.000000000","message":"These are now noops, unless I\u0027m missing something. Removing the overrides completely would accomplish the same thing.","commit_id":"534343b146e9ebd4dd1f6111297e13d92704290b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"7bf0d34675cf880bc6ba2cd9f93e962569d8d66a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Thread-safe connection pool for python-memcached.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# NOTE(yorik-sar): this file is copied between keystone and keystonemiddleware"},{"line_number":19,"context_line":"# and should be kept in sync until we can use external library for this."}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_ecaf677a","line":16,"range":{"start_line":16,"start_character":35,"end_line":16,"end_character":51},"updated":"2019-02-14 16:11:06.000000000","message":"Should also be updated.","commit_id":"96b52c146550efbc726ea47a1b16c0dc9602ce8b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import time"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from oslo_log import log"},{"line_number":28,"context_line":"from pymemcache.client.hash import HashClient"},{"line_number":29,"context_line":"from six.moves import queue"},{"line_number":30,"context_line":"from six.moves import zip"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_60adc582","line":28,"updated":"2019-02-27 16:14:55.000000000","message":"Hacking guidelines say to import only modules. So:\n\nfrom pymemcache.client import hash.\n\nThen use hash.HashClient below.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _format_urls(self):"},{"line_number":190,"context_line":"        urls_ports \u003d []"},{"line_number":191,"context_line":"        for el in self.urls:"},{"line_number":192,"context_line":"            try:"},{"line_number":193,"context_line":"                protocole, url, port \u003d el.split(\":\")"},{"line_number":194,"context_line":"                urls_ports.append((\"{}:{}\".format(protocole, url), int(port)))"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_00ecf9b8","line":191,"range":{"start_line":191,"start_character":12,"end_line":191,"end_character":14},"updated":"2019-02-27 16:14:55.000000000","message":"Nit: I would have probably called this url, given that we\u0027re iterating a list called urls.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        urls_ports \u003d []"},{"line_number":191,"context_line":"        for el in self.urls:"},{"line_number":192,"context_line":"            try:"},{"line_number":193,"context_line":"                protocole, url, port \u003d el.split(\":\")"},{"line_number":194,"context_line":"                urls_ports.append((\"{}:{}\".format(protocole, url), int(port)))"},{"line_number":195,"context_line":"            except ValueError:"},{"line_number":196,"context_line":"                urls_ports.append((el, 11211))"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_a0ef2d85","line":193,"range":{"start_line":193,"start_character":27,"end_line":193,"end_character":30},"updated":"2019-02-27 16:14:55.000000000","message":"I suppose this is why you didn\u0027t call the loop variable url.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        urls_ports \u003d []"},{"line_number":191,"context_line":"        for el in self.urls:"},{"line_number":192,"context_line":"            try:"},{"line_number":193,"context_line":"                protocole, url, port \u003d el.split(\":\")"},{"line_number":194,"context_line":"                urls_ports.append((\"{}:{}\".format(protocole, url), int(port)))"},{"line_number":195,"context_line":"            except ValueError:"},{"line_number":196,"context_line":"                urls_ports.append((el, 11211))"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_004159a6","line":193,"range":{"start_line":193,"start_character":16,"end_line":193,"end_character":25},"updated":"2019-02-27 16:14:55.000000000","message":"Nit: *protocol\n\nAlso, note that you could avoid having to reassemble the protocol and url parts by using rsplit with a maxsplit of 1. This looks fine, it would just be slightly simpler code.\n\nEdit: Oh, maybe that wouldn\u0027t be simpler. Looking at the unit tests I see we\u0027d have issues with the http://url case where no port is specified, so we\u0027d have to have logic for that anyway.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"287f28133da71c0ecce00a016881ca27c8f65528","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        # the host is not dead."},{"line_number":187,"context_line":"        self._hosts_deaduntil \u003d [0] * len(urls)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _format_urls(self):"},{"line_number":190,"context_line":"        urls_ports \u003d []"},{"line_number":191,"context_line":"        for el in self.urls:"},{"line_number":192,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":33,"id":"5fc1f717_24c99b77","line":189,"updated":"2019-03-07 10:11:57.000000000","message":"What about to call this in __init__() to avoid unnecessary compute for each creation of new connection.","commit_id":"55e98ad993cb92dcbee90a6843820d15ab276e75"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"287f28133da71c0ecce00a016881ca27c8f65528","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        urls_ports \u003d []"},{"line_number":191,"context_line":"        for el in self.urls:"},{"line_number":192,"context_line":"            try:"},{"line_number":193,"context_line":"                protocol, url, port \u003d el.split(\":\")"},{"line_number":194,"context_line":"                urls_ports.append((\"{}:{}\".format(protocol, url), int(port)))"},{"line_number":195,"context_line":"            except ValueError:"},{"line_number":196,"context_line":"                urls_ports.append((el, 11211))"}],"source_content_type":"text/x-python","patch_set":33,"id":"5fc1f717_2402fbb5","line":193,"updated":"2019-03-07 10:11:57.000000000","message":"I recommend you to use urllib.parse here, this is going to break if an ipv6 is passed.","commit_id":"55e98ad993cb92dcbee90a6843820d15ab276e75"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"287f28133da71c0ecce00a016881ca27c8f65528","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                protocol, url, port \u003d el.split(\":\")"},{"line_number":194,"context_line":"                urls_ports.append((\"{}:{}\".format(protocol, url), int(port)))"},{"line_number":195,"context_line":"            except ValueError:"},{"line_number":196,"context_line":"                urls_ports.append((el, 11211))"},{"line_number":197,"context_line":"        return urls_ports"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _create_connection(self):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5fc1f717_a4dcab46","line":196,"range":{"start_line":196,"start_character":38,"end_line":196,"end_character":44},"updated":"2019-03-07 10:11:57.000000000","message":"This should probably be in a \"constant\" , something like: DEFAULT_MEMCACHEPORT. Also I would recommend to log a warning to indicate to operators the fact that you try to guess the port.","commit_id":"55e98ad993cb92dcbee90a6843820d15ab276e75"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"287f28133da71c0ecce00a016881ca27c8f65528","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        return urls_ports"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _create_connection(self):"},{"line_number":200,"context_line":"        return pymemcache_hash.HashClient(self._format_urls(),"},{"line_number":201,"context_line":"                                          **self._arguments)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":204,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":33,"id":"5fc1f717_e4d15359","line":201,"range":{"start_line":200,"start_character":0,"end_line":201,"end_character":60},"updated":"2019-03-07 10:11:57.000000000","message":"nit: don\u0027t think you need two lines for this.","commit_id":"55e98ad993cb92dcbee90a6843820d15ab276e75"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"0c9f83b121f615b4ccd7a95fc7a3331612084e9a","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        for url in urls:"},{"line_number":195,"context_line":"            parsed \u003d urlparse(url)"},{"line_number":196,"context_line":"            url \u003d url.replace(\":{port}\".format(port\u003dparsed.port), \"\")"},{"line_number":197,"context_line":"            port \u003d int(parsed.port) if parsed.port else DEFAULT_MEMCACHEPORT"},{"line_number":198,"context_line":"            self.urls.append((url, port))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def _create_connection(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"5fc1f717_c93e548a","line":197,"updated":"2019-03-12 15:20:45.000000000","message":"I would have added that log if we fallback to DEFAULT_MEMCHAEPORT but I guess it\u0027s fine since it\u0027s to use the real default one used by memached.","commit_id":"2021353398155e2101907e4697d4a7dc45323aa0"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"42eae7acc68790073fe6ee568c88926b7c529a9e","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            if not parsed.port:"},{"line_number":197,"context_line":"                port \u003d DEFAULT_MEMCACHEPORT"},{"line_number":198,"context_line":"                self._trace_logger("},{"line_number":199,"context_line":"                    \"Using port (11211) with {url}\".format(url\u003durl)"},{"line_number":200,"context_line":"                )"},{"line_number":201,"context_line":"            else:"},{"line_number":202,"context_line":"                # NOTE(hberaud) removing port information from url to avoid"}],"source_content_type":"text/x-python","patch_set":38,"id":"5fc1f717_037c2770","line":199,"range":{"start_line":199,"start_character":20,"end_line":199,"end_character":67},"updated":"2019-03-13 12:34:15.000000000","message":"nit: \"Using port ({port}) with {url}\".format(url\u003durl, port\u003dDEFAULT_MEMCACHEPORT)","commit_id":"a6d0e94d9f68701743bf968bf148dfe4b0c3076e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"42eae7acc68790073fe6ee568c88926b7c529a9e","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            else:"},{"line_number":202,"context_line":"                # NOTE(hberaud) removing port information from url to avoid"},{"line_number":203,"context_line":"                # pymemcache to concat twice. Don\u0027t use string replace to avoid"},{"line_number":204,"context_line":"                # ipv6 format override. Some port values can already be used"},{"line_number":205,"context_line":"                # inside the ipv6 format and we don\u0027t want to replace them."},{"line_number":206,"context_line":"                # (example: https://[2620:52:0:13b8:8080:ff:fe3e:1]:8080)"},{"line_number":207,"context_line":"                port_info \u003d len(str(parsed.port)) + 1"},{"line_number":208,"context_line":"                url \u003d url[:-port_info]"}],"source_content_type":"text/x-python","patch_set":38,"id":"5fc1f717_fe3892ee","line":205,"range":{"start_line":204,"start_character":40,"end_line":205,"end_character":73},"updated":"2019-03-13 12:34:15.000000000","message":"Good catch!","commit_id":"a6d0e94d9f68701743bf968bf148dfe4b0c3076e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"211d01ee9e821a058cb3734b317fab10b5639bfd","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            self.urls.append((url, int(port)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _create_connection(self):"},{"line_number":217,"context_line":"        return pymemcache_hash.HashClient(self.urls, **self._arguments)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":220,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_38c3e68c","line":217,"range":{"start_line":217,"start_character":53,"end_line":217,"end_character":70},"updated":"2019-11-12 22:14:24.000000000","message":"In my case, it looks like this is passing through ``socket_timeout``, which isn\u0027t accepted by the HashClient object? \n\nhttps://github.com/pinterest/pymemcache/blob/master/pymemcache/client/hash.py#L18-L40","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"6f2160ac8bfa7dc98cdbbc50eedffb28f160f73d","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            self.urls.append((url, int(port)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _create_connection(self):"},{"line_number":217,"context_line":"        return pymemcache_hash.HashClient(self.urls, **self._arguments)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":220,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_39a2fefd","line":217,"range":{"start_line":217,"start_character":53,"end_line":217,"end_character":70},"in_reply_to":"3fa7e38b_38c3e68c","updated":"2019-11-13 15:48:53.000000000","message":"The HashClient is based [1] on the base Client [2] and PooledClient [3], and they all accept a socket timeout through the `connection_timeout` [4].\n\nThe help message of this one say:\n\u003e Defaults set to \"forever\" (uses the underlying default \n\u003e socket timeout, which can be very long).\n\nMaybe by adding some additional config parameters and pass them to this class we will fix this behaviour.\n\nThoughts?  \n\n[1] https://github.com/pinterest/pymemcache/blob/5699c9dfa7067a99000e281091dd6400a1e84122/pymemcache/client/hash.py#L111\n[2] https://github.com/pinterest/pymemcache/blob/de2838c3fbb66f597d08b8432d826ff13cef3c3d/pymemcache/client/base.py#L113\n[3] https://github.com/pinterest/pymemcache/blob/de2838c3fbb66f597d08b8432d826ff13cef3c3d/pymemcache/client/base.py#L986\n[4] https://github.com/pinterest/pymemcache/blob/de2838c3fbb66f597d08b8432d826ff13cef3c3d/pymemcache/client/base.py#L231","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8c7079bf642804946bdaf5be80c3b3e161806bea","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            self.urls.append((url, int(port)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _create_connection(self):"},{"line_number":217,"context_line":"        return pymemcache_hash.HashClient(self.urls, **self._arguments)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":220,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_5bb1b544","line":217,"range":{"start_line":217,"start_character":53,"end_line":217,"end_character":70},"in_reply_to":"3fa7e38b_39a2fefd","updated":"2020-01-02 15:15:56.000000000","message":"The error I got looked like pymemcached didn\u0027t know how to handle something we were passing it (socket_timeout).\n\nAre you suggesting we maintain a mapping from socket_timeout to connect_timeout?\n\nOr are you setting up your environment in such a way where you aren\u0027t hitting the issue I\u0027m hitting?","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"53fe106ed3edef5f635deec59ea207f8b9482eff","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            self.urls.append((url, int(port)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _create_connection(self):"},{"line_number":217,"context_line":"        return pymemcache_hash.HashClient(self.urls, **self._arguments)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":220,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_e76186a3","line":217,"range":{"start_line":217,"start_character":53,"end_line":217,"end_character":70},"in_reply_to":"3fa7e38b_5bb1b544","updated":"2020-01-10 14:36:13.000000000","message":"\u003e The error I got looked like pymemcached didn\u0027t know how to handle\n \u003e something we were passing it (socket_timeout).\n \u003e \n \u003e Are you suggesting we maintain a mapping from socket_timeout to\n \u003e connect_timeout?\n \u003e \n \u003e Or are you setting up your environment in such a way where you\n \u003e aren\u0027t hitting the issue I\u0027m hitting?\n\nFinally I chosen to introduce a mapping in order to allow us to append other mapping if we detect other similar issues.\n\nThanks Lance for your feedback.","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"15c2e6b97f997eda67de1257ab07fc64772d8889","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            self.urls.append((url, int(port)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _create_connection(self):"},{"line_number":217,"context_line":"        return pymemcache_hash.HashClient(self.urls, **self._arguments)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":220,"context_line":"        conn.disconnect_all()"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_7d81c99f","line":217,"range":{"start_line":217,"start_character":53,"end_line":217,"end_character":70},"in_reply_to":"3fa7e38b_5bb1b544","updated":"2020-01-08 18:46:25.000000000","message":"If we decide to continue with these changes then in a first we can maintain a mapping but I think it can be worth to move to `connection_timeout` ASAP in a follow up patch by example or directly in this patch with another patch set.","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"}],"oslo_cache/tests/test_connection_pool.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"7bf0d34675cf880bc6ba2cd9f93e962569d8d66a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from oslo_cache import exception"},{"line_number":24,"context_line":"from oslo_cache.tests import test_cache"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from pymemcache import client as pymemcache_client"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class _TestConnectionPool(_memcache_pool.ConnectionPool):"},{"line_number":29,"context_line":"    destroyed_value \u003d \u0027destroyed\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_cc24e30f","line":26,"updated":"2019-02-14 16:11:06.000000000","message":"This is a third-party lib, it should be included in the middle import section (with mock, six, etc.).","commit_id":"96b52c146550efbc726ea47a1b16c0dc9602ce8b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"7bf0d34675cf880bc6ba2cd9f93e962569d8d66a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        _acquire_connection()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"class TestMemcacheClient(test_cache.BaseTestCase):"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def test_memcache_client_pool_create_connection(self):"},{"line_number":140,"context_line":"        mcp \u003d _memcache_pool.MemcacheClientPool(urls\u003d\"foo\","}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_4c7eb3e4","line":137,"updated":"2019-02-14 16:11:06.000000000","message":"I\u0027m not entirely sure we need a separate test for this now, but it\u0027s not hurting anything.","commit_id":"96b52c146550efbc726ea47a1b16c0dc9602ce8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5b31e50206429cd751bda7783f9d33e40ffe62d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import time"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"from pymemcache import client as pymemcache_client"},{"line_number":17,"context_line":"from six.moves import queue"},{"line_number":18,"context_line":"import testtools"},{"line_number":19,"context_line":"from testtools import matchers"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_2d304456","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":50},"updated":"2019-02-25 20:59:34.000000000","message":"You need to use the hashclient.\n\nThis appears to be a rebase of the wrong patch (prior to using hashclient)","commit_id":"e0990389661612e3e9f33fd5854cd5555a6712e0"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import time"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"from pymemcache.client.base import Client"},{"line_number":18,"context_line":"from pymemcache.client.hash import HashClient"},{"line_number":19,"context_line":"from six.moves import queue"},{"line_number":20,"context_line":"import testtools"},{"line_number":21,"context_line":"from testtools import matchers"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_e0f8d54a","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":45},"updated":"2019-02-27 16:14:55.000000000","message":"Ditto regarding the module import guidelines.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        self.assertTrue(\"http://bar:11211\" in mc.clients)"},{"line_number":189,"context_line":"        self.assertTrue(\"http://bar:8080\" in mc.clients)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_memcache_get(self):"},{"line_number":192,"context_line":"        mcp \u003d _memcache_pool.MemcacheClientPool(urls\u003d[\u0027127.0.0.1\u0027],"},{"line_number":193,"context_line":"                                                arguments\u003d{},"},{"line_number":194,"context_line":"                                                maxsize\u003d10,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_f7e658e7","line":191,"updated":"2019-02-27 16:14:55.000000000","message":"What of our code are we actually testing here? It seems like this is mostly a test of the pymemcache Client, which is not our responsibility.\n\nIt feels like we could accomplish the same coverage of our code by mocking the Client and just asserting that we made the appropriate calls to it. We don\u0027t need to add a dependency on the pymemcache client wire protocol to verify that we did the right thing.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"42eae7acc68790073fe6ee568c88926b7c529a9e","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.assertTrue(\"http://bar:8080\" in mc.clients)"},{"line_number":159,"context_line":"        self.assertTrue(\"https://[2620:52:0:13b8:5054:ff:fe3e:1]:8080\" in"},{"line_number":160,"context_line":"                        mc.clients)"},{"line_number":161,"context_line":"        self.assertTrue(\"https://[2620:52:0:13b8:8080:ff:fe3e:1]:8080\" in"},{"line_number":162,"context_line":"                        mc.clients)"},{"line_number":163,"context_line":"        self.assertTrue(\"https://[2620:52:0:13b8:5054:ff:fe3e:1]:11211\" in"},{"line_number":164,"context_line":"                        mc.clients)"},{"line_number":165,"context_line":"        self.assertTrue(\"https://[::192.9.5.5]:11211\" in mc.clients)"}],"source_content_type":"text/x-python","patch_set":38,"id":"5fc1f717_de2356bc","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":35},"updated":"2019-03-13 12:34:15.000000000","message":"++","commit_id":"a6d0e94d9f68701743bf968bf148dfe4b0c3076e"}],"releasenotes/notes/switch-from-python-memcached-to-pymemcache-566e70b224f92b73.yaml":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"846b8ba3eecb7ef06bf274bc41962274510096bd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Switch from python-memcached to pymemcache to avoid threading.local usage"},{"line_number":5,"context_line":"    and fix errors on inheritance and oslo.cache memcache_pool due to"},{"line_number":6,"context_line":"    threading overriding."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"9fdfeff1_57bb2ec3","line":6,"range":{"start_line":4,"start_character":3,"end_line":6,"end_character":25},"updated":"2019-02-20 16:57:04.000000000","message":"Change to: \"Switch from python-memcached to pymemcached for memcache_pool. This avoids issues with thread.local usage and fixes errors seen with inheritance.\"\n\n\nReasoning for the wording change is to ensure it is clear we are only changing out the use with memcache_pool and not the default driver(s)","commit_id":"f618ff5687dc8a4799ffeed5b9c07d9a141cba0e"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"c12f8bbe448028300588a7569a03420a83b6a241","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Switch from python-memcached to pymemcache to avoid threading.local usage"},{"line_number":5,"context_line":"    and fix errors on inheritance and oslo.cache memcache_pool due to"},{"line_number":6,"context_line":"    threading overriding."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"9fdfeff1_17bb6672","line":6,"range":{"start_line":4,"start_character":3,"end_line":6,"end_character":25},"in_reply_to":"9fdfeff1_57bb2ec3","updated":"2019-02-20 17:06:31.000000000","message":"Thanks for all your precious comments :)","commit_id":"f618ff5687dc8a4799ffeed5b9c07d9a141cba0e"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"88140af81e28340909c61b647999290472aeebf1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Switch from python-memcached to pymemcached for memcache_pool."},{"line_number":5,"context_line":"    This avoids issues with thread.local usage and fixes errors"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"9fdfeff1_d7fc7473","line":2,"updated":"2019-02-27 16:14:55.000000000","message":"I\u0027d like to see an entry in the upgrades section too since this adds a new dependency.","commit_id":"0b13a5117544701f27e7363adc5e917891cc1e7b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bcab0bbd3121f14b356c0b1c815a500873a8cbc6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Start to use pymemcache instead of python-memcached."}],"source_content_type":"text/x-yaml","patch_set":46,"id":"3fa7e38b_af747d04","line":1,"updated":"2020-02-20 11:15:41.000000000","message":"I don\u0027t think this is necessary since it doesn\u0027t affect end users, right?","commit_id":"3cd0bfb7d5d4fb01dd11acc8e51a3f40e8d0edcf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7f40d82f369f8aa68b6c2b624521746df700e430","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Start to use pymemcache instead of python-memcached."}],"source_content_type":"text/x-yaml","patch_set":46,"id":"1fa4df85_55210a9f","line":1,"in_reply_to":"3fa7e38b_af747d04","updated":"2020-02-24 16:10:08.000000000","message":"I agree these changes doesn\u0027t affect end users directly but they are significant changes which could have more impacts than expected and so if something happen on the customer side after an upgrade which will introduce these changes it could help them to figure out what\u0027s happen if errors occurs. In other words a release note could help us to highlight these changes to the community.\n\nElse, the rational behind these changes was to fix an eventlet issue, but we decided to follow another way to fix that to allow us to backport the fix more merely, so I\u0027m not sure we can still consider they fix something .\n\nThoughts?","commit_id":"3cd0bfb7d5d4fb01dd11acc8e51a3f40e8d0edcf"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"efb18b680eee97b44b9e4b66e31aa88a8ca6d041","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Start to use pymemcache instead of python-memcached."},{"line_number":5,"context_line":"fixes:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Switch from python-memcached to pymemcached for memcache_pool."}],"source_content_type":"text/x-yaml","patch_set":47,"id":"1fa4df85_b8c07352","line":4,"updated":"2020-02-24 17:31:17.000000000","message":"The upgrade notes in the release notes should tell a deployer what they need to do before/at the time of upgrading. I\u0027m not sure they need to do anything for this, do they? I think the fixes section should cover things.","commit_id":"6c869ababa948fe31b3cd941c73435eb1028982b"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"17436cddee39898b21b9883aeda76b2b2fe1a702","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Start to use pymemcache instead of python-memcached."},{"line_number":5,"context_line":"fixes:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Switch from python-memcached to pymemcached for memcache_pool."}],"source_content_type":"text/x-yaml","patch_set":47,"id":"1fa4df85_d6396e41","line":4,"in_reply_to":"1fa4df85_08192c78","updated":"2020-02-25 16:18:01.000000000","message":"No problem, make sense, done!","commit_id":"6c869ababa948fe31b3cd941c73435eb1028982b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9edfa4874c4b58a7b31f89d6a1b7032d86ce8d9c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Start to use pymemcache instead of python-memcached."},{"line_number":5,"context_line":"fixes:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Switch from python-memcached to pymemcached for memcache_pool."}],"source_content_type":"text/x-yaml","patch_set":47,"id":"1fa4df85_08192c78","line":4,"in_reply_to":"1fa4df85_b8c07352","updated":"2020-02-25 10:39:57.000000000","message":"Yeah, I agree (see previous PS), though I didn\u0027t care enough to debate it :) If someone else is on the same page then yes, we should probably drop this piece at least","commit_id":"6c869ababa948fe31b3cd941c73435eb1028982b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"efb18b680eee97b44b9e4b66e31aa88a8ca6d041","unresolved":false,"context_lines":[{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Switch from python-memcached to pymemcached for memcache_pool."},{"line_number":8,"context_line":"    This avoids issues with thread.local usage and fixes errors"},{"line_number":9,"context_line":"    seen with inheritance."}],"source_content_type":"text/x-yaml","patch_set":47,"id":"1fa4df85_18cf4780","line":9,"updated":"2020-02-24 17:31:17.000000000","message":"Maybe also mention this is only applicable with dogpile?","commit_id":"6c869ababa948fe31b3cd941c73435eb1028982b"}],"setup.cfg":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"90cf11aa10639d7f45eee06ac8a12d535233e0be","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache!\u003d1.3.0,\u003e\u003d1.2.9 # Apache 2.0"},{"line_number":38,"context_line":"mongo \u003d"},{"line_number":39,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":40,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"9fdfeff1_1171a4a8","line":37,"updated":"2019-02-14 15:07:32.000000000","message":"Side question, are we going to plan a version of that patch without dependency change for stable/rocky?","commit_id":"96b52c146550efbc726ea47a1b16c0dc9602ce8b"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"e8275e13bca4a1403379ccd205a54817607024ae","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003d\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"mongo \u003d"},{"line_number":39,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":40,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":20,"id":"9fdfeff1_d148a088","line":37,"range":{"start_line":37,"start_character":13,"end_line":37,"end_character":14},"updated":"2019-02-19 20:57:38.000000000","message":"This should be \u003e\u003d\n\nThe requirement itself is providing a range of acceptable versions. lower-constraints.txt is providing a pinned version corresponding exactly to the lowest allowable version. That\u0027s why one uses \u003e\u003d and the other uses \u003d\u003d","commit_id":"a17caded6e445571b8523ab1229fbd07a1ed6d64"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"846b8ba3eecb7ef06bf274bc41962274510096bd","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003d\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"mongo \u003d"},{"line_number":39,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":40,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":20,"id":"9fdfeff1_d7cb9e47","line":37,"range":{"start_line":37,"start_character":13,"end_line":37,"end_character":14},"in_reply_to":"9fdfeff1_d148a088","updated":"2019-02-20 16:57:04.000000000","message":"We might need to also leave python-memcached, it is still used in non-pooled forms.","commit_id":"a17caded6e445571b8523ab1229fbd07a1ed6d64"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"846b8ba3eecb7ef06bf274bc41962274510096bd","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003e\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"mongo \u003d"},{"line_number":39,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":40,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"9fdfeff1_77d8b21d","line":37,"range":{"start_line":37,"start_character":2,"end_line":37,"end_character":33},"updated":"2019-02-20 16:57:04.000000000","message":"We might need to still leave python-memcached, it is used in non-pooled forms.","commit_id":"f618ff5687dc8a4799ffeed5b9c07d9a141cba0e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"eba23aa73a5bed5239a3800c48182ae67eba320e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003e\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"   python-memcached\u003e\u003d1.56 # PSF"},{"line_number":39,"context_line":"mongo \u003d"},{"line_number":40,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":41,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":45,"id":"3fa7e38b_e2c7df10","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":31},"updated":"2019-11-12 20:07:39.000000000","message":"Do we still need to include this extra dependency now that we\u0027re not using it anywhere?","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"6f2160ac8bfa7dc98cdbbc50eedffb28f160f73d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003e\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"   python-memcached\u003e\u003d1.56 # PSF"},{"line_number":39,"context_line":"mongo \u003d"},{"line_number":40,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":41,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":45,"id":"3fa7e38b_be733416","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":31},"in_reply_to":"3fa7e38b_e2c7df10","updated":"2019-11-13 15:48:53.000000000","message":"Good point","commit_id":"bfa1f36eeaa2219f82691ede66635abb68e94c92"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bcab0bbd3121f14b356c0b1c815a500873a8cbc6","unresolved":false,"context_lines":[{"line_number":35,"context_line":"[extras]"},{"line_number":36,"context_line":"dogpile \u003d"},{"line_number":37,"context_line":"   pymemcache\u003e\u003d2.1.1 # Apache 2.0"},{"line_number":38,"context_line":"   python-memcached\u003e\u003d1.56 # PSF"},{"line_number":39,"context_line":"mongo \u003d"},{"line_number":40,"context_line":"  pymongo!\u003d3.1,\u003e\u003d3.0.2 # Apache-2.0"},{"line_number":41,"context_line":"etcd3gw \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":46,"id":"3fa7e38b_cf19b9d2","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":31},"updated":"2020-02-20 11:15:41.000000000","message":"Drop this?","commit_id":"3cd0bfb7d5d4fb01dd11acc8e51a3f40e8d0edcf"}]}
