)]}'
{"keystone/common/cache/_memcache_pool.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca6c4231e937bb70194960179a16f7d3aed3c723","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# As client is inherited from threading.local so that we have to restore object"},{"line_number":39,"context_line":"# methods overloaded by threading.local so we can reuse clients in different"},{"line_number":40,"context_line":"# threads"},{"line_number":41,"context_line":"_MemcacheClient \u003d type(\u0027_MemcacheClient\u0027, memcache.Client.__mro__,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa53dc9_a55b2a2e","line":38,"updated":"2015-04-06 12:59:50.000000000","message":"I haven\u0027t tried this out, but I\u0027m not sure how it would work. The idea of the original hack was that the original parents (threading.local) would be removed from the inheritance hierarchy.","commit_id":"51d2c18cdb273efc9c881acdf51cc71cd3962fec"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"de69b6dfbee95c271470398aa6e1476107c7afce","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# As client is inherited from threading.local so that we have to restore object"},{"line_number":39,"context_line":"# methods overloaded by threading.local so we can reuse clients in different"},{"line_number":40,"context_line":"# threads"},{"line_number":41,"context_line":"_MemcacheClient \u003d type(\u0027_MemcacheClient\u0027, memcache.Client.__mro__,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa53dc9_a587aad6","line":38,"in_reply_to":"9aa53dc9_a55b2a2e","updated":"2015-04-06 13:16:51.000000000","message":"David, with memcache 1.54 this idea stops working as memcache.Client calls super() in __init__() so inheritance has to be preserved in order not to overwrite entire memcache.Client.","commit_id":"51d2c18cdb273efc9c881acdf51cc71cd3962fec"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b1f184cbb8411f016709afa62603a6525ff09868","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":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aa53dc9_59068321","line":42,"updated":"2015-04-06 14:55:49.000000000","message":"This should not be indented.","commit_id":"2b69f902588af68451b1bc38edb354903a9bf417"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b5c5bd51a0f306f40b52d7ff598350b045aef342","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":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aa53dc9_b4a916e2","line":42,"in_reply_to":"9aa53dc9_59068321","updated":"2015-04-06 15:03:09.000000000","message":"Done","commit_id":"2b69f902588af68451b1bc38edb354903a9bf417"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b1f184cbb8411f016709afa62603a6525ff09868","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    __delattr__ \u003d object.__delattr__"},{"line_number":47,"context_line":"    __getattribute__ \u003d object.__getattribute__"},{"line_number":48,"context_line":"    __new__ \u003d object.__new__"},{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aa53dc9_343186ed","line":49,"updated":"2015-04-06 14:55:49.000000000","message":"Based on the implementation in Python\u0027s _threading_local, you\u0027ll also need to override the __del__.","commit_id":"2b69f902588af68451b1bc38edb354903a9bf417"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b5c5bd51a0f306f40b52d7ff598350b045aef342","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    __delattr__ \u003d object.__delattr__"},{"line_number":47,"context_line":"    __getattribute__ \u003d object.__getattribute__"},{"line_number":48,"context_line":"    __new__ \u003d object.__new__"},{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aa53dc9_94af32e3","line":49,"in_reply_to":"9aa53dc9_343186ed","updated":"2015-04-06 15:03:09.000000000","message":"Done","commit_id":"2b69f902588af68451b1bc38edb354903a9bf417"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"01bbee15795467289be592d0345e4b847c489287","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __del__(self):"},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aaa499b_1ee46d39","line":52,"updated":"2015-04-10 15:48:20.000000000","message":"Can a test be added for this?","commit_id":"d9193b12111cb783004eaa36752623230510b2e7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c5d1a040d7aee7b75df01913bdae07e928c27f13","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __del__(self):"},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aaa499b_4348782d","line":52,"in_reply_to":"7aaa499b_1ee46d39","updated":"2015-04-14 17:44:35.000000000","message":"A test specifically for the __del__? I\u0027m not sure it would provide that much value. I asked for the patch to be implemented like this since we want to bypass the threading implementations. See the conversation: http://eavesdrop.openstack.org/irclogs/%23openstack-keystone/%23openstack-keystone.2015-04-06.log","commit_id":"d9193b12111cb783004eaa36752623230510b2e7"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8156dbe82eec28ec60d0c3979fd8d0f9b016cdcc","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __del__(self):"},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aaa499b_09ee11ec","line":52,"in_reply_to":"7aaa499b_1ee46d39","updated":"2015-04-14 18:29:11.000000000","message":"Done","commit_id":"d9193b12111cb783004eaa36752623230510b2e7"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8156dbe82eec28ec60d0c3979fd8d0f9b016cdcc","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    __setattr__ \u003d object.__setattr__"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __del__(self):"},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"_PoolItem \u003d collections.namedtuple(\u0027_PoolItem\u0027, [\u0027ttl\u0027, \u0027connection\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aaa499b_49cbf972","line":52,"in_reply_to":"7aaa499b_4348782d","updated":"2015-04-14 18:29:11.000000000","message":"I\u0027ve added a test for that threading.local methods is wiped out.","commit_id":"d9193b12111cb783004eaa36752623230510b2e7"}],"keystone/tests/unit/common/test_connection_pool.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2a0008edadc4e446e54ca971b4709c10c8b76bdf","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        _acquire_connection()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class TestMemcacheClientOverrides(core.TestCase):"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_client_stripped_of_threading_local(self):"},{"line_number":126,"context_line":"        \"\"\"threading.local overrides are restored for _MemcacheClient\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aa745d1_84792c96","line":123,"updated":"2015-04-16 14:01:33.000000000","message":"Use BaseTestCase if you don\u0027t need all of the setup provided by TestCase.","commit_id":"a4968469881a99fa6649ec256b2d605887274b80"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"7a04f20d7cfe2e5d2d9e725a11dfc1b5bf827c38","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        _acquire_connection()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class TestMemcacheClientOverrides(core.TestCase):"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_client_stripped_of_threading_local(self):"},{"line_number":126,"context_line":"        \"\"\"threading.local overrides are restored for _MemcacheClient\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aa745d1_ca73bb4c","line":123,"in_reply_to":"5aa745d1_84792c96","updated":"2015-04-16 14:37:21.000000000","message":"Done","commit_id":"a4968469881a99fa6649ec256b2d605887274b80"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2a0008edadc4e446e54ca971b4709c10c8b76bdf","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \"\"\"threading.local overrides are restored for _MemcacheClient\"\"\""},{"line_number":127,"context_line":"        client_class \u003d _memcache_pool._MemcacheClient"},{"line_number":128,"context_line":"        # get the genuine thread._local from MRO"},{"line_number":129,"context_line":"        thread_local \u003d client_class.__mro__[2]"},{"line_number":130,"context_line":"        for field in six.iterkeys(thread_local.__dict__):"},{"line_number":131,"context_line":"            if field not in (\u0027__dict__\u0027, \u0027__weakref__\u0027):"},{"line_number":132,"context_line":"                self.assertNotEqual(id(getattr(thread_local, field, None)),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aa745d1_0494fc88","line":129,"updated":"2015-04-16 14:01:33.000000000","message":"I would add an assert here just to prove that thread_local is actually the class you expect.","commit_id":"a4968469881a99fa6649ec256b2d605887274b80"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"7a04f20d7cfe2e5d2d9e725a11dfc1b5bf827c38","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \"\"\"threading.local overrides are restored for _MemcacheClient\"\"\""},{"line_number":127,"context_line":"        client_class \u003d _memcache_pool._MemcacheClient"},{"line_number":128,"context_line":"        # get the genuine thread._local from MRO"},{"line_number":129,"context_line":"        thread_local \u003d client_class.__mro__[2]"},{"line_number":130,"context_line":"        for field in six.iterkeys(thread_local.__dict__):"},{"line_number":131,"context_line":"            if field not in (\u0027__dict__\u0027, \u0027__weakref__\u0027):"},{"line_number":132,"context_line":"                self.assertNotEqual(id(getattr(thread_local, field, None)),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aa745d1_6a99476e","line":129,"in_reply_to":"5aa745d1_0494fc88","updated":"2015-04-16 14:37:21.000000000","message":"Done","commit_id":"a4968469881a99fa6649ec256b2d605887274b80"}]}
