)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"52e68e710989ca9f461e97e9007b8b80799458d2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  (there are a lot of logs there)."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"NOTE: there is no way to specify these parameters for token backend"},{"line_number":41,"context_line":"without this patch: https://gerrit.mirantis.com/20587"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Closes-bug: #1332058"},{"line_number":44,"context_line":"Closes-bug: #1360446"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa98f980_733b81eb","line":41,"updated":"2014-09-10 02:20:30.000000000","message":"I cannot follow this link nor see what the code is, suggest either submitting this to upstream (review.openstack.org) or linking to a LP bug against keystone or... be more specifc about the parameters.","commit_id":"ad7210144c9682e799a5a5422f6e095b4bc9e599"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"03a7b4df4016af164c73dd613c2ab8e2e1b5eb3f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  (there are a lot of logs there)."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"NOTE: there is no way to specify these parameters for token backend"},{"line_number":41,"context_line":"without this patch: https://gerrit.mirantis.com/20587"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Closes-bug: #1332058"},{"line_number":44,"context_line":"Closes-bug: #1360446"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa98f980_6c5e3b47","line":41,"in_reply_to":"fa98f980_733b81eb","updated":"2014-09-10 08:21:32.000000000","message":"Oops, sorry. Fixed.","commit_id":"ad7210144c9682e799a5a5422f6e095b4bc9e599"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The core module that provides pool functionality is copied between"},{"line_number":13,"context_line":"keystone and keystonemiddleware (see _memcache_pool.py in this change"},{"line_number":14,"context_line":"https://review.openstack.org/119774 in keystonemiddleware)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This backend is used instead of dogpile\u0027s backend in memcache token"},{"line_number":17,"context_line":"persistence backend, to configure it one should use following config"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_1ebd43b1","line":14,"updated":"2014-09-16 01:33:24.000000000","message":"the commit message shouldn\u0027t rely on someone having an internet connection.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"keystone and keystonemiddleware (see _memcache_pool.py in this change"},{"line_number":14,"context_line":"https://review.openstack.org/119774 in keystonemiddleware)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This backend is used instead of dogpile\u0027s backend in memcache token"},{"line_number":17,"context_line":"persistence backend, to configure it one should use following config"},{"line_number":18,"context_line":"arguments:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_3edf670e","line":16,"updated":"2014-09-16 01:33:24.000000000","message":"what backend?","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Where:"},{"line_number":29,"context_line":"- servers - comma-separated list of host:port pairs (was already there);"},{"line_number":30,"context_line":"- memcache_dead_retry - number of seconds memcached server is considered"},{"line_number":31,"context_line":"  dead before its tried again;"},{"line_number":32,"context_line":"- memcache_socket_timeout - timeout in seconds for every call to a"},{"line_number":33,"context_line":"  server;"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_1ed463e7","line":30,"updated":"2014-09-16 01:33:24.000000000","message":"this is \"dead_retry\" in the sample above.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"- servers - comma-separated list of host:port pairs (was already there);"},{"line_number":30,"context_line":"- memcache_dead_retry - number of seconds memcached server is considered"},{"line_number":31,"context_line":"  dead before its tried again;"},{"line_number":32,"context_line":"- memcache_socket_timeout - timeout in seconds for every call to a"},{"line_number":33,"context_line":"  server;"},{"line_number":34,"context_line":"- pool_maxsize - max total number of open connections in the pool;"},{"line_number":35,"context_line":"- pool_unused_timeout - number of seconds a connection is held unused in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_3e068786","line":32,"updated":"2014-09-16 01:33:24.000000000","message":"this is \"socket_timeout\" in the sample above.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"  server;"},{"line_number":34,"context_line":"- pool_maxsize - max total number of open connections in the pool;"},{"line_number":35,"context_line":"- pool_unused_timeout - number of seconds a connection is held unused in"},{"line_number":36,"context_line":"  the pool before its closed;"},{"line_number":37,"context_line":"- pool_debug - add non-empty string if you want debug log of this pool"},{"line_number":38,"context_line":"  (there are a lot of logs there)."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_9eff7365","line":36,"updated":"2014-09-16 01:33:24.000000000","message":"change \"its\" to \"It\u0027s\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"- pool_maxsize - max total number of open connections in the pool;"},{"line_number":35,"context_line":"- pool_unused_timeout - number of seconds a connection is held unused in"},{"line_number":36,"context_line":"  the pool before its closed;"},{"line_number":37,"context_line":"- pool_debug - add non-empty string if you want debug log of this pool"},{"line_number":38,"context_line":"  (there are a lot of logs there)."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"To use it as cache backend, set \u0027keystone.cache.memcache_pool\u0027 as active"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa98f980_def49b88","line":37,"updated":"2014-09-16 01:33:24.000000000","message":"just use standard python logging. It already supports disabling loggers.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"}],"doc/source/configuration.rst":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"50a86763b675df5346eaa4025d71f2872aa0edf6","unresolved":false,"context_lines":[{"line_number":365,"context_line":"    * ``dogpile.cache.dbm`` - local DBM file backend"},{"line_number":366,"context_line":"    * ``dogpile.cache.memory`` - in-memory cache"},{"line_number":367,"context_line":"    * ``keystone.cache.mongo`` - MongoDB as caching backend"},{"line_number":368,"context_line":"    * ``keystone.cache.memcache_pool`` - an eventlet safe implementation of ``dogpile.cache.memcached``"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        .. WARNING::"},{"line_number":371,"context_line":"            ``dogpile.cache.memory`` is not suitable for use outside of unit testing"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa98f980_557a3e78","line":368,"updated":"2014-09-16 10:44:53.000000000","message":"It\u0027s _thread_-safe, no matter the color.","commit_id":"746f6d94d12b02bc7e1c14cada5a120cf9e016a3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8acc8a919047943b0c23f4f9def4232960d21728","unresolved":false,"context_lines":[{"line_number":365,"context_line":"    * ``dogpile.cache.dbm`` - local DBM file backend"},{"line_number":366,"context_line":"    * ``dogpile.cache.memory`` - in-memory cache"},{"line_number":367,"context_line":"    * ``keystone.cache.mongo`` - MongoDB as caching backend"},{"line_number":368,"context_line":"    * ``keystone.cacone.memcache_pool`` - An eventlet safe implementation of ``dogpile.cache.memcached."},{"line_number":369,"context_line":"                                          This implementation also provides client connection re-use."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        .. WARNING::"}],"source_content_type":"text/x-rst","patch_set":19,"id":"fa98f980_f476c23e","line":368,"updated":"2014-09-16 21:03:12.000000000","message":"is cacone correct here?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"432d54ea7cac274fada0f32bc9f05e8db8e1ac51","unresolved":false,"context_lines":[{"line_number":365,"context_line":"    * ``dogpile.cache.dbm`` - local DBM file backend"},{"line_number":366,"context_line":"    * ``dogpile.cache.memory`` - in-memory cache"},{"line_number":367,"context_line":"    * ``keystone.cache.mongo`` - MongoDB as caching backend"},{"line_number":368,"context_line":"    * ``keystone.cacone.memcache_pool`` - An eventlet safe implementation of ``dogpile.cache.memcached."},{"line_number":369,"context_line":"                                          This implementation also provides client connection re-use."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        .. WARNING::"}],"source_content_type":"text/x-rst","patch_set":19,"id":"fa98f980_14e346a5","line":368,"in_reply_to":"fa98f980_f476c23e","updated":"2014-09-16 21:13:09.000000000","message":"fixed in next.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"* ``keystone.token.persistence.backends.sql.Token`` - The SQL-based (default)"},{"line_number":310,"context_line":"  token persistence engine. This backend stores all token data in the same SQL"},{"line_number":311,"context_line":"  store that is used for Identity/Assignment/etc."},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"* ``keystone.token.persistence.backends.memcache.Token`` - The memcached based"},{"line_number":314,"context_line":"  token persistence backend. This backend relies on ``dogpile.cache`` and stores"}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_987d7971","line":311,"updated":"2014-09-23 20:19:27.000000000","message":"you don\u0027t need to use SQL for identity or assignment. I think this last sentence can be removed.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"* ``keystone.token.persistence.backends.sql.Token`` - The SQL-based (default)"},{"line_number":310,"context_line":"  token persistence engine. This backend stores all token data in the same SQL"},{"line_number":311,"context_line":"  store that is used for Identity/Assignment/etc."},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"* ``keystone.token.persistence.backends.memcache.Token`` - The memcached based"},{"line_number":314,"context_line":"  token persistence backend. This backend relies on ``dogpile.cache`` and stores"}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_7a7a2478","line":311,"in_reply_to":"da9df570_987d7971","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"* ``keystone.token.persistence.backends.memcache.Token`` - The memcached based"},{"line_number":314,"context_line":"  token persistence backend. This backend relies on ``dogpile.cache`` and stores"},{"line_number":315,"context_line":"  the token data in a set of memcached servers. The servers urls are specified"},{"line_number":316,"context_line":"  in the ``[memcache]\\servers`` configuration option in the Keystone config."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"* ``keystone.token.persistence.backends.memcache_pool.Token`` - The pooled memcached"}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_78ed3525","line":315,"updated":"2014-09-23 20:19:27.000000000","message":"change \"servers urls\" to \"server URLs\"","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"* ``keystone.token.persistence.backends.memcache.Token`` - The memcached based"},{"line_number":314,"context_line":"  token persistence backend. This backend relies on ``dogpile.cache`` and stores"},{"line_number":315,"context_line":"  the token data in a set of memcached servers. The servers urls are specified"},{"line_number":316,"context_line":"  in the ``[memcache]\\servers`` configuration option in the Keystone config."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"* ``keystone.token.persistence.backends.memcache_pool.Token`` - The pooled memcached"}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_3aeb3c14","line":315,"in_reply_to":"da9df570_78ed3525","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":315,"context_line":"  the token data in a set of memcached servers. The servers urls are specified"},{"line_number":316,"context_line":"  in the ``[memcache]\\servers`` configuration option in the Keystone config."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"* ``keystone.token.persistence.backends.memcache_pool.Token`` - The pooled memcached"},{"line_number":319,"context_line":"  token persistence engine. This backend supports the concept of pooled memcache"},{"line_number":320,"context_line":"  client object (allowing for the re-use of the client objects). This backend has"},{"line_number":321,"context_line":"  a number of extra tunable options in the ``[memcache]`` section of the config."}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_d8c46194","line":318,"updated":"2014-09-23 20:19:27.000000000","message":"This one should be documented first if we\u0027re going to warn people not to use the other one.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":315,"context_line":"  the token data in a set of memcached servers. The servers urls are specified"},{"line_number":316,"context_line":"  in the ``[memcache]\\servers`` configuration option in the Keystone config."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"* ``keystone.token.persistence.backends.memcache_pool.Token`` - The pooled memcached"},{"line_number":319,"context_line":"  token persistence engine. This backend supports the concept of pooled memcache"},{"line_number":320,"context_line":"  client object (allowing for the re-use of the client objects). This backend has"},{"line_number":321,"context_line":"  a number of extra tunable options in the ``[memcache]`` section of the config."}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_1a5038d3","line":318,"in_reply_to":"da9df570_d8c46194","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":325,"context_line":"    It is recommended you use the ``keystone.token.persistence.backend.memcache_pool.Token``"},{"line_number":326,"context_line":"    backend instead of ``keystone.token.persistence.backend.memcache.Token`` as the token"},{"line_number":327,"context_line":"    persistence driver if you are deploying Keystone under eventlet instead of"},{"line_number":328,"context_line":"    Apache + mod_wsgi. This recommendation are due to known issues with the use of"},{"line_number":329,"context_line":"    ``thread.local`` under eventlet that can allow the leaking of memcache client objects"},{"line_number":330,"context_line":"    and consumption of extra sockets."},{"line_number":331,"context_line":""}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_18bfc9fc","line":328,"updated":"2014-09-23 20:19:27.000000000","message":"change \"are due\" to \"is due\"","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":325,"context_line":"    It is recommended you use the ``keystone.token.persistence.backend.memcache_pool.Token``"},{"line_number":326,"context_line":"    backend instead of ``keystone.token.persistence.backend.memcache.Token`` as the token"},{"line_number":327,"context_line":"    persistence driver if you are deploying Keystone under eventlet instead of"},{"line_number":328,"context_line":"    Apache + mod_wsgi. This recommendation are due to known issues with the use of"},{"line_number":329,"context_line":"    ``thread.local`` under eventlet that can allow the leaking of memcache client objects"},{"line_number":330,"context_line":"    and consumption of extra sockets."},{"line_number":331,"context_line":""}],"source_content_type":"text/x-rst","patch_set":31,"id":"da9df570_5ad7204b","line":328,"in_reply_to":"da9df570_18bfc9fc","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"47943d82ba85e12bb78a43866112ceec50579741","unresolved":false,"context_lines":[{"line_number":530,"context_line":""},{"line_number":531,"context_line":"# Memcache servers in the format of \"host:port\"."},{"line_number":532,"context_line":"# (dogpile.cache.memcache and keystone.cache.memcache_pool"},{"line_number":533,"context_line":"# backends only) (list value)"},{"line_number":534,"context_line":"#memcache_servers\u003dlocalhost:11211"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"# Number of seconds memcached server is considered dead before"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"fa98f980_2fa8f376","line":533,"updated":"2014-09-16 21:44:34.000000000","message":"if it\u0027s a list, is it meant to be comma separated? add a note?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"47943d82ba85e12bb78a43866112ceec50579741","unresolved":false,"context_lines":[{"line_number":534,"context_line":"#memcache_servers\u003dlocalhost:11211"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"# Number of seconds memcached server is considered dead before"},{"line_number":537,"context_line":"# its tried again. (dogpile.cache.memcache and"},{"line_number":538,"context_line":"# keystone.cache.memcache_pool backends only) (integer value)"},{"line_number":539,"context_line":"#memcache_dead_retry\u003d300"},{"line_number":540,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":19,"id":"fa98f980_4fb457d4","line":537,"updated":"2014-09-16 21:44:34.000000000","message":"it\u0027s?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"47943d82ba85e12bb78a43866112ceec50579741","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"#servers\u003dlocalhost:11211"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"# Number of seconds memcached server is considered dead before"},{"line_number":1228,"context_line":"# its tried again. (integer value)"},{"line_number":1229,"context_line":"#dead_retry\u003d300"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"# Timeout in seconds for every call to a server. (integer"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"fa98f980_cfc76745","line":1228,"updated":"2014-09-16 21:44:34.000000000","message":"it\u0027s?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"}],"keystone/common/cache/_memcache_pool.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_b9fa91ba","line":1,"updated":"2014-09-16 01:33:24.000000000","message":"why does the filename start with _?","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class MemcacheConnectionPool(object):"},{"line_number":37,"context_line":"    def __init__(self, url, max_pool_size, client_ttl, debug\u003dFalse,"},{"line_number":38,"context_line":"                 **arguments):"},{"line_number":39,"context_line":"        self._free_pool \u003d []"},{"line_number":40,"context_line":"        self._server_list \u003d [0] * len(url)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_99b5cdee","line":37,"updated":"2014-09-16 01:33:24.000000000","message":"url should be urls since it\u0027s a list.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __init__(self, url, max_pool_size, client_ttl, debug\u003dFalse,"},{"line_number":38,"context_line":"                 **arguments):"},{"line_number":39,"context_line":"        self._free_pool \u003d []"},{"line_number":40,"context_line":"        self._server_list \u003d [0] * len(url)"},{"line_number":41,"context_line":"        self._condition \u003d threading.Condition()"},{"line_number":42,"context_line":"        self.acquired \u003d 0"},{"line_number":43,"context_line":"        self.url \u003d url"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_59bfe5cf","line":40,"updated":"2014-09-16 01:33:24.000000000","message":"Add a comment why 0 is used here. Seems like None would be the obvious choice.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self._free_pool \u003d []"},{"line_number":40,"context_line":"        self._server_list \u003d [0] * len(url)"},{"line_number":41,"context_line":"        self._condition \u003d threading.Condition()"},{"line_number":42,"context_line":"        self.acquired \u003d 0"},{"line_number":43,"context_line":"        self.url \u003d url"},{"line_number":44,"context_line":"        self.max_pool_size \u003d max_pool_size"},{"line_number":45,"context_line":"        self.client_ttl \u003d client_ttl"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_1998fd73","line":42,"updated":"2014-09-16 01:33:24.000000000","message":"shouldn\u0027t these all be private?","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self._debug_pool \u003d debug"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"},{"line_number":50,"context_line":"        if self._debug_pool:"},{"line_number":51,"context_line":"            # NOTE(morganfainberg): Do not do the debug work unless we are"},{"line_number":52,"context_line":"            # actually debugging the pool."},{"line_number":53,"context_line":"            thread_id \u003d threading.current_thread().ident"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_f9c5f95b","line":50,"updated":"2014-09-16 01:33:24.000000000","message":"use regular python logging to control whether debug messages are printed or not.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            thread_id \u003d threading.current_thread().ident"},{"line_number":54,"context_line":"            prefix \u003d (\u0027Memcached client pool %(pool)s, thread %(thread)s: \u0027 %"},{"line_number":55,"context_line":"                      {\u0027pool\u0027: id(self), \u0027thread\u0027: thread_id})"},{"line_number":56,"context_line":"            LOG.debug(prefix + msg, *args, **kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _create_connection(self):"},{"line_number":59,"context_line":"        conn \u003d MemcacheClient(self.url, **self.arguments)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_19a63dab","line":56,"updated":"2014-09-16 01:33:24.000000000","message":"how about make the prefix a regular string (don\u0027t do replacement), and then do the replacement here:\n\n prefix \u003d \u0027Memcached client pool %(pool)s, thread %(thread)s: \u0027\n kwargs[\u0027pool\u0027] \u003d id(self)\n kwargs[\u0027thread\u0027] \u003d thread_id\n LOG.debug(prefix + msg, **kwargs)\n\nThen the code won\u0027t have to look over the prefix string twice.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _create_connection(self):"},{"line_number":59,"context_line":"        conn \u003d MemcacheClient(self.url, **self.arguments)"},{"line_number":60,"context_line":"        self._debug_logger(\u0027Creating new memcached client: %s\u0027, id(conn))"},{"line_number":61,"context_line":"        return conn"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _destroy_connection(self, conn):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_79ae6982","line":60,"updated":"2014-09-16 01:33:24.000000000","message":"This should say \"Created\" rather than \"Creating\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        except Exception as e:"},{"line_number":68,"context_line":"            # Catch and log the exception, this should not explode ever, but"},{"line_number":69,"context_line":"            # make sure the error doesn\u0027t break the pool."},{"line_number":70,"context_line":"            self._debug_logger(\u0027Error when destroying connection \u0027"},{"line_number":71,"context_line":"                               \u0027%(conn)s: %(err)s\u0027, {\u0027conn\u0027: id(conn),"},{"line_number":72,"context_line":"                                                     \u0027err\u0027: str(e)})"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_19bd5db1","line":70,"updated":"2014-09-16 01:33:24.000000000","message":"Seems like ths should be higher than debug if it\u0027s so unexpected.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6d3b7f7dbddfa1225587e3b913cfee561edfbf83","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        except Exception as e:"},{"line_number":68,"context_line":"            # Catch and log the exception, this should not explode ever, but"},{"line_number":69,"context_line":"            # make sure the error doesn\u0027t break the pool."},{"line_number":70,"context_line":"            self._debug_logger(\u0027Error when destroying connection \u0027"},{"line_number":71,"context_line":"                               \u0027%(conn)s: %(err)s\u0027, {\u0027conn\u0027: id(conn),"},{"line_number":72,"context_line":"                                                     \u0027err\u0027: str(e)})"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_abcf947d","line":70,"in_reply_to":"fa98f980_19bd5db1","updated":"2014-09-16 02:12:34.000000000","message":"This requires a string freeze exception, I\u0027ll upgrade to log.exception if it receives a +2 I\u0027ll send an email to the list about this.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            # make sure the error doesn\u0027t break the pool."},{"line_number":70,"context_line":"            self._debug_logger(\u0027Error when destroying connection \u0027"},{"line_number":71,"context_line":"                               \u0027%(conn)s: %(err)s\u0027, {\u0027conn\u0027: id(conn),"},{"line_number":72,"context_line":"                                                     \u0027err\u0027: str(e)})"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def acquire(self):"},{"line_number":75,"context_line":"        with self._condition:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_d9c67548","line":72,"updated":"2014-09-16 01:33:24.000000000","message":"should be able to use just e here rather than str(e).","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"50a86763b675df5346eaa4025d71f2872aa0edf6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                       dict(memcache.Client.__dict__))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class MemcacheConnectionPool(object):"},{"line_number":36,"context_line":"    def __init__(self, urls, max_pool_size, client_ttl, **arguments):"},{"line_number":37,"context_line":"        self._free_pool \u003d []"},{"line_number":38,"context_line":"        # NOTE(morganfainberg): This is a list of int/float values that"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa98f980_f58a5263","line":35,"updated":"2014-09-16 10:44:53.000000000","message":"Squashing these two classes together is a bad idea. They have been separated by functionality: connection pooling and python-memcache handling. I think it\u0027s harder to read now.","commit_id":"746f6d94d12b02bc7e1c14cada5a120cf9e016a3"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"50a86763b675df5346eaa4025d71f2872aa0edf6","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            conn \u003d None"},{"line_number":76,"context_line":"            now \u003d time.time()"},{"line_number":77,"context_line":"            while conn is None:"},{"line_number":78,"context_line":"                while (not self._condition and"},{"line_number":79,"context_line":"                       self._acquired \u003e\u003d self._max_pool_size):"},{"line_number":80,"context_line":"                    # Wait for either a free connection or free space for a new"},{"line_number":81,"context_line":"                    # connection."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa98f980_55f15e00","line":78,"range":{"start_line":78,"start_character":23,"end_line":78,"end_character":42},"updated":"2014-09-16 10:44:53.000000000","message":"This will always be False. We\u0027ll exceed max_pool_size easily.","commit_id":"746f6d94d12b02bc7e1c14cada5a120cf9e016a3"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"50a86763b675df5346eaa4025d71f2872aa0edf6","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                    ttl, conn \u003d self._free_pool.pop()"},{"line_number":86,"context_line":"                    if ttl is not None and ttl \u003c now:"},{"line_number":87,"context_line":"                        # Do not used expired connections. Each client has a"},{"line_number":88,"context_line":"                        # maximum TTL it can sit in the free pool unused, this"},{"line_number":89,"context_line":"                        # is to limit potential timeouts / socket closures and"},{"line_number":90,"context_line":"                        # delays or errors in responding due to these timeouts."},{"line_number":91,"context_line":"                        self._destroy_connection(conn)"},{"line_number":92,"context_line":"                        conn \u003d None"},{"line_number":93,"context_line":"                except IndexError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa98f980_b5be0aff","line":90,"range":{"start_line":88,"start_character":74,"end_line":90,"end_character":78},"updated":"2014-09-16 10:44:53.000000000","message":"This was absolutely not the intention of unused_timeout in the original version. I don\u0027t see any point in closing-reopening connections here.\n\nMoreover cleanup must happen from the other side of pool or we\u0027ll have rotting connections on the bottom of the stack.","commit_id":"746f6d94d12b02bc7e1c14cada5a120cf9e016a3"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        raise NotImplementedError"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @abc.abstractmethod"},{"line_number":57,"context_line":"    def _destroy_connection(cls, conn):"},{"line_number":58,"context_line":"        raise NotImplementedError"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_c3474676","line":57,"updated":"2014-09-16 19:18:51.000000000","message":"_destroy_connection is no longer @classmethod","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        raise NotImplementedError"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"},{"line_number":61,"context_line":"        if LOG.logger.getEffectiveLevel() \u003c\u003d logging.DEBUG:"},{"line_number":62,"context_line":"            thread_id \u003d threading.current_thread().ident"},{"line_number":63,"context_line":"            args \u003d (id(self), thread_id) + args"},{"line_number":64,"context_line":"            prefix \u003d \u0027Memcached pool %s, thread %s: \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_43f7d659","line":61,"range":{"start_line":61,"start_character":11,"end_line":61,"end_character":41},"updated":"2014-09-16 19:18:51.000000000","message":"I\u0027m not sure how that worked, replaced with isEnabledFor","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":80,"context_line":"            self._acquired +\u003d 1"},{"line_number":81,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"},{"line_number":82,"context_line":"            self._cleanup_pool()"},{"line_number":83,"context_line":"            return conn"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def release(self, conn):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_63169a5a","line":82,"updated":"2014-09-16 19:18:51.000000000","message":"This moved to release - the later we run cleanup the more connections we reap.","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        with self._no_free_condition:"},{"line_number":87,"context_line":"            self._debug_logger(\u0027Releasing connection %s\u0027, id(conn))"},{"line_number":88,"context_line":"            # Return connection to pool"},{"line_number":89,"context_line":"            self._free_pool.append((time.time() + self._unused_timeout, conn))"},{"line_number":90,"context_line":"            self._acquired -\u003d 1"},{"line_number":91,"context_line":"            # Notify waiting getters and cleaner"},{"line_number":92,"context_line":"            self._no_free_condition.notify_all()"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_2356522b","line":89,"updated":"2014-09-16 19:18:51.000000000","message":"I\u0027ve added a descriptive pool item here.","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _cleanup_pool(self):"},{"line_number":95,"context_line":"        now \u003d time.time()"},{"line_number":96,"context_line":"        non_expired_idx \u003d 0"},{"line_number":97,"context_line":"        for idx, item in enumerate(self._free_pool):"},{"line_number":98,"context_line":"            ttl, conn \u003d item"},{"line_number":99,"context_line":"            if ttl \u003e\u003d now:"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_c33e66da","line":96,"updated":"2014-09-16 19:18:51.000000000","message":"This would mean that when we don\u0027t find any good connections we do nothing. Fixed that.","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                # Find the index of the last non-expired connection"},{"line_number":101,"context_line":"                non_expired_idx \u003d idx"},{"line_number":102,"context_line":"                break"},{"line_number":103,"context_line":"        to_close \u003d self._free_pool[:non_expired_idx]"},{"line_number":104,"context_line":"        self._free_pool[:non_expired_idx] \u003d []"},{"line_number":105,"context_line":"        for conn in to_close:"},{"line_number":106,"context_line":"            self._debug_logger(\u0027Reaping connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_03ab0e1f","line":103,"updated":"2014-09-16 19:18:51.000000000","message":"There\u0027s no need for separate variable anymore.","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8acc8a919047943b0c23f4f9def4232960d21728","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":47,"context_line":"class ConnectionPool(object):"},{"line_number":48,"context_line":"    def __init__(self, maxsize, unused_timeout):"},{"line_number":49,"context_line":"        self._maxsize \u003d maxsize"},{"line_number":50,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":51,"context_line":"        self._acquired \u003d 0"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_6686a818","line":48,"updated":"2014-09-16 21:03:12.000000000","message":"This probably needs a docstring. I initially got confused by unused here...I didn\u0027t realize that it meant idle until I read the cleanup method.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"432d54ea7cac274fada0f32bc9f05e8db8e1ac51","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":47,"context_line":"class ConnectionPool(object):"},{"line_number":48,"context_line":"    def __init__(self, maxsize, unused_timeout):"},{"line_number":49,"context_line":"        self._maxsize \u003d maxsize"},{"line_number":50,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":51,"context_line":"        self._acquired \u003d 0"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_743492fb","line":48,"in_reply_to":"fa98f980_6686a818","updated":"2014-09-16 21:13:09.000000000","message":"I\u0027ll add one in the next patchset.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8acc8a919047943b0c23f4f9def4232960d21728","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            self._debug_logger(\u0027Acquiring connection\u0027)"},{"line_number":73,"context_line":"            # Wait for either free connection or free space for a new one"},{"line_number":74,"context_line":"            while not self._free_pool and self._acquired \u003e\u003d self._maxsize:"},{"line_number":75,"context_line":"                self._no_free_condition.wait()"},{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                # Get a free connection from the pool"},{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_061b1c1d","line":75,"updated":"2014-09-16 21:03:12.000000000","message":"Should we have a timeout here so that in the case of catastrophic errors everything doesn\u0027t just block with nothing to tell the operator what happened?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"432d54ea7cac274fada0f32bc9f05e8db8e1ac51","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            self._debug_logger(\u0027Acquiring connection\u0027)"},{"line_number":73,"context_line":"            # Wait for either free connection or free space for a new one"},{"line_number":74,"context_line":"            while not self._free_pool and self._acquired \u003e\u003d self._maxsize:"},{"line_number":75,"context_line":"                self._no_free_condition.wait()"},{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                # Get a free connection from the pool"},{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_3453ea3a","line":75,"in_reply_to":"fa98f980_061b1c1d","updated":"2014-09-16 21:13:09.000000000","message":"what is a sane timeout? what do we do in that case? log and continue the wait?","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c3da232a4a4438f29065c67814bce22bafd7afbb","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            self._debug_logger(\u0027Acquiring connection\u0027)"},{"line_number":73,"context_line":"            # Wait for either free connection or free space for a new one"},{"line_number":74,"context_line":"            while not self._free_pool and self._acquired \u003e\u003d self._maxsize:"},{"line_number":75,"context_line":"                self._no_free_condition.wait()"},{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                # Get a free connection from the pool"},{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_af2303a6","line":75,"in_reply_to":"fa98f980_3453ea3a","updated":"2014-09-17 00:54:29.000000000","message":"That\u0027s a good question. I don\u0027t think you can continue to wait. We would either have to fail or proceed without a cache. On second thought you could have a busy loop that will wait for X seconds, then log \u0027still waiting\u0027 and wait some more.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8acc8a919047943b0c23f4f9def4232960d21728","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_c6b754f4","line":81,"updated":"2014-09-16 21:03:12.000000000","message":"It\u0027s probably not a big deal, but by the time we get here it\u0027s possible that we have more than _maxsize. Probably not many more.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c3da232a4a4438f29065c67814bce22bafd7afbb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_af7143aa","line":81,"in_reply_to":"fa98f980_54486e8a","updated":"2014-09-17 00:54:29.000000000","message":"Hmm...I guess even if it does all other greenthreads will block on line 71..","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"8f7b048c635a7f2c7cd7aa3018ee204775dc3a98","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_9a8d862d","line":81,"in_reply_to":"fa98f980_8ec54c0c","updated":"2014-09-17 17:17:55.000000000","message":"What?.. No! We are doing all this under _no_free_condition\u0027s lock. No other thread can do anything with this pool while we\u0027re doing this.\n\nWe don\u0027t need another try-except here. If we failed to create connection, exception is thrown and we never reach line \u0027self._acquired +\u003d 1\u0027, so nothing changes about pool at all.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4b921999c08c515019a59bb4153dd3af42bf484b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_8ec54c0c","line":81,"in_reply_to":"fa98f980_bb58a28b","updated":"2014-09-17 15:17:20.000000000","message":"Depending on how eventlet handles a yield (largely dependent on the memcache lib, which we don\u0027t control, today it doesn\u0027t look like we have that issue, but we should be defensive) we could yeild in the ._create_connection step, which would open the door for another coroutine to create a connection between when we do the check and when another thread attempts the creation.\n\nIt is a minor issue which I\u0027ve addressed with an extra try/except in a later patch (minimal over head).","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"b4ad6eba55ecae3fb01f22d85b83696daf53c3da","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_bb58a28b","line":81,"in_reply_to":"fa98f980_c6b754f4","updated":"2014-09-17 05:41:54.000000000","message":"\u003e it\u0027s possible that we have more than _maxsize\n\nNo, its not. We\u0027re leaving previous loop on one of two conditions: either we have connection in pool or we have some quota to create new connections. So if we failed in try: block, then pool is empty and number of connections currently not in the pool is less than maxsize.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"432d54ea7cac274fada0f32bc9f05e8db8e1ac51","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                conn \u003d self._free_pool.pop().connection"},{"line_number":79,"context_line":"            except IndexError:"},{"line_number":80,"context_line":"                # No free connections, create a new one."},{"line_number":81,"context_line":"                conn \u003d self._create_connection()"},{"line_number":82,"context_line":"                self._debug_logger(\u0027Created a new connection %s\u0027, id(conn))"},{"line_number":83,"context_line":"            self._acquired +\u003d 1"},{"line_number":84,"context_line":"            self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa98f980_54486e8a","line":81,"in_reply_to":"fa98f980_c6b754f4","updated":"2014-09-16 21:13:09.000000000","message":"I think we\u0027re mostly ok here. We might leak a little over the top, but we\u0027re still talking coroutines in eventlet and we should be mostly safe on that front since the coroutine *probably* wont yield in this creation loop.","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b6991cbb7d5977d8750c4865e77d97bcfc0a6362","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                               if a client connection object has been in the"},{"line_number":60,"context_line":"                               pool for longer than the unused_timeout and has"},{"line_number":61,"context_line":"                               not been used, it will be reaped. This is to"},{"line_number":62,"context_line":"                               ensure resources are released as possible when"},{"line_number":63,"context_line":"                               utilization goes down."},{"line_number":64,"context_line":"        :type unused_timeout: int"},{"line_number":65,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_7afe22b0","line":62,"updated":"2014-09-17 17:28:06.000000000","message":"as soon as possible?","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8fbe7f34996ab04c774003655530e26d6bbbe30","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                               if a client connection object has been in the"},{"line_number":60,"context_line":"                               pool for longer than the unused_timeout and has"},{"line_number":61,"context_line":"                               not been used, it will be reaped. This is to"},{"line_number":62,"context_line":"                               ensure resources are released as possible when"},{"line_number":63,"context_line":"                               utilization goes down."},{"line_number":64,"context_line":"        :type unused_timeout: int"},{"line_number":65,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_7c0a9f28","line":62,"in_reply_to":"fa98f980_7afe22b0","updated":"2014-09-17 18:30:28.000000000","message":"This is really an idle timeout. So connection that haven\u0027t been used in unused_timeout seconds may be reaped. Right now that\u0027s implemented during the connection release. So everytime a connection is released we check to see if any can be removed.","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b56b624bbef1355922137548f5b79b35766f8d28","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                               if a client connection object has been in the"},{"line_number":60,"context_line":"                               pool for longer than the unused_timeout and has"},{"line_number":61,"context_line":"                               not been used, it will be reaped. This is to"},{"line_number":62,"context_line":"                               ensure resources are released as possible when"},{"line_number":63,"context_line":"                               utilization goes down."},{"line_number":64,"context_line":"        :type unused_timeout: int"},{"line_number":65,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_bf1b1972","line":62,"in_reply_to":"fa98f980_7afe22b0","updated":"2014-09-17 18:28:36.000000000","message":"nope, they are released as they are unused. probably could be better phrased.","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b6991cbb7d5977d8750c4865e77d97bcfc0a6362","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @abc.abstractmethod"},{"line_number":73,"context_line":"    def _create_connection(self):"},{"line_number":74,"context_line":"        raise NotImplementedError"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @abc.abstractmethod"},{"line_number":77,"context_line":"    def _destroy_connection(self, conn):"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_9ad10632","line":74,"updated":"2014-09-17 17:28:06.000000000","message":"How about raise exception.NotImplemented() ?","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b56b624bbef1355922137548f5b79b35766f8d28","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @abc.abstractmethod"},{"line_number":73,"context_line":"    def _create_connection(self):"},{"line_number":74,"context_line":"        raise NotImplementedError"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @abc.abstractmethod"},{"line_number":77,"context_line":"    def _destroy_connection(self, conn):"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_5f24edae","line":74,"in_reply_to":"fa98f980_9ad10632","updated":"2014-09-17 18:28:36.000000000","message":"Sure. However, you can\u0027t instantiate this class or a subclass without overriding/redefining the method (Same for below)","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8fbe7f34996ab04c774003655530e26d6bbbe30","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @abc.abstractmethod"},{"line_number":73,"context_line":"    def _create_connection(self):"},{"line_number":74,"context_line":"        raise NotImplementedError"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @abc.abstractmethod"},{"line_number":77,"context_line":"    def _destroy_connection(self, conn):"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_9f3c95c1","line":74,"in_reply_to":"fa98f980_9ad10632","updated":"2014-09-17 18:30:28.000000000","message":"That is an exception to say a Keystone feature isn\u0027t implemented which is a different error.","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b6991cbb7d5977d8750c4865e77d97bcfc0a6362","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @abc.abstractmethod"},{"line_number":77,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":78,"context_line":"        raise NotImplementedError"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"},{"line_number":81,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_bad6ca25","line":78,"updated":"2014-09-17 17:28:06.000000000","message":"How about raise exception.NotImplemented() ?","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8fbe7f34996ab04c774003655530e26d6bbbe30","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @abc.abstractmethod"},{"line_number":77,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":78,"context_line":"        raise NotImplementedError"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"},{"line_number":81,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa98f980_ff7201af","line":78,"in_reply_to":"fa98f980_bad6ca25","updated":"2014-09-17 18:30:28.000000000","message":"Same here.","commit_id":"c3ec76972c2dca436ca08ba3916fea84c5f02163"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b1d4df69754af36b88811953397d4e235c2eaed8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                               pool for longer than the unused_timeout and has"},{"line_number":62,"context_line":"                               not been used, it will be reaped. This is to"},{"line_number":63,"context_line":"                               ensure resources are released as possible when"},{"line_number":64,"context_line":"                               utilization goes down."},{"line_number":65,"context_line":"        :type unused_timeout: int"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        super(ConnectionPool, self).__init__(maxsize)"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa98f980_45aa5a86","line":64,"updated":"2014-09-17 20:16:52.000000000","message":"(NIT): should rephrase this to be a bit more clear. It works but if we have subsequent patches lets clean it up.\n\nPulled forward from previous comment.","commit_id":"35e8d1a9628347afc618fbf9e41e514a9bb9d1b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8799ba5f9f852b183e9225a29b2744fefb60c5e3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                               goes down."},{"line_number":62,"context_line":"        :type unused_timeout: int"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        super(ConnectionPool, self).__init__(maxsize)"},{"line_number":65,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":66,"context_line":"        self._acquired \u003d 0"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"fa98f980_cb2adb8f","line":64,"updated":"2014-09-17 22:11:59.000000000","message":"The super\u0027s need to go if this is to be used in Apache.","commit_id":"30dedada763c2760c40137eba939161ac4bb6d2c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8799ba5f9f852b183e9225a29b2744fefb60c5e3","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.put(conn)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _qsize(self):"},{"line_number":93,"context_line":"        return self.maxsize - self._acquired"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":96,"context_line":"        qsize \u003d _qsize"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa98f980_2bfd276f","line":93,"updated":"2014-09-17 22:11:59.000000000","message":"Why isn\u0027t this \u0027return queue.Queue._qsize(self) + self._acquired\u0027? That would actually represent the number of things in the queue?","commit_id":"30dedada763c2760c40137eba939161ac4bb6d2c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c3734773486db73b1f3c6eef6426069a5c76bdbf","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.put(conn)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _qsize(self):"},{"line_number":93,"context_line":"        return self.maxsize - self._acquired"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":96,"context_line":"        qsize \u003d _qsize"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa98f980_b6533ee1","line":93,"in_reply_to":"fa98f980_2bfd276f","updated":"2014-09-17 22:34:26.000000000","message":"No, so this is just mind bending logic. Event with nothing in the queue it will report as full until a new client is created. Then it reports as maxsize-1. The _get will realize that event though the queue says it\u0027s full that it need to create a client. This in turn allows the pool.put to work.","commit_id":"30dedada763c2760c40137eba939161ac4bb6d2c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0139c108d4c3bb923b2f6462ee65b317fd5187e8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        except queue.Empty:"},{"line_number":99,"context_line":"            raise exception.UnexpectedError("},{"line_number":100,"context_line":"                _(\u0027Unable to get a connection from pool id %(id)s after \u0027"},{"line_number":101,"context_line":"                  \u0027%(seconds)s seconds.\u0027) %"},{"line_number":102,"context_line":"                {\u0027id\u0027: id(self), \u0027seconds\u0027: self._connection_get_timeout})"},{"line_number":103,"context_line":"        self._debug_logger(\u0027Acquired connection %s\u0027, id(conn))"},{"line_number":104,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa98f980_11933450","line":101,"updated":"2014-09-18 00:06:36.000000000","message":"This requires a string freeze exception. I\u0027ll send the email once we\u0027re sure this is desired/and happy with the rest of the code.","commit_id":"429b8c73e0ff618eb2cf22cd230aafcca087b843"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"38e8ae4e8632104b271bae72721461acddb50779","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def _qsize(self):"},{"line_number":111,"context_line":"        return self.maxsize - self._acquired"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":114,"context_line":"        qsize \u003d _qsize"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"da9df570_5199746d","line":113,"updated":"2014-09-19 22:03:13.000000000","message":"(nit) if we have to push again we may want a note saying this is for the difference in interface between eventlet and stdlib\u0027s queue implementation.","commit_id":"429b8c73e0ff618eb2cf22cd230aafcca087b843"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5909016a24bd45e75f59c8463dbed6b53e7b57fb","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def _qsize(self):"},{"line_number":111,"context_line":"        return self.maxsize - self._acquired"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":114,"context_line":"        qsize \u003d _qsize"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"da9df570_94882ac8","line":113,"in_reply_to":"da9df570_5199746d","updated":"2014-09-19 22:17:35.000000000","message":"makes sense.","commit_id":"429b8c73e0ff618eb2cf22cd230aafcca087b843"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":38,"context_line":"# NOTE(morganfainberg): This is used as the maximum number of seconds a get"},{"line_number":39,"context_line":"# of a new connection will wait for before raising an exception indicating"},{"line_number":40,"context_line":"# a serious / most likely non-recoverable delay has occurred."},{"line_number":41,"context_line":"CONNECTION_GET_TIMEOUT \u003d 120"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# This \u0027class\u0027 is taken from http://stackoverflow.com/a/22520633/238308"},{"line_number":44,"context_line":"# Don\u0027t inherit client from threading.local so that we can reuse clients in"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_58895125","line":41,"updated":"2014-09-23 20:19:27.000000000","message":"This is unused. Remove it.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":38,"context_line":"# NOTE(morganfainberg): This is used as the maximum number of seconds a get"},{"line_number":39,"context_line":"# of a new connection will wait for before raising an exception indicating"},{"line_number":40,"context_line":"# a serious / most likely non-recoverable delay has occurred."},{"line_number":41,"context_line":"CONNECTION_GET_TIMEOUT \u003d 120"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# This \u0027class\u0027 is taken from http://stackoverflow.com/a/22520633/238308"},{"line_number":44,"context_line":"# Don\u0027t inherit client from threading.local so that we can reuse clients in"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_bafaccba","line":41,"in_reply_to":"da9df570_58895125","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                 indefinite."},{"line_number":73,"context_line":"        :type conn_get_timeout: int"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        queue.Queue.__init__(self, maxsize)"},{"line_number":76,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":77,"context_line":"        self._connection_get_timeout \u003d conn_get_timeout"},{"line_number":78,"context_line":"        self._acquired \u003d 0"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_d86d4134","line":75,"updated":"2014-09-23 20:19:27.000000000","message":"use super() here","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                 indefinite."},{"line_number":73,"context_line":"        :type conn_get_timeout: int"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        queue.Queue.__init__(self, maxsize)"},{"line_number":76,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":77,"context_line":"        self._connection_get_timeout \u003d conn_get_timeout"},{"line_number":78,"context_line":"        self._acquired \u003d 0"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_bae80ce3","line":75,"in_reply_to":"da9df570_d86d4134","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ab91651cc5b20b5fe4de783165d02f5dde26113d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                 indefinite."},{"line_number":73,"context_line":"        :type conn_get_timeout: int"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        queue.Queue.__init__(self, maxsize)"},{"line_number":76,"context_line":"        self._unused_timeout \u003d unused_timeout"},{"line_number":77,"context_line":"        self._connection_get_timeout \u003d conn_get_timeout"},{"line_number":78,"context_line":"        self._acquired \u003d 0"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_f55f070d","line":75,"in_reply_to":"da9df570_d86d4134","updated":"2014-09-26 15:32:51.000000000","message":"Same as other comments to super.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._connection_get_timeout \u003d conn_get_timeout"},{"line_number":78,"context_line":"        self._acquired \u003d 0"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _create_connection(self):"},{"line_number":81,"context_line":"        raise NotImplementedError"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _destroy_connection(self, conn):"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_78645549","line":80,"updated":"2014-09-23 20:19:27.000000000","message":"add a docstring what this is supposed to do. e.g., if this is supposed to be overwritten to return a connection, document that.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def _create_connection(self):"},{"line_number":81,"context_line":"        raise NotImplementedError"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _destroy_connection(self, conn):"},{"line_number":84,"context_line":"        raise NotImplementedError"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _debug_logger(self, msg, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_985bb986","line":83,"updated":"2014-09-23 20:19:27.000000000","message":"add a docstring what this is supposed to do.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def _qsize(self):"},{"line_number":111,"context_line":"        return self.maxsize - self._acquired"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":114,"context_line":"        qsize \u003d _qsize"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_a3a68e0e","line":113,"updated":"2014-09-23 20:19:27.000000000","message":"add a comment why this is here.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    if not hasattr(queue.Queue, \u0027_qsize\u0027):"},{"line_number":114,"context_line":"        qsize \u003d _qsize"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get(self):"},{"line_number":117,"context_line":"        if self.queue:"},{"line_number":118,"context_line":"            conn \u003d self.queue.pop().connection"},{"line_number":119,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_a3de8e3d","line":116,"updated":"2014-09-23 20:19:27.000000000","message":"this could use a docstring if you\u0027re expecting subclasses to override.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self._acquired +\u003d 1"},{"line_number":122,"context_line":"        return conn"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _put(self, conn):"},{"line_number":125,"context_line":"        self.queue.append(_PoolItem("},{"line_number":126,"context_line":"            ttl\u003dtime.time() + self._unused_timeout,"},{"line_number":127,"context_line":"            connection\u003dconn,"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_c3e1d2ff","line":124,"updated":"2014-09-23 20:19:27.000000000","message":"this could use a docstring if you\u0027re expecting subclasses to override.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            connection\u003dconn,"},{"line_number":128,"context_line":"        ))"},{"line_number":129,"context_line":"        self._acquired -\u003d 1"},{"line_number":130,"context_line":"        # Drop all expired connections from the right end of the queue"},{"line_number":131,"context_line":"        now \u003d time.time()"},{"line_number":132,"context_line":"        while self.queue and self.queue[0].ttl \u003c now:"},{"line_number":133,"context_line":"            conn \u003d self.queue.popleft().connection"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_633826a1","line":130,"updated":"2014-09-23 20:19:27.000000000","message":"rather than have to comment some section of code, put it in a function.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            connection\u003dconn,"},{"line_number":128,"context_line":"        ))"},{"line_number":129,"context_line":"        self._acquired -\u003d 1"},{"line_number":130,"context_line":"        # Drop all expired connections from the right end of the queue"},{"line_number":131,"context_line":"        now \u003d time.time()"},{"line_number":132,"context_line":"        while self.queue and self.queue[0].ttl \u003c now:"},{"line_number":133,"context_line":"            conn \u003d self.queue.popleft().connection"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_1a9af86d","line":130,"in_reply_to":"da9df570_633826a1","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            self._destroy_connection(conn)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"class MemcacheClientPool(ConnectionPool):"},{"line_number":139,"context_line":"    def __init__(self, urls, arguments, **kwargs):"},{"line_number":140,"context_line":"        ConnectionPool.__init__(self, **kwargs)"},{"line_number":141,"context_line":"        self.urls \u003d urls"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_635f46e6","line":138,"updated":"2014-09-23 20:19:27.000000000","message":"This class could use a docstring.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"class MemcacheClientPool(ConnectionPool):"},{"line_number":139,"context_line":"    def __init__(self, urls, arguments, **kwargs):"},{"line_number":140,"context_line":"        ConnectionPool.__init__(self, **kwargs)"},{"line_number":141,"context_line":"        self.urls \u003d urls"},{"line_number":142,"context_line":"        self._arguments \u003d arguments"},{"line_number":143,"context_line":"        # NOTE(morganfainberg): The host objects expect an int for the"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_5a964040","line":140,"updated":"2014-09-26 15:33:49.000000000","message":"use super()","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        conn.disconnect_all()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get(self):"},{"line_number":155,"context_line":"        conn \u003d ConnectionPool._get(self)"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            # Propagate host state known to us to this client\u0027s list"},{"line_number":158,"context_line":"            now \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_c32ab22b","line":155,"updated":"2014-09-23 20:19:27.000000000","message":"use super()","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        conn.disconnect_all()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get(self):"},{"line_number":155,"context_line":"        conn \u003d ConnectionPool._get(self)"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            # Propagate host state known to us to this client\u0027s list"},{"line_number":158,"context_line":"            now \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_1aa83876","line":155,"in_reply_to":"da9df570_c32ab22b","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5dfbb7ff054337e887b8b55f241242c1fb59f11c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        conn.disconnect_all()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get(self):"},{"line_number":155,"context_line":"        conn \u003d ConnectionPool._get(self)"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            # Propagate host state known to us to this client\u0027s list"},{"line_number":158,"context_line":"            now \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_da7a3023","line":155,"in_reply_to":"da9df570_c32ab22b","updated":"2014-09-26 15:12:44.000000000","message":"Queue is an old style class. Super cannot be used.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                if deaduntil \u003e now and host.deaduntil \u003c\u003d now:"},{"line_number":161,"context_line":"                    host.mark_dead(\u0027propagating death mark from the pool\u0027)"},{"line_number":162,"context_line":"                host.deaduntil \u003d deaduntil"},{"line_number":163,"context_line":"        except Exception:"},{"line_number":164,"context_line":"            # We need to be sure that connection doesn\u0027t leak from the pool."},{"line_number":165,"context_line":"            # This code runs before we enter context manager\u0027s try-finally"},{"line_number":166,"context_line":"            # block, so we need to explicitly release it here"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_63a2e6af","line":163,"updated":"2014-09-23 20:19:27.000000000","message":"use finally","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            # We need to be sure that connection doesn\u0027t leak from the pool."},{"line_number":165,"context_line":"            # This code runs before we enter context manager\u0027s try-finally"},{"line_number":166,"context_line":"            # block, so we need to explicitly release it here"},{"line_number":167,"context_line":"            ConnectionPool._put(self, conn)"},{"line_number":168,"context_line":"            raise"},{"line_number":169,"context_line":"        return conn"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_e320964b","line":167,"updated":"2014-09-23 20:19:27.000000000","message":"use super()","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            # We need to be sure that connection doesn\u0027t leak from the pool."},{"line_number":165,"context_line":"            # This code runs before we enter context manager\u0027s try-finally"},{"line_number":166,"context_line":"            # block, so we need to explicitly release it here"},{"line_number":167,"context_line":"            ConnectionPool._put(self, conn)"},{"line_number":168,"context_line":"            raise"},{"line_number":169,"context_line":"        return conn"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_3adfbc0e","line":167,"in_reply_to":"da9df570_e320964b","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5dfbb7ff054337e887b8b55f241242c1fb59f11c","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            # We need to be sure that connection doesn\u0027t leak from the pool."},{"line_number":165,"context_line":"            # This code runs before we enter context manager\u0027s try-finally"},{"line_number":166,"context_line":"            # block, so we need to explicitly release it here"},{"line_number":167,"context_line":"            ConnectionPool._put(self, conn)"},{"line_number":168,"context_line":"            raise"},{"line_number":169,"context_line":"        return conn"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_fa73744b","line":167,"in_reply_to":"da9df570_e320964b","updated":"2014-09-26 15:12:44.000000000","message":"Same as above","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # such in our internal list"},{"line_number":175,"context_line":"            now \u003d time.time()"},{"line_number":176,"context_line":"            for i, deaduntil, host in zip(itertools.count(),"},{"line_number":177,"context_line":"                                          self._hosts_deaduntil,"},{"line_number":178,"context_line":"                                          conn.servers):"},{"line_number":179,"context_line":"                # Do nothing if we already know this host is dead"},{"line_number":180,"context_line":"                if deaduntil \u003c\u003d now:"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_c302b26e","line":177,"updated":"2014-09-23 20:19:27.000000000","message":"this is confusing since we use self._hosts_deaduntil and self._hosts_deaduntil[i]. Would be simpler to not use self._hosts_deaduntil in the if here and always use self._hosts_deaduntil[i] in the loop body.\n\nDo deaduntil \u003d self._hosts_deaduntil[i] in the loop body.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # such in our internal list"},{"line_number":175,"context_line":"            now \u003d time.time()"},{"line_number":176,"context_line":"            for i, deaduntil, host in zip(itertools.count(),"},{"line_number":177,"context_line":"                                          self._hosts_deaduntil,"},{"line_number":178,"context_line":"                                          conn.servers):"},{"line_number":179,"context_line":"                # Do nothing if we already know this host is dead"},{"line_number":180,"context_line":"                if deaduntil \u003c\u003d now:"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_ba400ca6","line":177,"in_reply_to":"da9df570_c302b26e","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            # pass, but will be checking servers as frequent as we can (over"},{"line_number":191,"context_line":"            # way smaller socket_timeout)"},{"line_number":192,"context_line":"            if all(deaduntil \u003e now for deaduntil in self._hosts_deaduntil):"},{"line_number":193,"context_line":"                self._debug_logger(\u0027All hosts are dead. Marking them as live.\u0027)"},{"line_number":194,"context_line":"                self._hosts_deaduntil[:] \u003d [0] * len(self._hosts_deaduntil)"},{"line_number":195,"context_line":"        finally:"},{"line_number":196,"context_line":"            ConnectionPool._put(self, conn)"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_e326d615","line":193,"updated":"2014-09-23 20:19:27.000000000","message":"this is worth more than a debug. I think admins are going to want to know that all their memcache hosts are dead.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                self._debug_logger(\u0027All hosts are dead. Marking them as live.\u0027)"},{"line_number":194,"context_line":"                self._hosts_deaduntil[:] \u003d [0] * len(self._hosts_deaduntil)"},{"line_number":195,"context_line":"        finally:"},{"line_number":196,"context_line":"            ConnectionPool._put(self, conn)"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_231b7e1c","line":196,"updated":"2014-09-23 20:19:27.000000000","message":"use super()","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                self._debug_logger(\u0027All hosts are dead. Marking them as live.\u0027)"},{"line_number":194,"context_line":"                self._hosts_deaduntil[:] \u003d [0] * len(self._hosts_deaduntil)"},{"line_number":195,"context_line":"        finally:"},{"line_number":196,"context_line":"            ConnectionPool._put(self, conn)"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_9a0fc887","line":196,"in_reply_to":"da9df570_231b7e1c","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5dfbb7ff054337e887b8b55f241242c1fb59f11c","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                self._debug_logger(\u0027All hosts are dead. Marking them as live.\u0027)"},{"line_number":194,"context_line":"                self._hosts_deaduntil[:] \u003d [0] * len(self._hosts_deaduntil)"},{"line_number":195,"context_line":"        finally:"},{"line_number":196,"context_line":"            ConnectionPool._put(self, conn)"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_3a917c47","line":196,"in_reply_to":"da9df570_231b7e1c","updated":"2014-09-26 15:12:44.000000000","message":"Same.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}],"keystone/common/cache/backends/_memcache_pool.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"906fb82ae8c5d537a8329b056d0cf2ef40640cca","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import weakref"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import memcache"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_a50a74cf","line":30,"updated":"2014-09-15 16:27:10.000000000","message":"(nit) this needs an extra newline here","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _debug(pool_id, msg, *args, **kwargs):"},{"line_number":35,"context_line":"    thread_id \u003d threading.current_thread().ident"},{"line_number":36,"context_line":"    prefix \u003d \u0027Memcached pool %s, thread %s: \u0027 % (pool_id, thread_id)"},{"line_number":37,"context_line":"    LOG.debug(prefix + msg, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_aff0b191","line":34,"updated":"2014-09-13 02:35:44.000000000","message":"This is still hard to read because of the mixture of boolean \"debug\" and then _debug. Suggest making this _debug_logger to be more descriptive (and the instance properties mirror the name).\n\nThis can be fixed in a followup patch or when we spin this off into it\u0027s own library.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _debug(pool_id, msg, *args, **kwargs):"},{"line_number":35,"context_line":"    thread_id \u003d threading.current_thread().ident"},{"line_number":36,"context_line":"    prefix \u003d \u0027Memcached pool %s, thread %s: \u0027 % (pool_id, thread_id)"},{"line_number":37,"context_line":"    LOG.debug(prefix + msg, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_b2fc6041","line":34,"in_reply_to":"fa98f980_8562d03b","updated":"2014-09-16 10:24:44.000000000","message":"It intentionally have been kept out of ConnectionPool to allow use of this method from background thread.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"906fb82ae8c5d537a8329b056d0cf2ef40640cca","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _debug(pool_id, msg, *args, **kwargs):"},{"line_number":35,"context_line":"    thread_id \u003d threading.current_thread().ident"},{"line_number":36,"context_line":"    prefix \u003d \u0027Memcached pool %s, thread %s: \u0027 % (pool_id, thread_id)"},{"line_number":37,"context_line":"    LOG.debug(prefix + msg, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_8562d03b","line":34,"in_reply_to":"fa98f980_aff0b191","updated":"2014-09-15 16:27:10.000000000","message":"I might take it one step further and make it a method of the ConnectionPool class.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    LOG.debug(prefix + msg, *args, **kwargs)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ConnectionPool(object):"},{"line_number":41,"context_line":"    def __init__(self, maxsize, unused_timeout, debug\u003dFalse):"},{"line_number":42,"context_line":"        self._maxsize \u003d maxsize"},{"line_number":43,"context_line":"        self._unused_timeout \u003d unused_timeout"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_0fe37dd9","line":40,"updated":"2014-09-13 02:35:44.000000000","message":"This *should* be an abstract base class and _create_connection should be an abcmethod.\n\nThis is not something that needs to be fixed before merging. It can occur in either a followup patch or if/when this is spun out into it\u0027s own library.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    LOG.debug(prefix + msg, *args, **kwargs)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class ConnectionPool(object):"},{"line_number":41,"context_line":"    def __init__(self, maxsize, unused_timeout, debug\u003dFalse):"},{"line_number":42,"context_line":"        self._maxsize \u003d maxsize"},{"line_number":43,"context_line":"        self._unused_timeout \u003d unused_timeout"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_b28380a8","line":40,"in_reply_to":"fa98f980_0fe37dd9","updated":"2014-09-16 10:24:44.000000000","message":"Using ABC here seems superfluous given we have only one subclass here.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            args\u003d(self._free_pool, stop_event, no_free_cond, self._debug),"},{"line_number":63,"context_line":"        )"},{"line_number":64,"context_line":"        cleaner_thread.daemon \u003d True"},{"line_number":65,"context_line":"        cleaner_thread.start()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_connection(self):"},{"line_number":68,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_0f31bd59","line":65,"updated":"2014-09-13 02:35:44.000000000","message":"This really generally speaking worries me, spinning up a thread *just* for cleaning it sets a precedent I\u0027d rather not see become a pattern in Keystone as we shouldn\u0027t need this running in a non-eventlet environment.\n\nI\u0027m not opposed to this based upon the need and potential severity of the bug.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc0d0ec9641513cc5367e3f95855c4c720737f62","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            args\u003d(self._free_pool, stop_event, no_free_cond, self._debug),"},{"line_number":63,"context_line":"        )"},{"line_number":64,"context_line":"        cleaner_thread.daemon \u003d True"},{"line_number":65,"context_line":"        cleaner_thread.start()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_connection(self):"},{"line_number":68,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_c05be383","line":65,"in_reply_to":"fa98f980_0f31bd59","updated":"2014-09-15 15:49:43.000000000","message":"if we decide to merge this as is, I think Morgan\u0027s concerns would make for a good inline comment.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            args\u003d(self._free_pool, stop_event, no_free_cond, self._debug),"},{"line_number":63,"context_line":"        )"},{"line_number":64,"context_line":"        cleaner_thread.daemon \u003d True"},{"line_number":65,"context_line":"        cleaner_thread.start()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_connection(self):"},{"line_number":68,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_727038dd","line":65,"in_reply_to":"fa98f980_16045516","updated":"2014-09-16 10:24:44.000000000","message":"Cleaner thread here is not to return connections to the pool. It is here to shrink pool when connections are not used. This way we\u0027ll be able to have enough connections (hundreds?) when we need them but don\u0027t keep these connections around for too long.\n\nIf that\u0027s not needed then we can just create fixed-size pool and live with e.g. 100 extra (idle) connections to memcached for every Keystone process.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0645a19ac8d53463a62d0b36e52ea0baa15a0558","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            args\u003d(self._free_pool, stop_event, no_free_cond, self._debug),"},{"line_number":63,"context_line":"        )"},{"line_number":64,"context_line":"        cleaner_thread.daemon \u003d True"},{"line_number":65,"context_line":"        cleaner_thread.start()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_connection(self):"},{"line_number":68,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_16045516","line":65,"in_reply_to":"fa98f980_c05be383","updated":"2014-09-15 17:03:57.000000000","message":"Is there any reason why this needs a cleanup thread. This to me implies that we can\u0027t be sure that we can return the connection to the pool after a greenlet uses it, but since this is handled in this module as a context manager is it really a problem?","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        cleaner_thread.daemon \u003d True"},{"line_number":65,"context_line":"        cleaner_thread.start()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_connection(self):"},{"line_number":68,"context_line":"        raise NotImplementedError"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    # Need this to be available without reference to self to call it from"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_2f34c148","line":67,"updated":"2014-09-13 02:35:44.000000000","message":"See above comment about ABC classes/abstract methods.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    # cleaner thread"},{"line_number":72,"context_line":"    @classmethod"},{"line_number":73,"context_line":"    def _destroy_connection(cls, conn):"},{"line_number":74,"context_line":"        raise NotImplementedError"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def acquire(self):"},{"line_number":77,"context_line":"        with self._no_free:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_4fe905b6","line":74,"updated":"2014-09-13 02:35:44.000000000","message":"Based on the implementation, this could simply do \u0027pass\u0027 and let a pool that needs to override it do so. Second this appears to be an @staticmethod not an @classmethod.\n\nThis can be fixed later as a followup *or* a when this is spun off into a library in K cycle.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    # cleaner thread"},{"line_number":72,"context_line":"    @classmethod"},{"line_number":73,"context_line":"    def _destroy_connection(cls, conn):"},{"line_number":74,"context_line":"        raise NotImplementedError"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def acquire(self):"},{"line_number":77,"context_line":"        with self._no_free:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_1248cc89","line":74,"in_reply_to":"fa98f980_4fe905b6","updated":"2014-09-16 10:24:44.000000000","message":"It should be a class method to allow subclasses use their class methods here. Yes, \u0027pass\u0027 would be enough here.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                self._no_free.wait()"},{"line_number":82,"context_line":"            try:"},{"line_number":83,"context_line":"                # Hope there\u0027s a free one"},{"line_number":84,"context_line":"                _, conn \u003d self._free_pool.pop()"},{"line_number":85,"context_line":"            except IndexError:"},{"line_number":86,"context_line":"                # Create a new one"},{"line_number":87,"context_line":"                conn \u003d self._create_connection()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_8f3ccd30","line":84,"updated":"2014-09-13 02:35:44.000000000","message":"Do not use \u0027_\u0027 as an unused name binding, we use _ for gettext translations on exceptions.\n\nThis should be fixed in a followup patch before RC is cut if not fixed here.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        with self._no_free:"},{"line_number":95,"context_line":"            self._debug(\u0027Releasing connection %s\u0027, id(conn))"},{"line_number":96,"context_line":"            # Return connection to pool"},{"line_number":97,"context_line":"            self._free_pool.append((time.time() + self._unused_timeout, conn))"},{"line_number":98,"context_line":"            self._acquired -\u003d 1"},{"line_number":99,"context_line":"            # Notify waiting getters and cleaner"},{"line_number":100,"context_line":"            self._no_free.notify_all()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_6f4169a8","line":97,"updated":"2014-09-13 02:35:44.000000000","message":"Suggest making this a house-keeping object instead of explicitly a tuple each time, it makes the .pop not require the \u0027_\u0027 unused value and would make it so it\u0027s clear you\u0027re looking for \u0027pool_connection_object.conn\u0027 and can look at \u0027pool_connection_object.timeout\u0027 or similar instead of needing the indexable item.\n\nThis can be fixed in a followup patch or when spun off to a dedicated lib.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        with self._no_free:"},{"line_number":95,"context_line":"            self._debug(\u0027Releasing connection %s\u0027, id(conn))"},{"line_number":96,"context_line":"            # Return connection to pool"},{"line_number":97,"context_line":"            self._free_pool.append((time.time() + self._unused_timeout, conn))"},{"line_number":98,"context_line":"            self._acquired -\u003d 1"},{"line_number":99,"context_line":"            # Notify waiting getters and cleaner"},{"line_number":100,"context_line":"            self._no_free.notify_all()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_72475878","line":97,"in_reply_to":"fa98f980_6f4169a8","updated":"2014-09-16 10:24:44.000000000","message":"Yes, I thought about using namedtuple here instead.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"906fb82ae8c5d537a8329b056d0cf2ef40640cca","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            for _, conn in to_close:"},{"line_number":158,"context_line":"                cls._destroy_connection(conn)"},{"line_number":159,"context_line":"                debug(\u0027Cleaner: Destroyed connection %s\u0027, id(conn))"},{"line_number":160,"context_line":"            del to_close"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class DumbPool(ConnectionPool):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_8591f048","line":160,"updated":"2014-09-15 16:27:10.000000000","message":"Is this del significant? I would think that the garbage collection would be sufficient and if now wouldn\u0027t you need to also del the conn reference?","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            for _, conn in to_close:"},{"line_number":158,"context_line":"                cls._destroy_connection(conn)"},{"line_number":159,"context_line":"                debug(\u0027Cleaner: Destroyed connection %s\u0027, id(conn))"},{"line_number":160,"context_line":"            del to_close"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class DumbPool(ConnectionPool):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_b21f0070","line":160,"in_reply_to":"fa98f980_8591f048","updated":"2014-09-16 10:24:44.000000000","message":"Yes, it is. This thread will sleep for most of the time and keeping reference to connections around might use significant amount of resources. conn should be del\u0027ed here to.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0645a19ac8d53463a62d0b36e52ea0baa15a0558","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            with self._no_free:"},{"line_number":200,"context_line":"                # Propagate host state known to us to this client\u0027s list"},{"line_number":201,"context_line":"                now \u003d time.time()"},{"line_number":202,"context_line":"                for deaduntil, host in zip(self._hosts_deaduntil,"},{"line_number":203,"context_line":"                                           conn.servers):"},{"line_number":204,"context_line":"                    if deaduntil \u003e now and host.deaduntil \u003c\u003d now:"},{"line_number":205,"context_line":"                        host.mark_dead(\u0027propagating death mark from the pool\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_f1143b45","line":202,"updated":"2014-09-15 17:03:57.000000000","message":"Does our memcached library not do this for us?","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            with self._no_free:"},{"line_number":200,"context_line":"                # Propagate host state known to us to this client\u0027s list"},{"line_number":201,"context_line":"                now \u003d time.time()"},{"line_number":202,"context_line":"                for deaduntil, host in zip(self._hosts_deaduntil,"},{"line_number":203,"context_line":"                                           conn.servers):"},{"line_number":204,"context_line":"                    if deaduntil \u003e now and host.deaduntil \u003c\u003d now:"},{"line_number":205,"context_line":"                        host.mark_dead(\u0027propagating death mark from the pool\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_b2062020","line":202,"in_reply_to":"fa98f980_f1143b45","updated":"2014-09-16 10:24:44.000000000","message":"No, it doesn\u0027t. Here we propagate same values for deaduntil\u0027s to all Client instances we have in the pool.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"}],"keystone/common/cache/backends/memcache_pool.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3b803afb9e8567d8e66f36250e109d75d59d4705","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                free_pool[:] \u003d []"},{"line_number":122,"context_line":"                return to_close"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        _debug(\"Cleaner: Started\")"},{"line_number":125,"context_line":"        # We\u0027ll exit when stop_event is fired and the pool is empty"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            _debug(\"Cleaner: Getting wakeup time\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_53a7c4bc","line":124,"updated":"2014-09-05 19:41:24.000000000","message":"the first arg to _debug is the pool_id.","commit_id":"ca1ee7c65d6691d5f83f0c4f0476139c6c09af02"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"48a56491a8fded34c9e6be2dec87f996c24772d8","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                free_pool[:] \u003d []"},{"line_number":122,"context_line":"                return to_close"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        _debug(\"Cleaner: Started\")"},{"line_number":125,"context_line":"        # We\u0027ll exit when stop_event is fired and the pool is empty"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            _debug(\"Cleaner: Getting wakeup time\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_7343e86b","line":124,"in_reply_to":"fa98f980_53a7c4bc","updated":"2014-09-05 19:52:13.000000000","message":"It\u0027s _debug from _cleaner\u0027s args. It\u0027s a bit confusing, yeah.","commit_id":"ca1ee7c65d6691d5f83f0c4f0476139c6c09af02"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"58751a6a630394b175710aa58d0d5bf4a3e81fe2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                free_pool[:] \u003d []"},{"line_number":122,"context_line":"                return to_close"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        _debug(\"Cleaner: Started\")"},{"line_number":125,"context_line":"        # We\u0027ll exit when stop_event is fired and the pool is empty"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            _debug(\"Cleaner: Getting wakeup time\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_fbe08398","line":124,"in_reply_to":"fa98f980_7343e86b","updated":"2014-09-06 22:33:14.000000000","message":"I renamed this to be less confusing in the next patchset.","commit_id":"ca1ee7c65d6691d5f83f0c4f0476139c6c09af02"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3439d10a391a0105e405f18c862277e9faee06cf","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                        host.dead_until \u003d deaduntil"},{"line_number":199,"context_line":"        except Exception:"},{"line_number":200,"context_line":"            # FIXME(morganfainberg): are there exceptions that should not be"},{"line_number":201,"context_line":"            # caught here? This is too broad of an exception case."},{"line_number":202,"context_line":"            super(MemcacheClientPool, self).release(conn)"},{"line_number":203,"context_line":"            raise"},{"line_number":204,"context_line":"        return conn"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_3b992b20","line":201,"updated":"2014-09-06 22:44:48.000000000","message":"Look into this FIXME","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6edb4d831e882e145c9a6dab733f00b406e8e70a","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                        host.dead_until \u003d deaduntil"},{"line_number":199,"context_line":"        except Exception:"},{"line_number":200,"context_line":"            # FIXME(morganfainberg): are there exceptions that should not be"},{"line_number":201,"context_line":"            # caught here? This is too broad of an exception case."},{"line_number":202,"context_line":"            super(MemcacheClientPool, self).release(conn)"},{"line_number":203,"context_line":"            raise"},{"line_number":204,"context_line":"        return conn"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_8f71eae2","line":201,"in_reply_to":"fa98f980_3b992b20","updated":"2014-09-07 15:40:32.000000000","message":"Nah, we should ensure that we release connection we\u0027ve acquired from parent pool. Otherwise this connection will just leak and pool capacity will shrink. It\u0027s like we had this logic with the parent class:\n\n    conn \u003d pool.acquire()\n    try:\n        \u003cdo_smth\u003e\n    finally:\n        pool.release(conn)\n\nAnd now we want to put smth before try: block. We need to be sure we either enter try: block and finally: block gets executed or we release connection ourselves on any error.\n\nAlthough there should be no exceptions here at all, I\u0027d prefer to avoid possible leakage.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0dfb05a12ddf2462dff5f1a30c474d2032dd3ca6","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                        host.dead_until \u003d deaduntil"},{"line_number":199,"context_line":"        except Exception:"},{"line_number":200,"context_line":"            # FIXME(morganfainberg): are there exceptions that should not be"},{"line_number":201,"context_line":"            # caught here? This is too broad of an exception case."},{"line_number":202,"context_line":"            super(MemcacheClientPool, self).release(conn)"},{"line_number":203,"context_line":"            raise"},{"line_number":204,"context_line":"        return conn"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_edf35e9d","line":201,"in_reply_to":"fa98f980_8f71eae2","updated":"2014-09-07 18:58:04.000000000","message":"Please update the FIXME with a NOTE then to cover why we handle all exceptions.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3439d10a391a0105e405f18c862277e9faee06cf","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def __init__(self, client_pool):"},{"line_number":227,"context_line":"        self.client_pool \u003d client_pool"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _run_method(self, __name, *args, **kwargs):"},{"line_number":230,"context_line":"        with self.client_pool.get() as client:"},{"line_number":231,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_dbfadf42","line":229,"updated":"2014-09-06 22:44:48.000000000","message":"(NIT): use of __name is probably not needed, simply calling this \"name\" is probably sufficient.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0dfb05a12ddf2462dff5f1a30c474d2032dd3ca6","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def __init__(self, client_pool):"},{"line_number":227,"context_line":"        self.client_pool \u003d client_pool"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _run_method(self, __name, *args, **kwargs):"},{"line_number":230,"context_line":"        with self.client_pool.get() as client:"},{"line_number":231,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_0df18295","line":229,"in_reply_to":"fa98f980_cd493a34","updated":"2014-09-07 18:58:04.000000000","message":"I\u0027ve never liked the use of the magic rename in python, i don\u0027t disagree with your argument. This can be left.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2e68aa9eb55bfbb1d82850702a3308d7c0960a76","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def __init__(self, client_pool):"},{"line_number":227,"context_line":"        self.client_pool \u003d client_pool"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _run_method(self, __name, *args, **kwargs):"},{"line_number":230,"context_line":"        with self.client_pool.get() as client:"},{"line_number":231,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_d207191c","line":229,"in_reply_to":"fa98f980_cf7212e3","updated":"2014-09-07 17:52:31.000000000","message":"suggest something that doesn\u0027t confuse then, \"fn_name\"? just like the _debug was confusing in the previous patchset, this will be generally not as easy to read.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"492d40412e7a8cdbe0215f1fb1b1e2898d7f512f","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def __init__(self, client_pool):"},{"line_number":227,"context_line":"        self.client_pool \u003d client_pool"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _run_method(self, __name, *args, **kwargs):"},{"line_number":230,"context_line":"        with self.client_pool.get() as client:"},{"line_number":231,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_cd493a34","line":229,"in_reply_to":"fa98f980_d207191c","updated":"2014-09-07 18:24:51.000000000","message":"Well, _debug was confusing because of masquerading global name. This one doesn\u0027t mask anything, and gives 100% guarantees it won\u0027t accidentally ruin function call with non-obvious error. I see \"fn_name\" just as readable as \"__name\" but w/o those guarantees.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6edb4d831e882e145c9a6dab733f00b406e8e70a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def __init__(self, client_pool):"},{"line_number":227,"context_line":"        self.client_pool \u003d client_pool"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _run_method(self, __name, *args, **kwargs):"},{"line_number":230,"context_line":"        with self.client_pool.get() as client:"},{"line_number":231,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_cf7212e3","line":229,"in_reply_to":"fa98f980_dbfadf42","updated":"2014-09-07 15:40:32.000000000","message":"If we use \"name\" here, we can\u0027t use \"name\" arg in kwargs, hence relying on magic renaming.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3439d10a391a0105e405f18c862277e9faee06cf","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            maxsize\u003darguments.get(\u0027pool_maxsize\u0027, 10),"},{"line_number":248,"context_line":"            unused_timeout\u003darguments.get(\u0027pool_unused_timeout\u0027, 60),"},{"line_number":249,"context_line":"            debug\u003darguments.get(\u0027pool_debug\u0027, False),"},{"line_number":250,"context_line":"        )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    # Since all methods in backend just call one of methods of client, this"},{"line_number":253,"context_line":"    # lets us avoid need to hack it too much"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_bbfd1b3e","line":250,"updated":"2014-09-06 22:44:48.000000000","message":"The pool should probably only be used under eventlet not under apache. we should ensure that we only do the pool logic when we patch eventlet. otherwise the threadlocal implementation is sufficient (and even may be desireable).\n\nI am unsure if we can isolate to eventlet-only runtime.","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6edb4d831e882e145c9a6dab733f00b406e8e70a","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            maxsize\u003darguments.get(\u0027pool_maxsize\u0027, 10),"},{"line_number":248,"context_line":"            unused_timeout\u003darguments.get(\u0027pool_unused_timeout\u0027, 60),"},{"line_number":249,"context_line":"            debug\u003darguments.get(\u0027pool_debug\u0027, False),"},{"line_number":250,"context_line":"        )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    # Since all methods in backend just call one of methods of client, this"},{"line_number":253,"context_line":"    # lets us avoid need to hack it too much"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_ef56f629","line":250,"in_reply_to":"fa98f980_bbfd1b3e","updated":"2014-09-07 15:40:32.000000000","message":"Pool still provides benefits to threading-based server. Although there is small overhead (negligible compared to network interaction), we also gain propagation of \"dead\" hosts and better connection reuse (the same connection can be used by another thread while owner thread sleeps in DB access, for example).","commit_id":"7a5367ccbd34a05bc8b63266e14952e926b9731b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67740164d82b3166378d3a5491a74d546dc36b12","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from dogpile.cache.backends import memcached as memcached_backend"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from keystone.common.cache.backends import _memcache_pool"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_4f0e658d","line":24,"updated":"2014-09-13 02:35:44.000000000","message":"(NIT): Extra whitespace line needed here above LOG","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"906fb82ae8c5d537a8329b056d0cf2ef40640cca","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __getattr__(self, name):"},{"line_number":38,"context_line":"        return functools.partial(self._run_method, name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class PooledMemcachedBackend(memcached_backend.MemcachedBackend):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_851490a0","line":38,"updated":"2014-09-15 16:27:10.000000000","message":"Is it possible that this is too brittle? I think this is wrapping the backend and if it is what happens when an object asks the proxy for something that isn\u0027t a callable. Right now there appear to be one public property: http://dogpilecache.readthedocs.org/en/latest/api.html#backend-api","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d6470a330e3a8d94533fdb2f51c72fb62bf8ca55","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            return getattr(client, __name)(*args, **kwargs)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __getattr__(self, name):"},{"line_number":38,"context_line":"        return functools.partial(self._run_method, name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class PooledMemcachedBackend(memcached_backend.MemcachedBackend):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_d2e2c49f","line":38,"in_reply_to":"fa98f980_851490a0","updated":"2014-09-16 10:24:44.000000000","message":"We wrap every call to memcache.Client instances, not to dogpile\u0027s backend. So we need to fetch new Client from the pool for every get/set/whatever.","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.client_pool \u003d _memcache_pool.MemcacheClientPool("},{"line_number":47,"context_line":"            self.url,"},{"line_number":48,"context_line":"            arguments\u003d{"},{"line_number":49,"context_line":"                \u0027dead_retry\u0027: arguments.get(\u0027dead_retry\u0027, 5 * 60),"},{"line_number":50,"context_line":"                \u0027socket_timeout\u0027: arguments.get(\u0027socket_timeout\u0027, 3),"},{"line_number":51,"context_line":"            },"},{"line_number":52,"context_line":"            maxsize\u003darguments.get(\u0027pool_maxsize\u0027, 10),"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_9578df90","line":49,"updated":"2014-09-23 20:19:27.000000000","message":"where are these defaults coming from?","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}],"keystone/common/cache/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        conf_dict[arg_key] \u003d argvalue"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        LOG.debug(\u0027Keystone Cache Config: %s\u0027, conf_dict)"},{"line_number":110,"context_line":"    # NOTE(yorik-sar): these arguments will play role only for memcache-related"},{"line_number":111,"context_line":"    # backends. Use setdefault for url to support old-style setting through"},{"line_number":112,"context_line":"    # backend_argument\u003durl:127.0.0.1:11211"},{"line_number":113,"context_line":"    conf_dict.setdefault(\u0027%s.arguments.url\u0027 % prefix,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_f9e2599e","line":110,"updated":"2014-09-16 01:33:24.000000000","message":"change \"play role only for\" to \"be used only by the\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    conf_dict.setdefault(\u0027%s.arguments.url\u0027 % prefix,"},{"line_number":114,"context_line":"                         CONF.cache.memcache_servers)"},{"line_number":115,"context_line":"    for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":116,"context_line":"                \u0027pool_unuzed_timeout\u0027, \u0027pool_debug\u0027):"},{"line_number":117,"context_line":"        value \u003d getattr(CONF.cache, \u0027memcache_\u0027 + arg)"},{"line_number":118,"context_line":"        conf_dict[\u0027%s.arguments.%s\u0027 % (prefix, arg)] \u003d value"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_79e669b1","line":116,"updated":"2014-09-16 01:33:24.000000000","message":"change \"unuzed\" to \"unused\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bed81bcccf0f912310c2b9616c3f5f77f4af0997","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    conf_dict.setdefault(\u0027%s.arguments.url\u0027 % prefix,"},{"line_number":114,"context_line":"                         CONF.cache.memcache_servers)"},{"line_number":115,"context_line":"    for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":116,"context_line":"                \u0027pool_unused_timeout\u0027):"},{"line_number":117,"context_line":"        value \u003d getattr(CONF.cache, \u0027memcache_\u0027 + arg)"},{"line_number":118,"context_line":"        conf_dict[\u0027%s.arguments.%s\u0027 % (prefix, arg)] \u003d value"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_ce24d2c8","line":116,"updated":"2014-09-21 02:21:33.000000000","message":"missing get_timeout here?","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d40ab4a2dee6f1e4610d43a8a265ac4181fa67e5","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    conf_dict.setdefault(\u0027%s.arguments.url\u0027 % prefix,"},{"line_number":114,"context_line":"                         CONF.cache.memcache_servers)"},{"line_number":115,"context_line":"    for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":116,"context_line":"                \u0027pool_unused_timeout\u0027):"},{"line_number":117,"context_line":"        value \u003d getattr(CONF.cache, \u0027memcache_\u0027 + arg)"},{"line_number":118,"context_line":"        conf_dict[\u0027%s.arguments.%s\u0027 % (prefix, arg)] \u003d value"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_01ff7668","line":116,"in_reply_to":"da9df570_ce24d2c8","updated":"2014-09-22 17:09:42.000000000","message":"Done","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"}],"keystone/common/config.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f60faefe48f904b9c711733607b4c0e5ae986ecd","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                    help\u003d\u0027Turn on debug logging for memcached pool (beware of\u0027"},{"line_number":361,"context_line":"                    \u0027 high log volume, keystone.cache.memcache_pool backend\u0027"},{"line_number":362,"context_line":"                    \u0027 only)\u0027),"},{"line_number":363,"context_line":"    ],"},{"line_number":364,"context_line":"    \u0027ssl\u0027: ["},{"line_number":365,"context_line":"        cfg.BoolOpt(\u0027enable\u0027, default\u003dFalse,"},{"line_number":366,"context_line":"                    help\u003d\u0027Toggle for SSL support on the Keystone \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_20e3cfa4","line":363,"updated":"2014-09-15 15:51:11.000000000","message":"Don\u0027t we need to regenerate the config file for these?","commit_id":"a143c7174e357c7066fbbcc9f674a9f4852ea837"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        cfg.ListOpt(\u0027memcache_servers\u0027, default\u003d[\u0027localhost:11211\u0027],"},{"line_number":335,"context_line":"                    help\u003d\u0027Memcache servers in the format of \"host:port\".\u0027"},{"line_number":336,"context_line":"                    \u0027 (dogpile.cache.memcache and keystone.cache.memcache_pool\u0027"},{"line_number":337,"context_line":"                    \u0027 backends only)\u0027),"},{"line_number":338,"context_line":"        cfg.IntOpt(\u0027memcache_dead_retry\u0027,"},{"line_number":339,"context_line":"                   default\u003d5 * 60,"},{"line_number":340,"context_line":"                   help\u003d\u0027Number of seconds memcached server is considered dead\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_f9f9794e","line":337,"updated":"2014-09-16 01:33:24.000000000","message":"add a . at the end of the help text. This applies to all these options.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                   help\u003d\u0027Max total number of open connections to every\u0027"},{"line_number":351,"context_line":"                   \u0027 memcached server. (keystone.cache.memcache_pool backend\u0027"},{"line_number":352,"context_line":"                   \u0027 only)\u0027),"},{"line_number":353,"context_line":"        cfg.IntOpt(\u0027memcache_pool_unuzed_timeout\u0027,"},{"line_number":354,"context_line":"                   default\u003d60,"},{"line_number":355,"context_line":"                   help\u003d\u0027Number of seconds a connection to memcached is held\u0027"},{"line_number":356,"context_line":"                   \u0027 unused in the pool before its closed.\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_799d8909","line":353,"updated":"2014-09-16 01:33:24.000000000","message":"change \"unuzed\" to \"unused\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        cfg.IntOpt(\u0027memcache_pool_unuzed_timeout\u0027,"},{"line_number":354,"context_line":"                   default\u003d60,"},{"line_number":355,"context_line":"                   help\u003d\u0027Number of seconds a connection to memcached is held\u0027"},{"line_number":356,"context_line":"                   \u0027 unused in the pool before its closed.\u0027"},{"line_number":357,"context_line":"                   \u0027 (keystone.cache.memcache_pool backend only)\u0027),"},{"line_number":358,"context_line":"        cfg.BoolOpt(\u0027memcache_pool_debug\u0027,"},{"line_number":359,"context_line":"                    default\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_b98a91bc","line":356,"updated":"2014-09-16 01:33:24.000000000","message":"change \"its\" to \"it\u0027s\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":799,"context_line":"    \u0027memcache\u0027: ["},{"line_number":800,"context_line":"        cfg.ListOpt(\u0027servers\u0027, default\u003d[\u0027localhost:11211\u0027],"},{"line_number":801,"context_line":"                    help\u003d\u0027Memcache servers in the format of \"host:port\".\u0027),"},{"line_number":802,"context_line":"        cfg.IntOpt(\u0027dead_retry\u0027,"},{"line_number":803,"context_line":"                   default\u003d5 * 60,"},{"line_number":804,"context_line":"                   help\u003d\u0027Number of seconds memcached server is considered\u0027"},{"line_number":805,"context_line":"                        \u0027 dead before its tried again. This option only\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_59c1a5e2","line":802,"updated":"2014-09-16 01:33:24.000000000","message":"I don\u0027t understand how it is we can get rid of the cas retry option?","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":816,"context_line":"                        \u0027 memcached server. This option only affects\u0027"},{"line_number":817,"context_line":"                        \u0027 dogpile-based Key-Value-Store drivers (e.g. memcache\u0027"},{"line_number":818,"context_line":"                        \u0027 token persistence driver).\u0027),"},{"line_number":819,"context_line":"        cfg.IntOpt(\u0027pool_unuzed_timeout\u0027,"},{"line_number":820,"context_line":"                   default\u003d60,"},{"line_number":821,"context_line":"                   help\u003d\u0027Number of seconds a connection to memcached is held\u0027"},{"line_number":822,"context_line":"                        \u0027 unused in the pool before its closed. This option\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_f99099ee","line":819,"updated":"2014-09-16 01:33:24.000000000","message":"change \"unuzed\" to \"unused\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"418c0ed777aebdeae0434a4bed77c4d6377b8d35","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        cfg.IntOpt(\u0027dead_retry\u0027,"},{"line_number":798,"context_line":"                   default\u003d5 * 60,"},{"line_number":799,"context_line":"                   help\u003d\u0027Number of seconds memcached server is considered\u0027"},{"line_number":800,"context_line":"                        \u0027 dead before its tried again. This option only\u0027"},{"line_number":801,"context_line":"                        \u0027 affects dogpile-based Key-Value-Store drivers\u0027"},{"line_number":802,"context_line":"                        \u0027 (e.g. memcache token persistence driver).\u0027),"},{"line_number":803,"context_line":"        cfg.IntOpt(\u0027socket_timeout\u0027,"},{"line_number":804,"context_line":"                   default\u003d3,"},{"line_number":805,"context_line":"                   help\u003d\u0027Timeout in seconds for every call to a server.  This\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_c37026df","line":802,"range":{"start_line":800,"start_character":54,"end_line":802,"end_character":67},"updated":"2014-09-16 19:18:51.000000000","message":"This seems excessive as we are already in [memcache] section.","commit_id":"21dc32f128105452b6b11f9b98f0b18cd6cefe31"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"47943d82ba85e12bb78a43866112ceec50579741","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"fa98f980_0fd96f22","updated":"2014-09-16 21:44:34.000000000","message":"refer to comments at keystone/etc/keystone.conf.sample","commit_id":"db0de93809561fc1f647d4f5c9d53ddd16d18478"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        cfg.ListOpt(\u0027memcache_servers\u0027, default\u003d[\u0027localhost:11211\u0027],"},{"line_number":337,"context_line":"                    help\u003d\u0027Memcache servers in the format of \"host:port\".\u0027"},{"line_number":338,"context_line":"                    \u0027 (dogpile.cache.memcache and keystone.cache.memcache_pool\u0027"},{"line_number":339,"context_line":"                    \u0027 backends only)\u0027),"},{"line_number":340,"context_line":"        cfg.IntOpt(\u0027memcache_dead_retry\u0027,"},{"line_number":341,"context_line":"                   default\u003d5 * 60,"},{"line_number":342,"context_line":"                   help\u003d\u0027Number of seconds memcached server is considered dead\u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_bd3a2132","line":339,"updated":"2014-09-23 20:19:27.000000000","message":"put . at the end of all these for consistency.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        cfg.ListOpt(\u0027memcache_servers\u0027, default\u003d[\u0027localhost:11211\u0027],"},{"line_number":337,"context_line":"                    help\u003d\u0027Memcache servers in the format of \"host:port\".\u0027"},{"line_number":338,"context_line":"                    \u0027 (dogpile.cache.memcache and keystone.cache.memcache_pool\u0027"},{"line_number":339,"context_line":"                    \u0027 backends only)\u0027),"},{"line_number":340,"context_line":"        cfg.IntOpt(\u0027memcache_dead_retry\u0027,"},{"line_number":341,"context_line":"                   default\u003d5 * 60,"},{"line_number":342,"context_line":"                   help\u003d\u0027Number of seconds memcached server is considered dead\u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_9a70a8dd","line":339,"in_reply_to":"da9df570_bd3a2132","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}],"keystone/common/kvs/backends/memcached.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"VALID_DOGPILE_BACKENDS \u003d dict(pylibmc\u003dmemcached.PylibmcBackend,"},{"line_number":39,"context_line":"                              bmemcached\u003dmemcached.BMemcachedBackend,"},{"line_number":40,"context_line":"                              memcached\u003dmemcache_pool.PooledMemcachedBackend)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class MemcachedLock(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_f9a7b94d","line":40,"updated":"2014-09-16 01:33:24.000000000","message":"So the other one isn\u0027t a valid backend anymore?","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"56f3e56d03313be4cbd84f4caecfa201dd99cd76","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"VALID_DOGPILE_BACKENDS \u003d dict(pylibmc\u003dmemcached.PylibmcBackend,"},{"line_number":39,"context_line":"                              bmemcached\u003dmemcached.BMemcachedBackend,"},{"line_number":40,"context_line":"                              memcached\u003dmemcache_pool.PooledMemcachedBackend)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class MemcachedLock(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_6bdbec4e","line":40,"in_reply_to":"fa98f980_f9a7b94d","updated":"2014-09-16 02:10:11.000000000","message":"No this replaces it because the other backend will leak client connections under eventlet.","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"}],"keystone/tests/core.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b1d4df69754af36b88811953397d4e235c2eaed8","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                \u0027routes.middleware\u003dINFO\u0027,"},{"line_number":396,"context_line":"                \u0027stevedore.extension\u003dINFO\u0027,"},{"line_number":397,"context_line":"                \u0027keystone.notifications\u003dINFO\u0027,"},{"line_number":398,"context_line":"                \u0027keystone.common._memcachepool\u003dINFO\u0027,"},{"line_number":399,"context_line":"            ])"},{"line_number":400,"context_line":"        self.auth_plugin_config_override()"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"fa98f980_05b5b2cf","line":398,"updated":"2014-09-17 20:16:52.000000000","message":"This needs to be swapped to keystone.common._memcache_pool","commit_id":"35e8d1a9628347afc618fbf9e41e514a9bb9d1b7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c48e84e930d92b926c177871318afc662f26a00","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                \u0027routes.middleware\u003dINFO\u0027,"},{"line_number":396,"context_line":"                \u0027stevedore.extension\u003dINFO\u0027,"},{"line_number":397,"context_line":"                \u0027keystone.notifications\u003dINFO\u0027,"},{"line_number":398,"context_line":"                \u0027keystone.common._memcache_pool\u003dINFO\u0027,"},{"line_number":399,"context_line":"            ])"},{"line_number":400,"context_line":"        self.auth_plugin_config_override()"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_9d547d55","line":398,"updated":"2014-09-23 20:19:27.000000000","message":"we\u0027re going to want this in the default logging config too.","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2848cbc662bc369dbe7d589eb44808da9c135d60","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                \u0027routes.middleware\u003dINFO\u0027,"},{"line_number":396,"context_line":"                \u0027stevedore.extension\u003dINFO\u0027,"},{"line_number":397,"context_line":"                \u0027keystone.notifications\u003dINFO\u0027,"},{"line_number":398,"context_line":"                \u0027keystone.common._memcache_pool\u003dINFO\u0027,"},{"line_number":399,"context_line":"            ])"},{"line_number":400,"context_line":"        self.auth_plugin_config_override()"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_75a31700","line":398,"in_reply_to":"da9df570_9d547d55","updated":"2014-09-26 15:33:49.000000000","message":"Done","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}],"keystone/token/persistence/backends/memcache.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"41f028ea95a4d11a87b05f834caf10447f51cdd3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        kwargs[\u0027memcached_expire_time\u0027] \u003d CONF.token.expiration"},{"line_number":29,"context_line":"        kwargs[\u0027url\u0027] \u003d CONF.memcache.servers"},{"line_number":30,"context_line":"        for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":31,"context_line":"                    \u0027pool_unuzed_timeout\u0027, \u0027pool_debug\u0027):"},{"line_number":32,"context_line":"            kwargs[arg] \u003d getattr(CONF.memcache, arg)"},{"line_number":33,"context_line":"        super(Token, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_996eadfe","line":31,"updated":"2014-09-16 01:33:24.000000000","message":"change \"unuzed\" to \"unused\"","commit_id":"64bd889c41099da0d62e9d05db32d0178d9e6def"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"38e8ae4e8632104b271bae72721461acddb50779","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        kwargs[\u0027no_expiry_keys\u0027] \u003d [self.revocation_key]"},{"line_number":28,"context_line":"        kwargs[\u0027memcached_expire_time\u0027] \u003d CONF.token.expiration"},{"line_number":29,"context_line":"        kwargs[\u0027url\u0027] \u003d CONF.memcache.servers"},{"line_number":30,"context_line":"        for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":31,"context_line":"                    \u0027pool_unused_timeout\u0027, \u0027pool_connection_get_timeout\u0027):"},{"line_number":32,"context_line":"            kwargs[arg] \u003d getattr(CONF.memcache, arg)"},{"line_number":33,"context_line":"        super(Token, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":29,"id":"da9df570_d4755233","line":30,"updated":"2014-09-19 22:03:13.000000000","message":"What is this change for? It seems unrelated.","commit_id":"429b8c73e0ff618eb2cf22cd230aafcca087b843"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5909016a24bd45e75f59c8463dbed6b53e7b57fb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        kwargs[\u0027no_expiry_keys\u0027] \u003d [self.revocation_key]"},{"line_number":28,"context_line":"        kwargs[\u0027memcached_expire_time\u0027] \u003d CONF.token.expiration"},{"line_number":29,"context_line":"        kwargs[\u0027url\u0027] \u003d CONF.memcache.servers"},{"line_number":30,"context_line":"        for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":31,"context_line":"                    \u0027pool_unused_timeout\u0027, \u0027pool_connection_get_timeout\u0027):"},{"line_number":32,"context_line":"            kwargs[arg] \u003d getattr(CONF.memcache, arg)"},{"line_number":33,"context_line":"        super(Token, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":29,"id":"da9df570_14bc3a6c","line":30,"in_reply_to":"da9df570_d4755233","updated":"2014-09-19 22:17:35.000000000","message":"This is to push the options from CONF.memcache to the pool, without this we don\u0027t end up passing the dogpile args down.","commit_id":"429b8c73e0ff618eb2cf22cd230aafcca087b843"}],"keystone/token/persistence/backends/memcache_pool.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bed81bcccf0f912310c2b9616c3f5f77f4af0997","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"da9df570_ee2196b5","updated":"2014-09-21 02:21:33.000000000","message":"both of the comments here are not worth a -1","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ed2a4c4554bc42115bb819315a62bfd83ffc28ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 Metacloud, Inc."},{"line_number":2,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_3c066a21","line":2,"updated":"2014-09-22 12:19:22.000000000","message":"Is this correct though? Do any of the authors work for the Foundation?","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d40ab4a2dee6f1e4610d43a8a265ac4181fa67e5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 Metacloud, Inc."},{"line_number":2,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_81ad268b","line":2,"in_reply_to":"da9df570_3c066a21","updated":"2014-09-22 17:09:42.000000000","message":"Done","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bed81bcccf0f912310c2b9616c3f5f77f4af0997","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Token(kvs.Token):"},{"line_number":24,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memcached\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_8e6d6a07","line":23,"updated":"2014-09-21 02:21:33.000000000","message":"theres a lot of common code between this and the memcache backend, we can probably create a common class or something.","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d40ab4a2dee6f1e4610d43a8a265ac4181fa67e5","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Token(kvs.Token):"},{"line_number":24,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memcached\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_e1943239","line":23,"in_reply_to":"da9df570_8e6d6a07","updated":"2014-09-22 17:09:42.000000000","message":"Done","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bed81bcccf0f912310c2b9616c3f5f77f4af0997","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":27,"context_line":"        kwargs[\u0027no_expiry_keys\u0027] \u003d [self.revocation_key]"},{"line_number":28,"context_line":"        kwargs[\u0027memcached_expire_time\u0027] \u003d CONF.token.expiration"},{"line_number":29,"context_line":"        kwargs[\u0027memcached_backend\u0027] \u003d \u0027pooled_memcached\u0027"},{"line_number":30,"context_line":"        kwargs[\u0027url\u0027] \u003d CONF.memcache.servers"},{"line_number":31,"context_line":"        for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":32,"context_line":"                    \u0027pool_unused_timeout\u0027, \u0027pool_connection_get_timeout\u0027):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_6e6846f6","line":29,"updated":"2014-09-21 02:21:33.000000000","message":"this option should be added to the memcache backend too","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d40ab4a2dee6f1e4610d43a8a265ac4181fa67e5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":27,"context_line":"        kwargs[\u0027no_expiry_keys\u0027] \u003d [self.revocation_key]"},{"line_number":28,"context_line":"        kwargs[\u0027memcached_expire_time\u0027] \u003d CONF.token.expiration"},{"line_number":29,"context_line":"        kwargs[\u0027memcached_backend\u0027] \u003d \u0027pooled_memcached\u0027"},{"line_number":30,"context_line":"        kwargs[\u0027url\u0027] \u003d CONF.memcache.servers"},{"line_number":31,"context_line":"        for arg in (\u0027dead_retry\u0027, \u0027socket_timeout\u0027, \u0027pool_maxsize\u0027,"},{"line_number":32,"context_line":"                    \u0027pool_unused_timeout\u0027, \u0027pool_connection_get_timeout\u0027):"}],"source_content_type":"text/x-python","patch_set":30,"id":"da9df570_019a1663","line":29,"in_reply_to":"da9df570_6e6846f6","updated":"2014-09-22 17:09:42.000000000","message":"Done","commit_id":"d3604b40858eac8ee9964f2c842e19dad3175388"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"20f40ae73336fa44b4596875eedf5468ce11a410","unresolved":false,"context_lines":[{"line_number":17,"context_line":"CONF \u003d config.CONF"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Token(memcache.Token):"},{"line_number":21,"context_line":"    memcached_backend \u003d \u0027pooled_memcached\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":31,"id":"da9df570_a746babd","line":20,"updated":"2014-09-22 17:38:43.000000000","message":"nice","commit_id":"0010803288748fcd3ce7dba212a54bffe7a61a0c"}]}
