)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ab44a6ed07fe9c9ba2e04c1c341b1db0390f9f98","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement mechanism to provide non-expiring keys in KVS"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patchset implements a mechanism to specify non-expiring keys"},{"line_number":10,"context_line":"for dogpile.cache backends that have a concept keys that are"},{"line_number":11,"context_line":"automatically removed from the backend based upon an expiry value"},{"line_number":12,"context_line":"(e.g. memcached, redis).  This new non-expiring key functionality"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAATn%2F9fAA%3D","line":9,"updated":"2013-12-11 01:42:38.000000000","message":"This first sentence goes down a little rough.","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f615cbda7fd3ddebf814831297a32c3743bdc32","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement mechanism to provide non-expiring keys in KVS"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patchset implements a mechanism to specify non-expiring keys"},{"line_number":10,"context_line":"for dogpile.cache backends that have a concept keys that are"},{"line_number":11,"context_line":"automatically removed from the backend based upon an expiry value"},{"line_number":12,"context_line":"(e.g. memcached, redis).  This new non-expiring key functionality"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAATn%2F9e6o%3D","line":9,"in_reply_to":"AAAATn%2F9fAA%3D","updated":"2013-12-11 01:53:23.000000000","message":"Will re-word in next patchset.","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"in the case of drivers that can automatically remove keys after"},{"line_number":12,"context_line":"a given time (e.g. memcache). This new non-expiring-key"},{"line_number":13,"context_line":"functionality is currently only implemented for the provided"},{"line_number":14,"context_line":"memcached backend."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"bp: dogpile-kvs-backends"},{"line_number":17,"context_line":"Change-Id: I7e25e0049e5b8697c5cb67272b660519c3c3305e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAT3%2F%2F3Q8%3D","line":14,"updated":"2013-12-29 20:29:51.000000000","message":"the commit message doesn\u0027t say anything about \"min_compress_len\", so what are those changes doing here?\n\nIt also doesn\u0027t mention the change related to \"distributed_lock\" handling.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":11,"context_line":"in the case of drivers that can automatically remove keys after"},{"line_number":12,"context_line":"a given time (e.g. memcache). This new non-expiring-key"},{"line_number":13,"context_line":"functionality is currently only implemented for the provided"},{"line_number":14,"context_line":"memcached backend."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"bp: dogpile-kvs-backends"},{"line_number":17,"context_line":"Change-Id: I7e25e0049e5b8697c5cb67272b660519c3c3305e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAT3%2F%2F25E%3D","line":14,"in_reply_to":"AAAAT3%2F%2F3Q8%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"}],"doc/source/developing.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3905d95fc642b808135dce85abf18d2f720a8ce6","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"},{"line_number":412,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":413,"context_line":"as a keyword argument to the ``configure`` method. The ``no_expiry_keys``::"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"},{"line_number":416,"context_line":"                        memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAATn%2F9eDY%3D","line":413,"updated":"2013-12-11 06:56:55.000000000","message":"the last line ends rather abruptly","commit_id":"cdd3340e41165b7ec9788517fc8d93560effea3b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":387,"context_line":"memcache servers, lock_timeout, etc)."},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"},{"line_number":390,"context_line":"provided memcached driver (``BMemcached``, ``Pylibmc``, and basic ``Memcached``)."},{"line_number":391,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3Sg%3D","line":390,"updated":"2013-12-29 20:29:51.000000000","message":"change \"driver\" to \"drivers\"","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":387,"context_line":"memcache servers, lock_timeout, etc)."},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"},{"line_number":390,"context_line":"provided memcached driver (``BMemcached``, ``Pylibmc``, and basic ``Memcached``)."},{"line_number":391,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25w%3D","line":390,"in_reply_to":"AAAAT3%2F%2F3Sg%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":391,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Example configuring the KeyValueStore system to use a KeyValueStore object named \"TestKVSRegion\","},{"line_number":395,"context_line":"the Memcached backend and, a specific memcached driver::"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SY%3D","line":394,"updated":"2013-12-29 20:29:51.000000000","message":"change \"Example configuring\" to \"The following is an example showing how to configure\"","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":391,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Example configuring the KeyValueStore system to use a KeyValueStore object named \"TestKVSRegion\","},{"line_number":395,"context_line":"the Memcached backend and, a specific memcached driver::"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25s%3D","line":394,"in_reply_to":"AAAAT3%2F%2F3SY%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Example configuring the KeyValueStore system to use a KeyValueStore object named \"TestKVSRegion\","},{"line_number":395,"context_line":"the Memcached backend and, a specific memcached driver::"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":398,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3Sc%3D","line":395,"updated":"2013-12-29 20:29:51.000000000","message":"move \",\" before \"and\"","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":392,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Example configuring the KeyValueStore system to use a KeyValueStore object named \"TestKVSRegion\","},{"line_number":395,"context_line":"the Memcached backend and, a specific memcached driver::"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":398,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25o%3D","line":395,"in_reply_to":"AAAAT3%2F%2F3Sc%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":398,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"The memcached backend can support the concept of passing an explicit TTL to all keys set. This"},{"line_number":401,"context_line":"is accomplished by passing the argument ``memcached_expire_time`` as a keyword argument to the"},{"line_number":402,"context_line":"``configure`` method. Similarly it is possible to pass the ``min_compress_len`` argument to"},{"line_number":403,"context_line":"all set calls::"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SQ%3D","line":400,"updated":"2013-12-29 20:29:51.000000000","message":"change \"can support\" to \"supports\" ? Otherwise, explain how to make the memcached backend support it.\n\nAlso, remote \"set\", or change to \"when set\".","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":398,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"The memcached backend can support the concept of passing an explicit TTL to all keys set. This"},{"line_number":401,"context_line":"is accomplished by passing the argument ``memcached_expire_time`` as a keyword argument to the"},{"line_number":402,"context_line":"``configure`` method. Similarly it is possible to pass the ``min_compress_len`` argument to"},{"line_number":403,"context_line":"all set calls::"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25k%3D","line":400,"in_reply_to":"AAAAT3%2F%2F3SQ%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":399,"context_line":""},{"line_number":400,"context_line":"The memcached backend can support the concept of passing an explicit TTL to all keys set. This"},{"line_number":401,"context_line":"is accomplished by passing the argument ``memcached_expire_time`` as a keyword argument to the"},{"line_number":402,"context_line":"``configure`` method. Similarly it is possible to pass the ``min_compress_len`` argument to"},{"line_number":403,"context_line":"all set calls::"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SM%3D","line":402,"updated":"2013-12-29 20:29:51.000000000","message":"why would I pass min_compress_len?","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":399,"context_line":""},{"line_number":400,"context_line":"The memcached backend can support the concept of passing an explicit TTL to all keys set. This"},{"line_number":401,"context_line":"is accomplished by passing the argument ``memcached_expire_time`` as a keyword argument to the"},{"line_number":402,"context_line":"``configure`` method. Similarly it is possible to pass the ``min_compress_len`` argument to"},{"line_number":403,"context_line":"all set calls::"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25g%3D","line":402,"in_reply_to":"AAAAT3%2F%2F3SM%3D","updated":"2013-12-30 02:29:42.000000000","message":"The mechanism to set min_compress_len is the same as memcache_expire_time, i\u0027ll pull this doc change out into it;s own commit though.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":403,"context_line":"all set calls::"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027,"},{"line_number":406,"context_line":"                        memcached_expire_time\u003d86400, min_compress_len\u003d1000)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"},{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SI%3D","line":406,"updated":"2013-12-29 20:29:51.000000000","message":"what\u0027s the units for memcached_expire_time and min_compress_len?","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":403,"context_line":"all set calls::"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcached_driver\u003d\u0027Memcached\u0027,"},{"line_number":406,"context_line":"                        memcached_expire_time\u003d86400, min_compress_len\u003d1000)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"},{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25c%3D","line":406,"in_reply_to":"AAAAT3%2F%2F3SI%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                        memcached_expire_time\u003d86400, min_compress_len\u003d1000)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"},{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SA%3D","line":409,"updated":"2013-12-29 20:29:51.000000000","message":"seems like \"no_expiry_keys\" should be \"memcached_no_expiry_keys\" to match the pattern. Or, why does \"memcached_expire_time\" need \"memcache_\" ?","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                        memcached_expire_time\u003d86400, min_compress_len\u003d1000)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"},{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25U%3D","line":409,"in_reply_to":"AAAAT3%2F%2F3SA%3D","updated":"2013-12-30 02:29:42.000000000","message":"\"memcached_expire_time\" is a dogpile specific argument.  I\u0027ll clarify.  no_expiry_keys can/will be changed.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"},{"line_number":413,"context_line":"                        memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3SE%3D","line":412,"updated":"2013-12-29 20:29:51.000000000","message":"\"memcache_driver\" should be \"memcached_driver\"","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":409,"context_line":"exempt specific keys from receiving this TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"},{"line_number":413,"context_line":"                        memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25Q%3D","line":412,"in_reply_to":"AAAAT3%2F%2F3SE%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"},{"line_number":413,"context_line":"                        memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":416,"context_line":"implementations::"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F3R4%3D","line":413,"updated":"2013-12-29 20:29:51.000000000","message":"does no_expiry_keys also apply to min_compress_len? or is there a no_min_compress_keys?","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":410,"context_line":"as a keyword argument to the ``configure`` method::"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    kvs_store.configure(\u0027openstack.kvs.MemcachedBackend\u0027, memcache_driver\u003d\u0027Memcached\u0027,"},{"line_number":413,"context_line":"                        memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":416,"context_line":"implementations::"}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAT3%2F%2F25M%3D","line":413,"in_reply_to":"AAAAT3%2F%2F3R4%3D","updated":"2013-12-30 02:29:42.000000000","message":"min_compress_len is a memcache specific function, not related to the python code but the memcache server.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dc39e8e688ab887e5d5b901d6d2f2cf821c11356","unresolved":false,"context_lines":[{"line_number":456,"context_line":"only supported in the provided memcached backends)::"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027"},{"line_number":459,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. NOTE::"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAUH%2F9xG8%3D","line":459,"updated":"2014-02-04 06:37:11.000000000","message":"Great that you provided an example of the key list!","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dc39e8e688ab887e5d5b901d6d2f2cf821c11356","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. NOTE::"},{"line_number":463,"context_line":"    For the non-expiring keys functionality to work, the backend must support the ability for"},{"line_number":464,"context_line":"    the region to set the key_mangler on it and have the attribute ``raw_no_expiry_keys``."},{"line_number":465,"context_line":"    The ``raw_no_expiry_keys`` attribute is expected to be used to hold the values of the"},{"line_number":466,"context_line":"    keyword argument ``no_expiry_keys`` prior to hashing. It is the responsibility of the"},{"line_number":467,"context_line":"    backend to use these raw values to determine if a key should be exepmt from expiring"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAUH%2F9xGk%3D","line":464,"updated":"2014-02-04 06:37:11.000000000","message":"What does the phrase \"support the ability for the region to set the key_mangler on it\"  actually mean?  Can you expand on this a little to make it more clear?","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"76c68b02a02b3cc5c9fa88a26af7600fe56492c2","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. NOTE::"},{"line_number":463,"context_line":"    For the non-expiring keys functionality to work, the backend must support the ability for"},{"line_number":464,"context_line":"    the region to set the key_mangler on it and have the attribute ``raw_no_expiry_keys``."},{"line_number":465,"context_line":"    The ``raw_no_expiry_keys`` attribute is expected to be used to hold the values of the"},{"line_number":466,"context_line":"    keyword argument ``no_expiry_keys`` prior to hashing. It is the responsibility of the"},{"line_number":467,"context_line":"    backend to use these raw values to determine if a key should be exepmt from expiring"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAUH%2F9rq4%3D","line":464,"in_reply_to":"AAAAUH%2F9xGk%3D","updated":"2014-02-05 01:33:23.000000000","message":"I will add in the next patchset.","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dc39e8e688ab887e5d5b901d6d2f2cf821c11356","unresolved":false,"context_lines":[{"line_number":464,"context_line":"    the region to set the key_mangler on it and have the attribute ``raw_no_expiry_keys``."},{"line_number":465,"context_line":"    The ``raw_no_expiry_keys`` attribute is expected to be used to hold the values of the"},{"line_number":466,"context_line":"    keyword argument ``no_expiry_keys`` prior to hashing. It is the responsibility of the"},{"line_number":467,"context_line":"    backend to use these raw values to determine if a key should be exepmt from expiring"},{"line_number":468,"context_line":"    and not set the TTL on the non-expiring keys when the ``set`` or ``set_multi`` methods are"},{"line_number":469,"context_line":"    called."},{"line_number":470,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAUH%2F9xG4%3D","line":467,"updated":"2014-02-04 06:37:11.000000000","message":"typo exepmt should be exempt","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"76c68b02a02b3cc5c9fa88a26af7600fe56492c2","unresolved":false,"context_lines":[{"line_number":464,"context_line":"    the region to set the key_mangler on it and have the attribute ``raw_no_expiry_keys``."},{"line_number":465,"context_line":"    The ``raw_no_expiry_keys`` attribute is expected to be used to hold the values of the"},{"line_number":466,"context_line":"    keyword argument ``no_expiry_keys`` prior to hashing. It is the responsibility of the"},{"line_number":467,"context_line":"    backend to use these raw values to determine if a key should be exepmt from expiring"},{"line_number":468,"context_line":"    and not set the TTL on the non-expiring keys when the ``set`` or ``set_multi`` methods are"},{"line_number":469,"context_line":"    called."},{"line_number":470,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAUH%2F9rq0%3D","line":467,"in_reply_to":"AAAAUH%2F9xG4%3D","updated":"2014-02-05 01:33:23.000000000","message":"fixed in next patchset.","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b64658a61f547c68f95a9ce5045d790eaf592384","unresolved":false,"context_lines":[{"line_number":455,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":456,"context_line":"only supported in the provided memcached backends)::"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027"},{"line_number":459,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAAUH%2F9jtc%3D","line":458,"updated":"2014-02-06 03:29:13.000000000","message":"(NIT): missing a comma at the end of line 458?\n\n    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,","commit_id":"daae8c01a47527768c667df13a306a107ce2d420"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ad70325155310496101211f8810e72fab95692b5","unresolved":false,"context_lines":[{"line_number":455,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":456,"context_line":"only supported in the provided memcached backends)::"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027"},{"line_number":459,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAAUH%2F9bIg%3D","line":458,"in_reply_to":"AAAAUH%2F9jtc%3D","updated":"2014-02-07 00:32:40.000000000","message":"Done","commit_id":"daae8c01a47527768c667df13a306a107ce2d420"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"The memcached backend supports a mechanism to supply an explicit TTL (in seconds) to all keys"},{"line_number":469,"context_line":"set via the KVS object. This is accomplished by passing the argument ``memcached_expire_time``"},{"line_number":470,"context_line":"as a keyword argument to the ``configure`` method. This will include the ``time`` argument to"},{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAjQ%3D","line":470,"updated":"2014-02-17 17:43:06.000000000","message":"clarify what \"This\" refers to in \"This will include\"... something like\n\n Passing the ``memcached_expire_time`` argument will cause the ``time``\n argument to be set on all calls performed by the memcached client.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"The memcached backend supports a mechanism to supply an explicit TTL (in seconds) to all keys"},{"line_number":469,"context_line":"set via the KVS object. This is accomplished by passing the argument ``memcached_expire_time``"},{"line_number":470,"context_line":"as a keyword argument to the ``configure`` method. This will include the ``time`` argument to"},{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2FvQ%3D","line":470,"in_reply_to":"AAAAUX%2F%2FAjQ%3D","updated":"2014-02-17 18:51:57.000000000","message":"Done in enxt patch","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":469,"context_line":"set via the KVS object. This is accomplished by passing the argument ``memcached_expire_time``"},{"line_number":470,"context_line":"as a keyword argument to the ``configure`` method. This will include the ``time`` argument to"},{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":475,"context_line":"                        memcached_expire_time\u003d86400)"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAh8%3D","line":472,"updated":"2014-02-17 17:43:06.000000000","message":"what if I used it with a different backend? is it ignored or does it fail?","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":469,"context_line":"set via the KVS object. This is accomplished by passing the argument ``memcached_expire_time``"},{"line_number":470,"context_line":"as a keyword argument to the ``configure`` method. This will include the ``time`` argument to"},{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":475,"context_line":"                        memcached_expire_time\u003d86400)"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2FvM%3D","line":472,"in_reply_to":"AAAAUX%2F%2FAh8%3D","updated":"2014-02-17 18:51:57.000000000","message":"Ignored.  Will clarify","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":475,"context_line":"                        memcached_expire_time\u003d86400)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAkI%3D","line":474,"updated":"2014-02-17 17:43:06.000000000","message":"suggest use ..code:: python to format these.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":471,"context_line":"all set calls performed by the memcached client. ``memcached_expire_time`` is an argument"},{"line_number":472,"context_line":"exclusive to the memcached dogpile backend::"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":475,"context_line":"                        memcached_expire_time\u003d86400)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"If an explicit TTL is configured via the ``memcached_expire_time`` argument, it is possible to"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2FvI%3D","line":474,"in_reply_to":"AAAAUX%2F%2FAkI%3D","updated":"2014-02-17 18:51:57.000000000","message":"done in next patch","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":478,"context_line":"exempt specific keys from receiving the TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":479,"context_line":"as a keyword argument to the ``configure`` method. ``no_expiry_keys`` should be supported by"},{"line_number":480,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":481,"context_line":"only supported in the provided memcached backends)::"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":484,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAe0%3D","line":481,"updated":"2014-02-17 17:43:06.000000000","message":"change \"backend\" to \"backends\"... this says it\u0027s only available for backends that suport explicit TTL, and at line 471 it says only the memcached dogpile backend supports that.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":478,"context_line":"exempt specific keys from receiving the TTL by passing the argument ``no_expiry_keys`` (list)"},{"line_number":479,"context_line":"as a keyword argument to the ``configure`` method. ``no_expiry_keys`` should be supported by"},{"line_number":480,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":481,"context_line":"only supported in the provided memcached backends)::"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":484,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2FvA%3D","line":481,"in_reply_to":"AAAAUX%2F%2FAe0%3D","updated":"2014-02-17 18:51:57.000000000","message":"I\u0027ll clarify.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":480,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":481,"context_line":"only supported in the provided memcached backends)::"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":484,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAkE%3D","line":483,"updated":"2014-02-17 17:43:06.000000000","message":"suggest use ..code:: python to format these.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":480,"context_line":"all OpenStack-specific dogpile backends that have the ability to set an explicit TTL (currently"},{"line_number":481,"context_line":"only supported in the provided memcached backends)::"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, memcached_backend\u003d\u0027Memcached\u0027,"},{"line_number":484,"context_line":"                    memcached_expire_time\u003d86400, no_expiry_keys\u003d[\u0027key\u0027, \u0027second_key\u0027, ...])"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":""}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2FvY%3D","line":483,"in_reply_to":"AAAAUX%2F%2FAkE%3D","updated":"2014-02-17 18:51:57.000000000","message":"Done in next patchset.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":496,"context_line":"    and not set the TTL on the non-expiring keys when the ``set`` or ``set_multi`` methods are"},{"line_number":497,"context_line":"    called."},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    Typically the key will be hashed by the region using it\u0027s key_mangler method"},{"line_number":500,"context_line":"    before being passed to the backend to set the value in the KeyValueStore. This"},{"line_number":501,"context_line":"    means that in most cases, the backend will need to either pre-compute the hashed versions"},{"line_number":502,"context_line":"    of the keys (when the key_mangler is set) and store a cached copy, or hash each item in"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2FAd8%3D","line":499,"updated":"2014-02-17 17:43:06.000000000","message":"change \"it\u0027s\" to \"its\"","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":496,"context_line":"    and not set the TTL on the non-expiring keys when the ``set`` or ``set_multi`` methods are"},{"line_number":497,"context_line":"    called."},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    Typically the key will be hashed by the region using it\u0027s key_mangler method"},{"line_number":500,"context_line":"    before being passed to the backend to set the value in the KeyValueStore. This"},{"line_number":501,"context_line":"    means that in most cases, the backend will need to either pre-compute the hashed versions"},{"line_number":502,"context_line":"    of the keys (when the key_mangler is set) and store a cached copy, or hash each item in"}],"source_content_type":"text/x-rst","patch_set":25,"id":"AAAAUX%2F%2B%2Fu8%3D","line":499,"in_reply_to":"AAAAUX%2F%2FAd8%3D","updated":"2014-02-17 18:51:57.000000000","message":"done in next patch","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0b1e22a5b4fd7d52e7499376843fabf5cae52c76","unresolved":false,"context_lines":[{"line_number":508,"context_line":"    ``memcached`` backend handles this hashing and caching of the keys by utilizing an"},{"line_number":509,"context_line":"    ``@property`` method for the ``.key_mangler`` attribute on the backend and utilizing the"},{"line_number":510,"context_line":"    associated ``.settr()`` method to front-load the hashing work at attribute set time."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":513,"context_line":"implementations:"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"AAAAUX%2F%2B1Ms%3D","line":511,"updated":"2014-02-18 18:43:38.000000000","message":"well written!","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"}],"keystone/common/kvs/backends/memcached.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ab44a6ed07fe9c9ba2e04c1c341b1db0390f9f98","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        if key not in self._no_expiry_keys:"},{"line_number":116,"context_line":"            super(MemcachedBackend, self).set(key, value)"},{"line_number":117,"context_line":"        else:"},{"line_number":118,"context_line":"            self.driver.client.set(key, value)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def set_multi(self, mapping):"},{"line_number":121,"context_line":"        mapping_keys \u003d set(mapping.keys())"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9e9c%3D","line":118,"updated":"2013-12-11 01:42:38.000000000","message":"It would probably be useful to have a comment saying that self.driver.client is being used because not expiring is the default.","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f615cbda7fd3ddebf814831297a32c3743bdc32","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        if key not in self._no_expiry_keys:"},{"line_number":116,"context_line":"            super(MemcachedBackend, self).set(key, value)"},{"line_number":117,"context_line":"        else:"},{"line_number":118,"context_line":"            self.driver.client.set(key, value)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def set_multi(self, mapping):"},{"line_number":121,"context_line":"        mapping_keys \u003d set(mapping.keys())"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9e6Y%3D","line":118,"in_reply_to":"AAAATn%2F9e9c%3D","updated":"2013-12-11 01:53:23.000000000","message":"As discussed in IRC there is a better way to solve this.  Not proxy/rely on the dogpile backends here, implement our own logic to handle the extra set arguments cleanly.","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ab44a6ed07fe9c9ba2e04c1c341b1db0390f9f98","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def set_multi(self, mapping):"},{"line_number":121,"context_line":"        mapping_keys \u003d set(mapping.keys())"},{"line_number":122,"context_line":"        self.driver.client.set_multi("},{"line_number":123,"context_line":"            mapping_keys.intersection(self._no_expiry_keys))"},{"line_number":124,"context_line":"        self.driver.set_multi(mapping_keys.difference(self._no_expiry_keys))"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9fA8%3D","line":122,"updated":"2013-12-11 01:42:38.000000000","message":"Don\u0027t you have to pass a dictionary to set_multi?","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f615cbda7fd3ddebf814831297a32c3743bdc32","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def set_multi(self, mapping):"},{"line_number":121,"context_line":"        mapping_keys \u003d set(mapping.keys())"},{"line_number":122,"context_line":"        self.driver.client.set_multi("},{"line_number":123,"context_line":"            mapping_keys.intersection(self._no_expiry_keys))"},{"line_number":124,"context_line":"        self.driver.set_multi(mapping_keys.difference(self._no_expiry_keys))"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9e6U%3D","line":122,"in_reply_to":"AAAATn%2F9fA8%3D","updated":"2013-12-11 01:53:23.000000000","message":"Good catch.  This also means I\u0027ve got some test gaps.","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ab44a6ed07fe9c9ba2e04c1c341b1db0390f9f98","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":150,"context_line":"        elif key_mangler is None:"},{"line_number":151,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":152,"context_line":"            pass"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9fAg%3D","line":152,"updated":"2013-12-11 01:42:38.000000000","message":"this should be removed","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f615cbda7fd3ddebf814831297a32c3743bdc32","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":150,"context_line":"        elif key_mangler is None:"},{"line_number":151,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":152,"context_line":"            pass"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9e6Q%3D","line":152,"in_reply_to":"AAAATn%2F9fAg%3D","updated":"2013-12-11 01:53:23.000000000","message":"Done","commit_id":"57fc2f727bccee5298b8e975eb9d22a16d709972"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class MemcachedDriverMixin(object):"},{"line_number":39,"context_line":"    # Basic Mixin for properly handling setting a TTL on keys directly to the"},{"line_number":40,"context_line":"    # backend and overriding the backend implementation."},{"line_number":41,"context_line":"    def set(self, key, value, **set_arguments):"},{"line_number":42,"context_line":"        self.client.set(key, value, **set_arguments)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3R0%3D","line":39,"updated":"2013-12-29 20:29:51.000000000","message":"should be a docstring?\n\nalso, not sure what \"directly\" means here.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class MemcachedDriverMixin(object):"},{"line_number":39,"context_line":"    # Basic Mixin for properly handling setting a TTL on keys directly to the"},{"line_number":40,"context_line":"    # backend and overriding the backend implementation."},{"line_number":41,"context_line":"    def set(self, key, value, **set_arguments):"},{"line_number":42,"context_line":"        self.client.set(key, value, **set_arguments)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F258%3D","line":39,"in_reply_to":"AAAAT3%2F%2F3R0%3D","updated":"2013-12-30 02:29:42.000000000","message":"I\u0027ll clarify, but \"directly\" means not thoguht the dogpile logic, directly using the backend\u0027s TTL mechanism.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"class MemcachedDriverMixin(object):"},{"line_number":39,"context_line":"    # Basic Mixin for properly handling setting a TTL on keys directly to the"},{"line_number":40,"context_line":"    # backend and overriding the backend implementation."},{"line_number":41,"context_line":"    def set(self, key, value, **set_arguments):"},{"line_number":42,"context_line":"        self.client.set(key, value, **set_arguments)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def set_multi(self, mapping, **set_arguments):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Qc%3D","line":41,"updated":"2013-12-29 20:29:51.000000000","message":"suggest change \"set_arguments\" to \"args_to_set\" since it will make this more readable.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":38,"context_line":"class MemcachedDriverMixin(object):"},{"line_number":39,"context_line":"    # Basic Mixin for properly handling setting a TTL on keys directly to the"},{"line_number":40,"context_line":"    # backend and overriding the backend implementation."},{"line_number":41,"context_line":"    def set(self, key, value, **set_arguments):"},{"line_number":42,"context_line":"        self.client.set(key, value, **set_arguments)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def set_multi(self, mapping, **set_arguments):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26Q%3D","line":41,"in_reply_to":"AAAAT3%2F%2F3Qc%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# NOTE(morganfainberg): Redefine the basic backends from the"},{"line_number":49,"context_line":"# dogpile.cache.backends.memcached module and use the"},{"line_number":50,"context_line":"# :class:`MemcacheDriverMixin` to override the `set` and `set_multi` methods"},{"line_number":51,"context_line":"# to allow explicit passing of the extra `set_arguments` to the client."},{"line_number":52,"context_line":"class Pylibmc(MemcachedDriverMixin, memcached.PylibmcBackend):"},{"line_number":53,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Rw%3D","line":50,"updated":"2013-12-29 20:29:51.000000000","message":"change \"MemcacheDriverMixin\" to \"MemcachedDriverMixin\" to match the name.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# NOTE(morganfainberg): Redefine the basic backends from the"},{"line_number":49,"context_line":"# dogpile.cache.backends.memcached module and use the"},{"line_number":50,"context_line":"# :class:`MemcacheDriverMixin` to override the `set` and `set_multi` methods"},{"line_number":51,"context_line":"# to allow explicit passing of the extra `set_arguments` to the client."},{"line_number":52,"context_line":"class Pylibmc(MemcachedDriverMixin, memcached.PylibmcBackend):"},{"line_number":53,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26Y%3D","line":50,"in_reply_to":"AAAAT3%2F%2F3Rw%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    http://amix.dk/blog/post/19386"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self, client_fn, key, lock_timeout, max_lock_attempts):"},{"line_number":78,"context_line":"        self.client_fn \u003d client_fn"},{"line_number":79,"context_line":"        self.key \u003d \"_lock\" + key"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Rs%3D","line":76,"updated":"2013-12-29 20:29:51.000000000","message":"revert random whitespace change.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    http://amix.dk/blog/post/19386"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self, client_fn, key, lock_timeout, max_lock_attempts):"},{"line_number":78,"context_line":"        self.client_fn \u003d client_fn"},{"line_number":79,"context_line":"        self.key \u003d \"_lock\" + key"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26c%3D","line":76,"in_reply_to":"AAAAT3%2F%2F3Rs%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"class MemcachedBackend(manager.Manager):"},{"line_number":106,"context_line":"    \"\"\"Pivot point to leverage the various dogpile.cache memcache backends."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    To specify a specific dogpile.cache memcached driver, pass the argument"},{"line_number":109,"context_line":"    `memcache_driver` set to one of the provided memcache drivers (at this"},{"line_number":110,"context_line":"    time `Memcached`, `BMemcached`, `Pylibmc` are valid)."},{"line_number":111,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3RU%3D","line":108,"updated":"2013-12-29 20:29:51.000000000","message":"unrelated documentation fixups should be in a separate commit.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":105,"context_line":"class MemcachedBackend(manager.Manager):"},{"line_number":106,"context_line":"    \"\"\"Pivot point to leverage the various dogpile.cache memcache backends."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    To specify a specific dogpile.cache memcached driver, pass the argument"},{"line_number":109,"context_line":"    `memcache_driver` set to one of the provided memcache drivers (at this"},{"line_number":110,"context_line":"    time `Memcached`, `BMemcached`, `Pylibmc` are valid)."},{"line_number":111,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26g%3D","line":108,"in_reply_to":"AAAAT3%2F%2F3RU%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    \"\"\"Pivot point to leverage the various dogpile.cache memcache backends."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    To specify a specific dogpile.cache memcached driver, pass the argument"},{"line_number":109,"context_line":"    `memcache_driver` set to one of the provided memcache drivers (at this"},{"line_number":110,"context_line":"    time `Memcached`, `BMemcached`, `Pylibmc` are valid)."},{"line_number":111,"context_line":"    \"\"\""},{"line_number":112,"context_line":"    def __init__(self, arguments):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3RM%3D","line":109,"updated":"2013-12-29 20:29:51.000000000","message":"why is memcached driver called \"memcache_driver\", shouldn\u0027t it be \"memcached_driver\"?","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    \"\"\"Pivot point to leverage the various dogpile.cache memcache backends."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    To specify a specific dogpile.cache memcached driver, pass the argument"},{"line_number":109,"context_line":"    `memcache_driver` set to one of the provided memcache drivers (at this"},{"line_number":110,"context_line":"    time `Memcached`, `BMemcached`, `Pylibmc` are valid)."},{"line_number":111,"context_line":"    \"\"\""},{"line_number":112,"context_line":"    def __init__(self, arguments):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26o%3D","line":109,"in_reply_to":"AAAAT3%2F%2F3RM%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self.lock_timeout \u003d arguments.pop(\u0027lock_timeout\u0027, None)"},{"line_number":114,"context_line":"        self.max_lock_attempts \u003d arguments.pop(\u0027max_lock_attempts\u0027, 15)"},{"line_number":115,"context_line":"        # NOTE(morganfainberg): Remove distributed locking from the arguments"},{"line_number":116,"context_line":"        # passed to the \"real\" backend if it exists."},{"line_number":117,"context_line":"        self._key_mangler \u003d None"},{"line_number":118,"context_line":"        self._raw_no_expiry_keys \u003d set(arguments.pop(\u0027no_expiry_keys\u0027, []))"},{"line_number":119,"context_line":"        self._no_expiry_keys \u003d self._raw_no_expiry_keys"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3RE%3D","line":116,"updated":"2013-12-29 20:29:51.000000000","message":"This note either doesn\u0027t apply anymore or it\u0027s not being done as it should be.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self.lock_timeout \u003d arguments.pop(\u0027lock_timeout\u0027, None)"},{"line_number":114,"context_line":"        self.max_lock_attempts \u003d arguments.pop(\u0027max_lock_attempts\u0027, 15)"},{"line_number":115,"context_line":"        # NOTE(morganfainberg): Remove distributed locking from the arguments"},{"line_number":116,"context_line":"        # passed to the \"real\" backend if it exists."},{"line_number":117,"context_line":"        self._key_mangler \u003d None"},{"line_number":118,"context_line":"        self._raw_no_expiry_keys \u003d set(arguments.pop(\u0027no_expiry_keys\u0027, []))"},{"line_number":119,"context_line":"        self._no_expiry_keys \u003d self._raw_no_expiry_keys"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26s%3D","line":116,"in_reply_to":"AAAAT3%2F%2F3RE%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":120,"context_line":"        self._set_arguments \u003d {}"},{"line_number":121,"context_line":"        if \u0027min_compress_len\u0027 in arguments:"},{"line_number":122,"context_line":"            self._set_arguments[\u0027min_compress_len\u0027] \u003d \\"},{"line_number":123,"context_line":"                arguments[\u0027min_compress_len\u0027]"},{"line_number":124,"context_line":"        if \u0027memcached_expire_time\u0027 in arguments:"},{"line_number":125,"context_line":"            self._set_arguments[\u0027time\u0027] \u003d arguments[\u0027memcached_expire_time\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3RI%3D","line":122,"updated":"2013-12-29 20:29:51.000000000","message":"use () to continue a line rather than \\","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":120,"context_line":"        self._set_arguments \u003d {}"},{"line_number":121,"context_line":"        if \u0027min_compress_len\u0027 in arguments:"},{"line_number":122,"context_line":"            self._set_arguments[\u0027min_compress_len\u0027] \u003d \\"},{"line_number":123,"context_line":"                arguments[\u0027min_compress_len\u0027]"},{"line_number":124,"context_line":"        if \u0027memcached_expire_time\u0027 in arguments:"},{"line_number":125,"context_line":"            self._set_arguments[\u0027time\u0027] \u003d arguments[\u0027memcached_expire_time\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F26w%3D","line":122,"in_reply_to":"AAAAT3%2F%2F3RI%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            if backend not in VALID_DOGPILE_BACKENDS:"},{"line_number":140,"context_line":"                raise ValueError("},{"line_number":141,"context_line":"                    _(\u0027Backend `%(driver)s` is not a valid memcached \u0027"},{"line_number":142,"context_line":"                      \u0027backend. Valid drivers: %(driver_list)s\u0027) %"},{"line_number":143,"context_line":"                    dict(driver\u003dbackend,"},{"line_number":144,"context_line":"                         driver_list\u003d\u0027,\u0027.join(VALID_DOGPILE_BACKENDS.keys())))"},{"line_number":145,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Qw%3D","line":142,"updated":"2013-12-29 20:29:51.000000000","message":"this is an unrelated change and should be split out.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            if backend not in VALID_DOGPILE_BACKENDS:"},{"line_number":140,"context_line":"                raise ValueError("},{"line_number":141,"context_line":"                    _(\u0027Backend `%(driver)s` is not a valid memcached \u0027"},{"line_number":142,"context_line":"                      \u0027backend. Valid drivers: %(driver_list)s\u0027) %"},{"line_number":143,"context_line":"                    dict(driver\u003dbackend,"},{"line_number":144,"context_line":"                         driver_list\u003d\u0027,\u0027.join(VALID_DOGPILE_BACKENDS.keys())))"},{"line_number":145,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F260%3D","line":142,"in_reply_to":"AAAAT3%2F%2F3Qw%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":149,"context_line":"        set_arguments \u003d self._set_arguments.copy()"},{"line_number":150,"context_line":"        if exclude_expiry:"},{"line_number":151,"context_line":"            # NOTE(morganfainberg): Explicitly strip out the \u0027time\u0027 key/value"},{"line_number":152,"context_line":"            # from the set_arguments in the case that this key isn\u0027t meant to"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Qg%3D","line":149,"updated":"2013-12-29 20:29:51.000000000","message":"suggest move this into the if block.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":149,"context_line":"        set_arguments \u003d self._set_arguments.copy()"},{"line_number":150,"context_line":"        if exclude_expiry:"},{"line_number":151,"context_line":"            # NOTE(morganfainberg): Explicitly strip out the \u0027time\u0027 key/value"},{"line_number":152,"context_line":"            # from the set_arguments in the case that this key isn\u0027t meant to"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F264%3D","line":149,"in_reply_to":"AAAAT3%2F%2F3Qg%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def set(self, key, value):"},{"line_number":159,"context_line":"        no_expiry \u003d key in self._no_expiry_keys"},{"line_number":160,"context_line":"        set_arguments \u003d self._get_set_arguments(no_expiry)"},{"line_number":161,"context_line":"        self.driver.set(key, value, **set_arguments)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def set_multi(self, mapping):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3Qo%3D","line":160,"updated":"2013-12-29 20:29:51.000000000","message":"use named argument for named parameter, change \"no_expiry\" to \"exclude_expiry\u003dno_expiry\"\n\nalso, suggest change \"no_expiry\" to \"exclude_expiry\"","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def set(self, key, value):"},{"line_number":159,"context_line":"        no_expiry \u003d key in self._no_expiry_keys"},{"line_number":160,"context_line":"        set_arguments \u003d self._get_set_arguments(no_expiry)"},{"line_number":161,"context_line":"        self.driver.set(key, value, **set_arguments)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def set_multi(self, mapping):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F268%3D","line":160,"in_reply_to":"AAAAT3%2F%2F3Qo%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @property"},{"line_number":186,"context_line":"    def key_mangler(self):"},{"line_number":187,"context_line":"        if self._key_mangler is None:"},{"line_number":188,"context_line":"            return self.driver.key_mangler"},{"line_number":189,"context_line":"        return self._key_mangler"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3QY%3D","line":187,"updated":"2013-12-29 20:29:51.000000000","message":"suggest set _key_mangler to self.driver.key_mangler rather than set it to None, then don\u0027t need to make this check.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @property"},{"line_number":186,"context_line":"    def key_mangler(self):"},{"line_number":187,"context_line":"        if self._key_mangler is None:"},{"line_number":188,"context_line":"            return self.driver.key_mangler"},{"line_number":189,"context_line":"        return self._key_mangler"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F244%3D","line":187,"in_reply_to":"AAAAT3%2F%2F3QY%3D","updated":"2013-12-30 02:29:42.000000000","message":"I will need to 2x check on the impact that would have.  There are other bits of code that may get cranky if changed.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                no_expire.add(self._key_mangler(key))"},{"line_number":200,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":201,"context_line":"        elif key_mangler is None:"},{"line_number":202,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3QQ%3D","line":202,"updated":"2013-12-29 20:29:51.000000000","message":"is this supposed to also set self._key_mangler? (add a test)\n\nAlso, is it supposed to re-hash the keys? If not, add a comment.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                no_expire.add(self._key_mangler(key))"},{"line_number":200,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":201,"context_line":"        elif key_mangler is None:"},{"line_number":202,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F27E%3D","line":202,"in_reply_to":"AAAAT3%2F%2F3QQ%3D","updated":"2013-12-30 02:29:42.000000000","message":"I\u0027ll add a comment but this is the equivalent of rehashing the keys.  self._no_expiry_keys is the hashed versions, if key_mangler is None, we don\u0027t rehash.  Yes it should set self._key_mangler.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":201,"context_line":"        elif key_mangler is None:"},{"line_number":202,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3QU%3D","line":203,"updated":"2013-12-29 20:29:51.000000000","message":"remove this useless line.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            self._no_expiry_keys \u003d no_expire"},{"line_number":201,"context_line":"        elif key_mangler is None:"},{"line_number":202,"context_line":"            self._no_expiry_keys \u003d self._raw_no_expiry_keys"},{"line_number":203,"context_line":"            pass"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F27A%3D","line":203,"in_reply_to":"AAAAT3%2F%2F3QU%3D","updated":"2013-12-30 02:29:42.000000000","message":"Done","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dc39e8e688ab887e5d5b901d6d2f2cf821c11356","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\"Basic Mixin for setting an explicit TTL via the client object."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"       This mixin circumvents the TTL the driver object (abstraction above"},{"line_number":42,"context_line":"       the client) provides for exceptional cases (e.g. non-expiring keys)."},{"line_number":43,"context_line":"       \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def set(self, key, value, **set_arguments):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F9xGU%3D","line":42,"updated":"2014-02-04 06:37:11.000000000","message":"perhaps an \"and\" before provides?","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"76c68b02a02b3cc5c9fa88a26af7600fe56492c2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\"Basic Mixin for setting an explicit TTL via the client object."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"       This mixin circumvents the TTL the driver object (abstraction above"},{"line_number":42,"context_line":"       the client) provides for exceptional cases (e.g. non-expiring keys)."},{"line_number":43,"context_line":"       \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def set(self, key, value, **set_arguments):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F9rqw%3D","line":42,"in_reply_to":"AAAAUH%2F9xGU%3D","updated":"2014-02-05 01:33:23.000000000","message":"Next patchset, will be fixed.","commit_id":"fd28792bb3d1a2ac6512af205c242927a4215132"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":118,"context_line":"        # NOTE(morganfainberg): Shallow copy the .set_arguments dict to"},{"line_number":119,"context_line":"        # ensure no changes cause the values to change in the instance"},{"line_number":120,"context_line":"        # variable."}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAak%3D","line":117,"updated":"2014-02-17 17:43:06.000000000","message":"suggest rename to _get_set_arguments_driver_attr to make it clearer.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":118,"context_line":"        # NOTE(morganfainberg): Shallow copy the .set_arguments dict to"},{"line_number":119,"context_line":"        # ensure no changes cause the values to change in the instance"},{"line_number":120,"context_line":"        # variable."}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2Fu4%3D","line":117,"in_reply_to":"AAAAUX%2F%2FAak%3D","updated":"2014-02-17 18:51:57.000000000","message":"I like that. done in next patch","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":118,"context_line":"        # NOTE(morganfainberg): Shallow copy the .set_arguments dict to"},{"line_number":119,"context_line":"        # ensure no changes cause the values to change in the instance"},{"line_number":120,"context_line":"        # variable."},{"line_number":121,"context_line":"        set_arguments \u003d getattr(self.driver, \u0027set_arguments\u0027, {}).copy()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAZ4%3D","line":118,"updated":"2014-02-17 17:43:06.000000000","message":"suggest add a newline before the comment so it\u0027s clear that the comment applies to the next line and not to the function as a while.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                self.driver \u003d VALID_DOGPILE_BACKENDS[backend](arguments)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_set_arguments(self, exclude_expiry\u003dFalse):"},{"line_number":118,"context_line":"        # NOTE(morganfainberg): Shallow copy the .set_arguments dict to"},{"line_number":119,"context_line":"        # ensure no changes cause the values to change in the instance"},{"line_number":120,"context_line":"        # variable."},{"line_number":121,"context_line":"        set_arguments \u003d getattr(self.driver, \u0027set_arguments\u0027, {}).copy()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2Fu0%3D","line":118,"in_reply_to":"AAAAUX%2F%2FAZ4%3D","updated":"2014-02-17 18:51:57.000000000","message":"done","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            set_arguments.pop(\u0027time\u0027, None)"},{"line_number":127,"context_line":"        return set_arguments"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def set(self, key, value):"},{"line_number":130,"context_line":"        no_expiry \u003d key in self.no_expiry_hashed_keys"},{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAXQ%3D","line":129,"updated":"2014-02-17 17:43:06.000000000","message":"could this be implemented in terms of set_multi to eliminate some duplication?","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            set_arguments.pop(\u0027time\u0027, None)"},{"line_number":127,"context_line":"        return set_arguments"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def set(self, key, value):"},{"line_number":130,"context_line":"        no_expiry \u003d key in self.no_expiry_hashed_keys"},{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2Fuk%3D","line":129,"in_reply_to":"AAAAUX%2F%2FAXQ%3D","updated":"2014-02-17 18:51:57.000000000","message":"Yes.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        no_expiry \u003d key in self.no_expiry_hashed_keys"},{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"},{"line_number":133,"context_line":"            # bypass the backend and directly call the client."},{"line_number":134,"context_line":"            set_arguments \u003d self._get_set_arguments(exclude_expiry\u003dno_expiry)"},{"line_number":135,"context_line":"            self.driver.client.set(key, value, **set_arguments)"},{"line_number":136,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAX4%3D","line":133,"updated":"2014-02-17 17:43:06.000000000","message":"this explains what the code is doing but doesn\u0027t say why... why does the code work this way?","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        no_expiry \u003d key in self.no_expiry_hashed_keys"},{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"},{"line_number":133,"context_line":"            # bypass the backend and directly call the client."},{"line_number":134,"context_line":"            set_arguments \u003d self._get_set_arguments(exclude_expiry\u003dno_expiry)"},{"line_number":135,"context_line":"            self.driver.client.set(key, value, **set_arguments)"},{"line_number":136,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2Fug%3D","line":133,"in_reply_to":"AAAAUX%2F%2FAX4%3D","updated":"2014-02-17 18:51:57.000000000","message":"I\u0027ll expand","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"},{"line_number":133,"context_line":"            # bypass the backend and directly call the client."},{"line_number":134,"context_line":"            set_arguments \u003d self._get_set_arguments(exclude_expiry\u003dno_expiry)"},{"line_number":135,"context_line":"            self.driver.client.set(key, value, **set_arguments)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            self.driver.set(key, value)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAYg%3D","line":134,"updated":"2014-02-17 17:43:06.000000000","message":"no_expiry is always going to be True here, so suggest change \"exclude_expiry\u003dno_expiry\" to \"exclude_expiry\u003dTrue\".","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if no_expiry:"},{"line_number":132,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"},{"line_number":133,"context_line":"            # bypass the backend and directly call the client."},{"line_number":134,"context_line":"            set_arguments \u003d self._get_set_arguments(exclude_expiry\u003dno_expiry)"},{"line_number":135,"context_line":"            self.driver.client.set(key, value, **set_arguments)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            self.driver.set(key, value)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2FuY%3D","line":134,"in_reply_to":"AAAAUX%2F%2FAYg%3D","updated":"2014-02-17 18:51:57.000000000","message":"Ok, i can see how that is more clear","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        if no_expiry_keys:"},{"line_number":145,"context_line":"            # NOTE(morganfainberg): For keys that have \u0027expiry\u0027 excluded,"},{"line_number":146,"context_line":"            # bypass the backend and directly call the client."},{"line_number":147,"context_line":"            new_mapping \u003d dict((k, mapping[k]) for k in no_expiry_keys)"},{"line_number":148,"context_line":"            set_arguments \u003d self._get_set_arguments(exclude_expiry\u003dTrue)"},{"line_number":149,"context_line":"            self.driver.client.set_multi(new_mapping, **set_arguments)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FAXc%3D","line":146,"updated":"2014-02-17 17:43:06.000000000","message":"this explains what the code is doing but doesn\u0027t say why... why does the code work this way?","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9f267c1d962d91ca5e4b7d77c45e7126c2704c49","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            # list since we no longer have a key_mangler."},{"line_number":177,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":178,"context_line":"        else:"},{"line_number":179,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _rehash_keys(self):"},{"line_number":182,"context_line":"        no_expire \u003d set()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2FwQ%3D","line":179,"updated":"2014-02-17 18:46:09.000000000","message":"there should be a unit test for this.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            # list since we no longer have a key_mangler."},{"line_number":177,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":178,"context_line":"        else:"},{"line_number":179,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _rehash_keys(self):"},{"line_number":182,"context_line":"        no_expire \u003d set()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2FuQ%3D","line":179,"in_reply_to":"AAAAUX%2F%2B%2FwQ%3D","updated":"2014-02-17 18:51:57.000000000","message":"agreed.  will add one","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ae339dab4e81cef8b70f7625f226865f51160207","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        elif key_mangler is None:"},{"line_number":176,"context_line":"            # NOTE(morganfainberg): Set the hashed key map to the unhashed"},{"line_number":177,"context_line":"            # list since we no longer have a key_mangler."},{"line_number":178,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2ByZM%3D","line":178,"updated":"2014-02-19 03:09:48.000000000","message":"self._key_manger \u003d None\n\nsuggest add a test that if you set key_mangler to none then the key_mangler property is now None.","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ae339dab4e81cef8b70f7625f226865f51160207","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _rehash_keys(self):"},{"line_number":183,"context_line":"        no_expire \u003d set()"},{"line_number":184,"context_line":"        for key in self.raw_no_expiry_keys:"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2ByUs%3D","line":181,"updated":"2014-02-19 03:09:48.000000000","message":"this isn\u0027t getting tested. coverage report shows there\u0027s nothing hitting it, and I tried commenting it out and test_noncallable_key_mangler_set_on_driver_raises_type_error didn\u0027t hit it.","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e648c08450b36fa752294d97a461c8d7e0479d80","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self._key_mangler \u003d None"},{"line_number":179,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":180,"context_line":"        else:"},{"line_number":181,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _rehash_keys(self):"},{"line_number":184,"context_line":"        no_expire \u003d set()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqFs%3D","line":181,"updated":"2014-02-19 23:35:05.000000000","message":"This case isn\u0027t tested in the unit tests.","commit_id":"fd11e2eea200c8cab25c8d9a2627de35165c80ab"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"38544585843c1a21e3e7a6a01e3cfad974bb1aa4","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self._key_mangler \u003d None"},{"line_number":179,"context_line":"            self.no_expiry_hashed_keys \u003d self.raw_no_expiry_keys"},{"line_number":180,"context_line":"        else:"},{"line_number":181,"context_line":"            raise TypeError(_(\u0027`key_mangler` functions must be callable.\u0027))"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _rehash_keys(self):"},{"line_number":184,"context_line":"        no_expire \u003d set()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2Bp8g%3D","line":181,"in_reply_to":"AAAAUX%2F%2BqFs%3D","updated":"2014-02-19 23:56:02.000000000","message":"Was off by one level in the test case. resolved.","commit_id":"fd11e2eea200c8cab25c8d9a2627de35165c80ab"}],"keystone/common/kvs/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2203bf308f98feea3dfee39446af322d34f5f41b","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                self._region.backend.key_mangler \u003d key_mangler"},{"line_number":146,"context_line":"            except Exception as e:"},{"line_number":147,"context_line":"                # NOTE(morganfainberg): This is used simply to allow the"},{"line_number":148,"context_line":"                # backend to have a mechanism to calculate out a key if needed."},{"line_number":149,"context_line":"                # Not all backends will support this.  Log this as a warning"},{"line_number":150,"context_line":"                # and move on."},{"line_number":151,"context_line":"                LOG.warning(_(\u0027Unable to set key_mangler on backend for \u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F3P4%3D","line":148,"updated":"2013-12-29 20:29:51.000000000","message":"I don\u0027t know what \"calculate out\" means.\n\nThe key mangling changes seem like they should be in a separate commit.","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"456da79f92bdf7306c7a50ea54dd3473c9fc67ed","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                self._region.backend.key_mangler \u003d key_mangler"},{"line_number":146,"context_line":"            except Exception as e:"},{"line_number":147,"context_line":"                # NOTE(morganfainberg): This is used simply to allow the"},{"line_number":148,"context_line":"                # backend to have a mechanism to calculate out a key if needed."},{"line_number":149,"context_line":"                # Not all backends will support this.  Log this as a warning"},{"line_number":150,"context_line":"                # and move on."},{"line_number":151,"context_line":"                LOG.warning(_(\u0027Unable to set key_mangler on backend for \u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAT3%2F%2F254%3D","line":148,"in_reply_to":"AAAAT3%2F%2F3P4%3D","updated":"2013-12-30 02:29:42.000000000","message":"I can pull them into their own parent commit, but they are tied to the ability to hash the keys and not set a TTL on those keys (dogpile globally sets a TTL if configured to do so, and in the case of certain keys we don\u0027t want that).","commit_id":"d58a980fab839d4193fddc7a3498546a908e0a39"}],"keystone/tests/test_kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.lock_set_time \u003d None"},{"line_number":100,"context_line":"            self.lock_expiry \u003d None"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def set(self, key, value, **set_arguments):"},{"line_number":103,"context_line":"            self.keys_values.clear()"},{"line_number":104,"context_line":"            self.keys_values[key] \u003d value"},{"line_number":105,"context_line":"            self.set_arguments_passed \u003d set_arguments"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FASg%3D","line":102,"updated":"2014-02-17 17:43:06.000000000","message":"this looks like a mock... suggest use mock.MagicMock.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.lock_set_time \u003d None"},{"line_number":100,"context_line":"            self.lock_expiry \u003d None"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def set(self, key, value, **set_arguments):"},{"line_number":103,"context_line":"            self.keys_values.clear()"},{"line_number":104,"context_line":"            self.keys_values[key] \u003d value"},{"line_number":105,"context_line":"            self.set_arguments_passed \u003d set_arguments"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2FuE%3D","line":102,"in_reply_to":"AAAAUX%2F%2FASg%3D","updated":"2014-02-17 18:51:57.000000000","message":"I will look into it, it might be a mock.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"abb5fcffcfc53198dfb0561541362ee728657b46","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        super(KVSTest, self).setUp()"},{"line_number":152,"context_line":"        self.addCleanup(memcached.VALID_DOGPILE_BACKENDS.pop,"},{"line_number":153,"context_line":"                        \u0027TestDriver\u0027,"},{"line_number":154,"context_line":"                        None)"},{"line_number":155,"context_line":"        self.key_foo \u003d \u0027foo_\u0027 + uuid.uuid4().hex"},{"line_number":156,"context_line":"        self.value_foo \u003d uuid.uuid4().hex"},{"line_number":157,"context_line":"        self.key_bar \u003d \u0027bar_\u0027 + uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FARE%3D","line":154,"updated":"2014-02-17 17:43:06.000000000","message":"if this was moved right next to line 159 it would be more obvious why the addCleanup is in this function.","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"af0fd36492824c0a9927c4f49b7b8a827c29d4aa","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        super(KVSTest, self).setUp()"},{"line_number":152,"context_line":"        self.addCleanup(memcached.VALID_DOGPILE_BACKENDS.pop,"},{"line_number":153,"context_line":"                        \u0027TestDriver\u0027,"},{"line_number":154,"context_line":"                        None)"},{"line_number":155,"context_line":"        self.key_foo \u003d \u0027foo_\u0027 + uuid.uuid4().hex"},{"line_number":156,"context_line":"        self.value_foo \u003d uuid.uuid4().hex"},{"line_number":157,"context_line":"        self.key_bar \u003d \u0027bar_\u0027 + uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2B%2Ft0%3D","line":154,"in_reply_to":"AAAAUX%2F%2FARE%3D","updated":"2014-02-17 18:51:57.000000000","message":"done","commit_id":"8e5ade0802a98aee51ef672e137dd0681bfe616e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ae339dab4e81cef8b70f7625f226865f51160207","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        self.assertSetEqual(no_expiry_keys,"},{"line_number":441,"context_line":"                            kvs._region.backend.raw_no_expiry_keys)"},{"line_number":442,"context_line":"        calculated_keys \u003d set([new_mangler(key) for key in no_expiry_keys])"},{"line_number":443,"context_line":"        setattr(kvs._region.backend, \u0027key_mangler\u0027, new_mangler)"},{"line_number":444,"context_line":"        self.assertSetEqual(calculated_keys,"},{"line_number":445,"context_line":"                            kvs._region.backend.no_expiry_hashed_keys)"},{"line_number":446,"context_line":"        self.assertSetEqual(no_expiry_keys,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2ByX4%3D","line":443,"updated":"2014-02-19 03:09:48.000000000","message":"why using setattr here?\n\n kvs._region.backend.key_mangler \u003d new_mangler\n\nthe python docs say this is equivalent.","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ae339dab4e81cef8b70f7625f226865f51160207","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            kvs._region.backend.driver.key_mangler \u003d \u0027Non-Callable\u0027"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        self.assertRaises(TypeError,"},{"line_number":458,"context_line":"                          set_key_mangler_on_driver())"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def test_kvs_memcache_set_arguments_and_memcache_expires_ttl(self):"},{"line_number":461,"context_line":"        # Test the \"set_arguments\" (arguments passed on all set calls) logic"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2ByaI%3D","line":458,"updated":"2014-02-19 03:09:48.000000000","message":"could use setattr rather than have an extra function.\n\n  setattr, kvs._region.backend.driver, \u0027key_mangler\u0027, \u0027Non-Callable\u0027)","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"973e2fce0d5a5cbeb5b83f03283ab8523343b4e5","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            kvs._region.backend.driver.key_mangler \u003d \u0027Non-Callable\u0027"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        self.assertRaises(TypeError,"},{"line_number":458,"context_line":"                          set_key_mangler_on_driver())"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def test_kvs_memcache_set_arguments_and_memcache_expires_ttl(self):"},{"line_number":461,"context_line":"        # Test the \"set_arguments\" (arguments passed on all set calls) logic"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BrnU%3D","line":458,"in_reply_to":"AAAAUX%2F%2ByaI%3D","updated":"2014-02-19 20:47:48.000000000","message":"unfortunately, setattr will not call the magic decorator .settr().  As the test fails when I try it the way you\u0027re recommending.  setattr() does other magic.","commit_id":"673751643e1d817c6d14d607b33d9f382d423e8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f0a88d011c702b44f0d6bb08e56e6b195f208956","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        kvs._region.backend.key_mangler \u003d None"},{"line_number":457,"context_line":"        self.assertSetEqual(kvs._region.backend.raw_no_expiry_keys,"},{"line_number":458,"context_line":"                            kvs._region.backend.no_expiry_hashed_keys)"},{"line_number":459,"context_line":"        self.assertIs(kvs._region.backend.key_mangler, None)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def test_noncallable_key_mangler_set_on_driver_raises_type_error(self):"},{"line_number":462,"context_line":"        kvs \u003d self._get_kvs_region()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqEM%3D","line":459,"updated":"2014-02-19 23:40:07.000000000","message":"use assertIsNone","commit_id":"fd11e2eea200c8cab25c8d9a2627de35165c80ab"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"38544585843c1a21e3e7a6a01e3cfad974bb1aa4","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        kvs._region.backend.key_mangler \u003d None"},{"line_number":457,"context_line":"        self.assertSetEqual(kvs._region.backend.raw_no_expiry_keys,"},{"line_number":458,"context_line":"                            kvs._region.backend.no_expiry_hashed_keys)"},{"line_number":459,"context_line":"        self.assertIs(kvs._region.backend.key_mangler, None)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def test_noncallable_key_mangler_set_on_driver_raises_type_error(self):"},{"line_number":462,"context_line":"        kvs \u003d self._get_kvs_region()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2Bp%2Fo%3D","line":459,"in_reply_to":"AAAAUX%2F%2BqEM%3D","updated":"2014-02-19 23:54:56.000000000","message":"Done in next patchset.","commit_id":"fd11e2eea200c8cab25c8d9a2627de35165c80ab"}]}
