)]}'
{"doc/source/developing.rst":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e5dadfbab05d3855a715580f3739a77b94c73531","unresolved":false,"context_lines":[{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed.  To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function.  Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured.  The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"},{"line_number":377,"context_line":"``weakref`` to match the KVS object to the name)."}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9l5Y%3D","line":374,"updated":"2013-12-09 21:37:37.000000000","message":"It looks like you are putting 2 spaces after each period. I was taught by gyee to only put one","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed.  To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function.  Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured.  The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"},{"line_number":377,"context_line":"``weakref`` to match the KVS object to the name)."}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9lWk%3D","line":374,"in_reply_to":"AAAATn%2F9l5Y%3D","updated":"2013-12-09 23:35:53.000000000","message":"Done.  Habit from english classes in college I guess.","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e5dadfbab05d3855a715580f3739a77b94c73531","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":382,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memory\u0027, ...)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Any key-word arguments passed to the configure method that are not defined as part of the KeyValueStore"},{"line_number":385,"context_line":"object configuration are passed to the backend for further configuration (e.g. memcache servers,"},{"line_number":386,"context_line":"lock_timeout, etc)."},{"line_number":387,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9l30%3D","line":384,"updated":"2013-12-09 21:37:37.000000000","message":"Line too long? Also why the dash between key and word?","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":382,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memory\u0027, ...)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Any key-word arguments passed to the configure method that are not defined as part of the KeyValueStore"},{"line_number":385,"context_line":"object configuration are passed to the backend for further configuration (e.g. memcache servers,"},{"line_number":386,"context_line":"lock_timeout, etc)."},{"line_number":387,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9lWg%3D","line":384,"in_reply_to":"AAAATn%2F9l30%3D","updated":"2013-12-09 23:35:53.000000000","message":"Line length is less of an issue in the RST docs, but I\u0027ll collapse it down.","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e5dadfbab05d3855a715580f3739a77b94c73531","unresolved":false,"context_lines":[{"line_number":390,"context_line":"allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the provided"},{"line_number":393,"context_line":"dogpile.cache memcached backends (``BMemcached``, ``pylibmc``, and basic ``Memcached``).  By default the"},{"line_number":394,"context_line":"standard Memcache backend is used.  Currently the Memcache URLs come from the ``servers`` option in the"},{"line_number":395,"context_line":"``[memcache]`` configuration section of the Keystone config."},{"line_number":396,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9l3M%3D","line":393,"updated":"2013-12-09 21:37:37.000000000","message":"Line too long?","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":390,"context_line":"allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the provided"},{"line_number":393,"context_line":"dogpile.cache memcached backends (``BMemcached``, ``pylibmc``, and basic ``Memcached``).  By default the"},{"line_number":394,"context_line":"standard Memcache backend is used.  Currently the Memcache URLs come from the ``servers`` option in the"},{"line_number":395,"context_line":"``[memcache]`` configuration section of the Keystone config."},{"line_number":396,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9lWc%3D","line":393,"in_reply_to":"AAAATn%2F9l3M%3D","updated":"2013-12-09 23:35:53.000000000","message":"Done","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1649c58ef0726c50669ec8a54d196d66fe62cbbf","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    # Set a Value"},{"line_number":408,"context_line":"    kvs_store.set(\u003cKey\u003e, \u003cValue\u003e)"},{"line_number":409,"context_line":"    # Retrieve a value:"},{"line_number":410,"context_line":"    retrived_value \u003d kvs_store.get(\u003ckey\u003e)"},{"line_number":411,"context_line":"    # Delete a key/value pair:"},{"line_number":412,"context_line":"    kvs_store.delete(\u003ckey\u003e)"},{"line_number":413,"context_line":"    # multi-get:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9oNU%3D","line":410,"updated":"2013-12-09 15:41:42.000000000","message":"retrieved_value*","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    # Set a Value"},{"line_number":408,"context_line":"    kvs_store.set(\u003cKey\u003e, \u003cValue\u003e)"},{"line_number":409,"context_line":"    # Retrieve a value:"},{"line_number":410,"context_line":"    retrived_value \u003d kvs_store.get(\u003ckey\u003e)"},{"line_number":411,"context_line":"    # Delete a key/value pair:"},{"line_number":412,"context_line":"    kvs_store.delete(\u003ckey\u003e)"},{"line_number":413,"context_line":"    # multi-get:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9lWY%3D","line":410,"in_reply_to":"AAAATn%2F9oNU%3D","updated":"2013-12-09 23:35:53.000000000","message":"Done","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e5dadfbab05d3855a715580f3739a77b94c73531","unresolved":false,"context_lines":[{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of the Keystone"},{"line_number":422,"context_line":"configuration file): ``enable_key_mangler``, if set to false will disable the use of key_manglers (modification"},{"line_number":423,"context_line":"of the key when saving to the backend to help prevent collisions/ exceeding key-size limits with memcached)."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9l24%3D","line":422,"updated":"2013-12-09 21:37:37.000000000","message":"typo between false and will","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of the Keystone"},{"line_number":422,"context_line":"configuration file): ``enable_key_mangler``, if set to false will disable the use of key_manglers (modification"},{"line_number":423,"context_line":"of the key when saving to the backend to help prevent collisions/ exceeding key-size limits with memcached)."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"AAAATn%2F9lWU%3D","line":422,"in_reply_to":"AAAATn%2F9l24%3D","updated":"2013-12-09 23:35:53.000000000","message":"Done","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"3a7c939c2e528fa20c144b16a3c42a1d6a123bf4","unresolved":false,"context_lines":[{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"},{"line_number":377,"context_line":"``weakref`` to match the KVS object to the name)."},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"Example Instantiation and Configuration::"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9ggo%3D","line":377,"updated":"2013-12-10 20:55:12.000000000","message":"Using weakref. Very cool!","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1f00363ac69057ff302d18438c3119e621648307","unresolved":false,"context_lines":[{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"},{"line_number":377,"context_line":"``weakref`` to match the KVS object to the name)."},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"Example Instantiation and Configuration::"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9gPU%3D","line":377,"in_reply_to":"AAAATn%2F9ggo%3D","updated":"2013-12-10 21:03:43.000000000","message":"Yeah, I wanted a mechanism to let \"namespaces\" to expire without the need to do an explicit de-register.  if you dump your references, the next get will be clean.  It just felt \"right\".","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"3a7c939c2e528fa20c144b16a3c42a1d6a123bf4","unresolved":false,"context_lines":[{"line_number":394,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":395,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"Example configuring the KVS system to use memcached and a specific dogpile.cache memcached backend::"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":400,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, dogpile_cache_backend\u003d\u0027MemcachedBackend\u0027)"}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9gcs%3D","line":397,"updated":"2013-12-10 20:55:12.000000000","message":"How about: configuring the KVS system to use a KVS object named \u0027TestKVSRegion\u0027 that uses memcached and a specific dogpile.cache memcached backend::   ?  I was uncomfortable with TestKVSRegion not being described","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1f00363ac69057ff302d18438c3119e621648307","unresolved":false,"context_lines":[{"line_number":394,"context_line":"By default the standard Memcache backend is used.  Currently the Memcache URLs come from the"},{"line_number":395,"context_line":"``servers`` option in the ``[memcache]`` configuration section of the Keystone config."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"Example configuring the KVS system to use memcached and a specific dogpile.cache memcached backend::"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":400,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, dogpile_cache_backend\u003d\u0027MemcachedBackend\u0027)"}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9gQE%3D","line":397,"in_reply_to":"AAAATn%2F9gcs%3D","updated":"2013-12-10 21:03:43.000000000","message":"I\u0027ll get this in the next doc-pass.","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"3a7c939c2e528fa20c144b16a3c42a1d6a123bf4","unresolved":false,"context_lines":[{"line_number":402,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":403,"context_line":"implementations::"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":406,"context_line":"    kvs_store.configure(...)"},{"line_number":407,"context_line":"    # Set a Value"},{"line_number":408,"context_line":"    kvs_store.set(\u003cKey\u003e, \u003cValue\u003e)"}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9gcY%3D","line":405,"updated":"2013-12-10 20:55:12.000000000","message":"Great example section!!","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"3a7c939c2e528fa20c144b16a3c42a1d6a123bf4","unresolved":false,"context_lines":[{"line_number":425,"context_line":""},{"line_number":426,"context_line":".. WARNING::"},{"line_number":427,"context_line":"    Setting the ``enable_key_mangler`` option to False can have detrimental effects on the KeyValueStore"},{"line_number":428,"context_line":"    backend. It is recommended that this value is not set to False except for debugging issues with the"},{"line_number":429,"context_line":"    ``dogpile.cache`` backend itself."},{"line_number":430,"context_line":""},{"line_number":431,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"AAAATn%2F9gf0%3D","line":428,"updated":"2013-12-10 20:55:12.000000000","message":"Good safety tip!","commit_id":"cb4ac1c0f1876d038d023ace53560569dc8e5f5a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":368,"context_line":"cache backends to be used as a store. All interfacing to the KVS system happens via the"},{"line_number":369,"context_line":"``KeyValueStore`` object located at ``keystone.common.kvs.KeyValueStore``."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed. To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function. Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aa4%3D","line":371,"updated":"2013-12-11 20:12:53.000000000","message":"Who instantiate KeyValueStore? The example in line 381 seem to suggest get_key_value_store() is a factory.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":368,"context_line":"cache backends to be used as a store. All interfacing to the KVS system happens via the"},{"line_number":369,"context_line":"``KeyValueStore`` object located at ``keystone.common.kvs.KeyValueStore``."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed. To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function. Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aJ4%3D","line":371,"in_reply_to":"AAAATn%2F9aa4%3D","updated":"2013-12-11 20:45:22.000000000","message":"Correct, will clarify.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed. To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function. Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9abs%3D","line":373,"updated":"2013-12-11 20:12:53.000000000","message":"This sentence doesn\u0027t sound right grammatically. You mean\n\nTo acquire the previously instantiated KVS instance with the specified name, one must utilize the ...","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"To utilize the KVS system an instantiation of the ``KeyValueStore`` class is needed. To acquire"},{"line_number":372,"context_line":"the previously instantiated KVS object with the specified name (or in the case of no instantiation"},{"line_number":373,"context_line":"linked to that name) utilize the ``keystone.common.kvs.get_key_value_store`` function. Once the"},{"line_number":374,"context_line":"KeyValueStore object has been instantiated, it must be configured. The KVS object will only be"},{"line_number":375,"context_line":"retrievable with the ``get_key_value_store`` function while there is an active reference outside"},{"line_number":376,"context_line":"of the registry.  Once all references have been removed the object is gone (the registry uses a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aJ8%3D","line":373,"in_reply_to":"AAAATn%2F9abs%3D","updated":"2013-12-11 20:45:22.000000000","message":"Correct.  Will make easier to understand.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"Example Instantiation and Configuration::"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":382,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memory\u0027, ...)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Any keyword arguments passed to the configure method that are not defined as part of the"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9abE%3D","line":381,"updated":"2013-12-11 20:12:53.000000000","message":"So get_key_value_store() is a factory?","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"Example Instantiation and Configuration::"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":382,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memory\u0027, ...)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Any keyword arguments passed to the configure method that are not defined as part of the"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aKU%3D","line":381,"in_reply_to":"AAAATn%2F9abE%3D","updated":"2013-12-11 20:45:22.000000000","message":"Correct, Will clarify.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Any keyword arguments passed to the configure method that are not defined as part of the"},{"line_number":385,"context_line":"KeyValueStore object configuration are passed to the backend for further configuration (e.g."},{"line_number":386,"context_line":"memcache servers, lock_timeout, etc)."},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"The provided in-memory based backend has a single extra option ``isolation``; if ``isolation`` is"},{"line_number":389,"context_line":"set to false, the backend will not perform the ``copy.deepcopy`` operations on values during"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9abk%3D","line":386,"updated":"2013-12-11 20:12:53.000000000","message":"Like this design. Very flexible.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":386,"context_line":"memcache servers, lock_timeout, etc)."},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"The provided in-memory based backend has a single extra option ``isolation``; if ``isolation`` is"},{"line_number":389,"context_line":"set to false, the backend will not perform the ``copy.deepcopy`` operations on values during"},{"line_number":390,"context_line":"store/retrieval, allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aac%3D","line":389,"updated":"2013-12-11 20:12:53.000000000","message":"false -\u003e ``False``\n\nthough I have seen it with no quotes so I am not sure what\u0027s the recommended way to do this.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":386,"context_line":"memcache servers, lock_timeout, etc)."},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"The provided in-memory based backend has a single extra option ``isolation``; if ``isolation`` is"},{"line_number":389,"context_line":"set to false, the backend will not perform the ``copy.deepcopy`` operations on values during"},{"line_number":390,"context_line":"store/retrieval, allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aKc%3D","line":389,"in_reply_to":"AAAATn%2F9aac%3D","updated":"2013-12-11 20:45:22.000000000","message":"Done","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"The provided in-memory based backend has a single extra option ``isolation``; if ``isolation`` is"},{"line_number":389,"context_line":"set to false, the backend will not perform the ``copy.deepcopy`` operations on values during"},{"line_number":390,"context_line":"store/retrieval, allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"},{"line_number":393,"context_line":"provided dogpile.cache memcached backends (``BMemcached``, ``pylibmc``, and basic ``Memcached``)."}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aZo%3D","line":390,"updated":"2013-12-11 20:12:53.000000000","message":"Is there even a use case for non-isolation? Seem like we should always be doing isolation.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"The provided in-memory based backend has a single extra option ``isolation``; if ``isolation`` is"},{"line_number":389,"context_line":"set to false, the backend will not perform the ``copy.deepcopy`` operations on values during"},{"line_number":390,"context_line":"store/retrieval, allowing reference manipulation to affect the backend directly."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"The memcached backend uses the Keystone manager mechanism to support the use of any of the"},{"line_number":393,"context_line":"provided dogpile.cache memcached backends (``BMemcached``, ``pylibmc``, and basic ``Memcached``)."}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aJY%3D","line":390,"in_reply_to":"AAAATn%2F9aZo%3D","updated":"2013-12-11 20:45:22.000000000","message":"This was asked for in the initial design discussion since copy.deepcopy is not exactly \"fast\" in all cases.  I can remove this functionality easily if there isn\u0027t a solid usecase.  (in fact, based on the two previous questions on this, I will remove it)","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":397,"context_line":"Example configuring the KVS system to use memcached and a specific dogpile.cache memcached backend::"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":400,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, dogpile_cache_backend\u003d\u0027MemcachedBackend\u0027)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":403,"context_line":"implementations::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aYo%3D","line":400,"updated":"2013-12-11 20:12:53.000000000","message":"Should we make the Memcached the default so that if configure() is not called user will get memcached?","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":397,"context_line":"Example configuring the KVS system to use memcached and a specific dogpile.cache memcached backend::"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    kvs_store \u003d kvs.get_key_value_store(\u0027TestKVSRegion\u0027)"},{"line_number":400,"context_line":"    kvs_store.configure(\u0027openstack.kvs.Memcached\u0027, dogpile_cache_backend\u003d\u0027MemcachedBackend\u0027)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"Once a KVS object has been instantiated the method of interacting is the same as most memcache"},{"line_number":403,"context_line":"implementations::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aH8%3D","line":400,"in_reply_to":"AAAATn%2F9aYo%3D","updated":"2013-12-11 20:45:22.000000000","message":"I am hesitant to make a \"default\" choice in the base-implementation due to outside dependencies or even worse, unintended use of an in-memory store (which could cause memory utilization bloat).  Look at https://review.openstack.org/#/c/60742 for example, it is on the developer or subclass to determine what a sane default backend is.  This is just the scaffolding to build a KVS store.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":418,"context_line":"    kvs_store.delete_multi([\u003ckey\u003e, \u003ckey\u003e, ...])"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of"},{"line_number":422,"context_line":"the Keystone configuration file): ``enable_key_mangler`` can be set top false, disabling the use of"},{"line_number":423,"context_line":"key_manglers (modification of the key when saving to the backend to help prevent"},{"line_number":424,"context_line":"collisions or exceeding key size limits with memcached)."}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aXw%3D","line":421,"updated":"2013-12-11 20:12:53.000000000","message":"isn\u0027t this the ``use_key_mangler`` option in the ``[cache]`` section?","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":418,"context_line":"    kvs_store.delete_multi([\u003ckey\u003e, \u003ckey\u003e, ...])"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of"},{"line_number":422,"context_line":"the Keystone configuration file): ``enable_key_mangler`` can be set top false, disabling the use of"},{"line_number":423,"context_line":"key_manglers (modification of the key when saving to the backend to help prevent"},{"line_number":424,"context_line":"collisions or exceeding key size limits with memcached)."}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aHs%3D","line":421,"in_reply_to":"AAAATn%2F9aXw%3D","updated":"2013-12-11 20:45:22.000000000","message":"Nope.  KVS store has a separate set of configs that need to be isolated from the cacheing configuration.  I will clarify.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of"},{"line_number":422,"context_line":"the Keystone configuration file): ``enable_key_mangler`` can be set top false, disabling the use of"},{"line_number":423,"context_line":"key_manglers (modification of the key when saving to the backend to help prevent"},{"line_number":424,"context_line":"collisions or exceeding key size limits with memcached)."},{"line_number":425,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9afc%3D","line":422,"updated":"2013-12-11 20:12:53.000000000","message":"set top -\u003e set to","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"There is a global configuration option to be aware of (that can be set in the ``[kvs]`` section of"},{"line_number":422,"context_line":"the Keystone configuration file): ``enable_key_mangler`` can be set top false, disabling the use of"},{"line_number":423,"context_line":"key_manglers (modification of the key when saving to the backend to help prevent"},{"line_number":424,"context_line":"collisions or exceeding key size limits with memcached)."},{"line_number":425,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"AAAATn%2F9aHk%3D","line":422,"in_reply_to":"AAAATn%2F9afc%3D","updated":"2013-12-11 20:45:22.000000000","message":"Done","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":424,"context_line":"    The ``enable_key_mangler`` option in the ``[kvs]`` section of the Keystone configuration file"},{"line_number":425,"context_line":"    is not the same option (and does not affect the cache-layer key manglers) from the option in the"},{"line_number":426,"context_line":"    ``[cache]`` section of the configuration file. Similarly the ``[cache]`` section options relating"},{"line_number":427,"context_line":"    to key manglers has no bearing on the ``[kvs]`` objects."},{"line_number":428,"context_line":""},{"line_number":429,"context_line":".. WARNING::"},{"line_number":430,"context_line":"    Setting the ``enable_key_mangler`` option to False can have detrimental effects on the KeyValueStore"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAATn%2F9ZH0%3D","line":427,"updated":"2013-12-12 00:29:48.000000000","message":"Like the note. This clears up any confusion with various key mangler options.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    backends \u003d backend_module1.backend_class1,backend_module2.backend_class2"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"All registered backends will receive the \"short name\" of \"openstack.kvs.\u003cclass name\u003e\" for use in the"},{"line_number":443,"context_line":"``configure`` method on the ``KeyValueStore`` object."},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"Building the Documentation"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAATn%2F9ZHY%3D","line":443,"updated":"2013-12-12 00:29:48.000000000","message":"Needless to say, the \u003cclass name\u003e must be globally unique.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fa62149e5b195a2df3c97dd8d257d21c302a7c81","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    backends \u003d backend_module1.backend_class1,backend_module2.backend_class2"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"All registered backends will receive the \"short name\" of \"openstack.kvs.\u003cclass name\u003e\" for use in the"},{"line_number":443,"context_line":"``configure`` method on the ``KeyValueStore`` object."},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"Building the Documentation"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAATn%2F9Y2U%3D","line":443,"in_reply_to":"AAAATn%2F9ZHY%3D","updated":"2013-12-12 00:38:30.000000000","message":"Minor rephrasing will happen to explicitly state class_name must be unique.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5b16d0b64d86a516f9db0942a865d864844ef55d","unresolved":false,"context_lines":[{"line_number":432,"context_line":"# servers \u003d localhost:11211"},{"line_number":433,"context_line":"# max_compare_and_set_retry \u003d 16"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"[kvs]"},{"line_number":436,"context_line":"# backends \u003d"},{"line_number":437,"context_line":"# config_prefix \u003d keystone.kvs"},{"line_number":438,"context_line":"# enable_key_mangler \u003d True"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAATn%2F%2BKo4%3D","line":435,"updated":"2013-11-30 05:35:14.000000000","message":"can you add a comment or two here? or should the user just read the docs? I don\u0027t think a quick comment would hurt. \n\nOverall, there are some inconsistencies with the .conf file (some parts have long comments, some have short, some have none). So maybe this isn\u0027t the right place.","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"46193731cc6d874cc1b8ee2b5822cfecf5709f5e","unresolved":false,"context_lines":[{"line_number":432,"context_line":"# servers \u003d localhost:11211"},{"line_number":433,"context_line":"# max_compare_and_set_retry \u003d 16"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"[kvs]"},{"line_number":436,"context_line":"# backends \u003d"},{"line_number":437,"context_line":"# config_prefix \u003d keystone.kvs"},{"line_number":438,"context_line":"# enable_key_mangler \u003d True"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAATn%2F%2BKIw%3D","line":435,"in_reply_to":"AAAATn%2F%2BKo4%3D","updated":"2013-11-30 17:28:51.000000000","message":"I\u0027m not sure if we should strip out the comments, etc.  The cache section was significantly more complex (hence the novel-like-comments).  For the most part these options shouldn\u0027t be changed unless debugging is occurring (with exception of \"backends\" when we get more in-depth configuration mechanisms for dynamic back-end use)","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":436,"context_line":"# backends \u003d"},{"line_number":437,"context_line":"# config_prefix \u003d keystone.kvs"},{"line_number":438,"context_line":"# enable_key_mangler \u003d True"},{"line_number":439,"context_line":"# default_lock_timeout \u003d 5"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"[paste_deploy]"},{"line_number":442,"context_line":"# Name of the paste configuration file that defines the available pipelines"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAATn%2F9aWM%3D","line":439,"updated":"2013-12-11 20:12:53.000000000","message":"5 seconds or miliseconds? may want to drop a comment here to clarify","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":436,"context_line":"# backends \u003d"},{"line_number":437,"context_line":"# config_prefix \u003d keystone.kvs"},{"line_number":438,"context_line":"# enable_key_mangler \u003d True"},{"line_number":439,"context_line":"# default_lock_timeout \u003d 5"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"[paste_deploy]"},{"line_number":442,"context_line":"# Name of the paste configuration file that defines the available pipelines"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAATn%2F9aHY%3D","line":439,"in_reply_to":"AAAATn%2F9aWM%3D","updated":"2013-12-11 20:45:22.000000000","message":"Done","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"}],"keystone/common/config.py":[{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"c0cc128f784319370f2660baa641f4f48c362cc0","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    \u0027paste_deploy\u0027: ["},{"line_number":261,"context_line":"        cfg.StrOpt(\u0027config_file\u0027, default\u003dNone)],"},{"line_number":262,"context_line":"    \u0027memcache\u0027: ["},{"line_number":263,"context_line":"        cfg.ListOpt(\u0027servers\u0027, default\u003d\u0027localhost:11211\u0027),"},{"line_number":264,"context_line":"        cfg.IntOpt(\u0027max_compare_and_set_retry\u0027, default\u003d16)],"},{"line_number":265,"context_line":"    \u0027catalog\u0027: ["},{"line_number":266,"context_line":"        cfg.StrOpt(\u0027template_file\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BFCc%3D","line":263,"updated":"2013-12-02 21:44:23.000000000","message":"This has been converted from a StrOpt to a ListOpt. Do we need to change the type of the default as well?","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ed1a8a8a2fa89a3e7817e111450f4f0d1faf6b8","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    \u0027paste_deploy\u0027: ["},{"line_number":261,"context_line":"        cfg.StrOpt(\u0027config_file\u0027, default\u003dNone)],"},{"line_number":262,"context_line":"    \u0027memcache\u0027: ["},{"line_number":263,"context_line":"        cfg.ListOpt(\u0027servers\u0027, default\u003d\u0027localhost:11211\u0027),"},{"line_number":264,"context_line":"        cfg.IntOpt(\u0027max_compare_and_set_retry\u0027, default\u003d16)],"},{"line_number":265,"context_line":"    \u0027catalog\u0027: ["},{"line_number":266,"context_line":"        cfg.StrOpt(\u0027template_file\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BERQ%3D","line":263,"in_reply_to":"AAAATn%2F%2BFCc%3D","updated":"2013-12-02 21:47:58.000000000","message":"Good catch, I\u0027ll 2x check that.","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"c0cc128f784319370f2660baa641f4f48c362cc0","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":269,"context_line":"                   default\u003d\u0027keystone.catalog.backends.sql.Catalog\u0027)],"},{"line_number":270,"context_line":"    \u0027kvs\u0027: ["},{"line_number":271,"context_line":"        cfg.ListOpt(\u0027backends\u0027, default\u003d[]),"},{"line_number":272,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027keystone.kvs\u0027),"},{"line_number":273,"context_line":"        cfg.BoolOpt(\u0027enable_key_mangler\u0027, default\u003dTrue),"},{"line_number":274,"context_line":"        cfg.IntOpt(\u0027default_lock_timeout\u0027, default\u003d5)]}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BFCY%3D","line":271,"updated":"2013-12-02 21:44:23.000000000","message":"On line 241 above, a ListOpt is initialized with a default value of None. Here we use an empty list. Do we need to be consistent?","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5514b15813a3e2691c7ebbcb56160afc05b5e92","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":269,"context_line":"                   default\u003d\u0027keystone.catalog.backends.sql.Catalog\u0027)],"},{"line_number":270,"context_line":"    \u0027kvs\u0027: ["},{"line_number":271,"context_line":"        cfg.ListOpt(\u0027backends\u0027, default\u003d[]),"},{"line_number":272,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027keystone.kvs\u0027),"},{"line_number":273,"context_line":"        cfg.BoolOpt(\u0027enable_key_mangler\u0027, default\u003dTrue),"},{"line_number":274,"context_line":"        cfg.IntOpt(\u0027default_lock_timeout\u0027, default\u003d5)]}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BDUE%3D","line":271,"in_reply_to":"AAAATn%2F%2BERI%3D","updated":"2013-12-03 02:38:33.000000000","message":"there are just inconsistencies, look at line 72 for an example with [] as the default.","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ed1a8a8a2fa89a3e7817e111450f4f0d1faf6b8","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":269,"context_line":"                   default\u003d\u0027keystone.catalog.backends.sql.Catalog\u0027)],"},{"line_number":270,"context_line":"    \u0027kvs\u0027: ["},{"line_number":271,"context_line":"        cfg.ListOpt(\u0027backends\u0027, default\u003d[]),"},{"line_number":272,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027keystone.kvs\u0027),"},{"line_number":273,"context_line":"        cfg.BoolOpt(\u0027enable_key_mangler\u0027, default\u003dTrue),"},{"line_number":274,"context_line":"        cfg.IntOpt(\u0027default_lock_timeout\u0027, default\u003d5)]}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BERI%3D","line":271,"in_reply_to":"AAAATn%2F%2BFCY%3D","updated":"2013-12-02 21:47:58.000000000","message":"Valid concern, I think this matters what the code expects as the default.  I\u0027ll check the differences here.","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"}],"keystone/common/kvs/__init__.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3c1e4bdeacfd3a0d7892448ce5ef295776502fb1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from dogpile.cache import region"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common.kvs.core import *  # flake8: noqa"},{"line_number":20,"context_line":"from keystone.common.kvs.legacy import *  # flake8: noqa"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"region.register_backend("},{"line_number":23,"context_line":"    \u0027openstack.kvs.Memory\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9q3w%3D","line":20,"updated":"2013-12-09 00:04:40.000000000","message":"why *? import what you want to expose.","commit_id":"a0bd171aa204424b821689123d043f10f08b6129"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"358814ea48ceedafbfcb164192c1695791edbf4d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from dogpile.cache import region"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common.kvs.core import *  # flake8: noqa"},{"line_number":20,"context_line":"from keystone.common.kvs.legacy import *  # flake8: noqa"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"region.register_backend("},{"line_number":23,"context_line":"    \u0027openstack.kvs.Memory\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9qls%3D","line":20,"in_reply_to":"AAAATn%2F9q3w%3D","updated":"2013-12-09 03:09:21.000000000","message":"Core uses __all__ as it should.  I\u0027ll make the legacy stuff explicit.  Even with __all__ being used in core, would you prefer explicit imports?","commit_id":"a0bd171aa204424b821689123d043f10f08b6129"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"region.register_backend("},{"line_number":28,"context_line":"    \u0027openstack.kvs.Memcached\u0027,"},{"line_number":29,"context_line":"    \u0027keystone.common.kvs.backends.memcached\u0027,"},{"line_number":30,"context_line":"    \u0027MemcachedBackend\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aVY%3D","line":30,"updated":"2013-12-11 20:12:53.000000000","message":"Wait, we need to register the backends here?\n\nMay want to mention this in developing.rst the fact that backends need to be registered.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"region.register_backend("},{"line_number":28,"context_line":"    \u0027openstack.kvs.Memcached\u0027,"},{"line_number":29,"context_line":"    \u0027keystone.common.kvs.backends.memcached\u0027,"},{"line_number":30,"context_line":"    \u0027MemcachedBackend\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aG0%3D","line":30,"in_reply_to":"AAAATn%2F9aVY%3D","updated":"2013-12-11 20:45:22.000000000","message":"I will add a section about registering the backends.  There is a configuration option to specify new backends that aren\u0027t provided  (ListOpt that does the registration work when you call get_key_value_store the first time)","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"}],"keystone/common/kvs/backends/inmemdb.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5b16d0b64d86a516f9db0942a865d864844ef55d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone In-Memory Dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import copy"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKos%3D","line":16,"updated":"2013-11-30 05:35:14.000000000","message":"new line needed between 15 and 16","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"96a400710d7b093d1c76ec57ce2748360fce9131","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone In-Memory Dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import copy"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKIk%3D","line":16,"in_reply_to":"AAAATn%2F%2BKos%3D","updated":"2013-11-30 17:29:48.000000000","message":"Done","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5b16d0b64d86a516f9db0942a865d864844ef55d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone In-Memory Dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import copy"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from dogpile.cache import api"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKoo%3D","line":18,"updated":"2013-11-30 05:35:14.000000000","message":"new line needed between 18 and 19","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"96a400710d7b093d1c76ec57ce2748360fce9131","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone In-Memory Dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import copy"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from dogpile.cache import api"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKIg%3D","line":18,"in_reply_to":"AAAATn%2F%2BKoo%3D","updated":"2013-11-30 17:29:48.000000000","message":"Done","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.isolation \u003d arguments.pop(\u0027isolation\u0027, False)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _isolate_value(self, value):"},{"line_number":64,"context_line":"        if not self.isolation and value is not NO_VALUE:"},{"line_number":65,"context_line":"            value \u003d copy.deepcopy(value)"},{"line_number":66,"context_line":"        return value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F995E%3D","line":64,"updated":"2013-12-03 23:25:00.000000000","message":"Is the boolean expression \u0027not self.isolation\u0027 correct?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.isolation \u003d arguments.pop(\u0027isolation\u0027, False)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _isolate_value(self, value):"},{"line_number":64,"context_line":"        if not self.isolation and value is not NO_VALUE:"},{"line_number":65,"context_line":"            value \u003d copy.deepcopy(value)"},{"line_number":66,"context_line":"        return value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99c8%3D","line":64,"in_reply_to":"AAAATn%2F995E%3D","updated":"2013-12-04 00:11:40.000000000","message":"I will invert this since it would be clearer.  But the boolean expression is correct.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9d8513746fe4342161c251d340ee5959953f006a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.isolation \u003d arguments.pop(\u0027isolation\u0027, False)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _isolate_value(self, value):"},{"line_number":64,"context_line":"        if not self.isolation and value is not NO_VALUE:"},{"line_number":65,"context_line":"            value \u003d copy.deepcopy(value)"},{"line_number":66,"context_line":"        return value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99Nk%3D","line":64,"in_reply_to":"AAAATn%2F99c8%3D","updated":"2013-12-04 01:40:13.000000000","message":"Oh wait you are right here.  It _should_ be if self.isolation.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3c1e4bdeacfd3a0d7892448ce5ef295776502fb1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def get(self, key):"},{"line_number":69,"context_line":"        return self._isolate_value(self._db.get(key, NO_VALUE))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_multi(self, keys):"},{"line_number":72,"context_line":"        return [self.get(key) for key in keys]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def set(self, key, value):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9q3k%3D","line":71,"updated":"2013-12-09 00:04:40.000000000","message":"Wouldn\u0027t it make more sense to return a dictionary here? \n\n{ key: self.get(key) }","commit_id":"a0bd171aa204424b821689123d043f10f08b6129"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"358814ea48ceedafbfcb164192c1695791edbf4d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def get(self, key):"},{"line_number":69,"context_line":"        return self._isolate_value(self._db.get(key, NO_VALUE))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_multi(self, keys):"},{"line_number":72,"context_line":"        return [self.get(key) for key in keys]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def set(self, key, value):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9qlg%3D","line":71,"in_reply_to":"AAAATn%2F9q3k%3D","updated":"2013-12-09 03:09:21.000000000","message":"I was following the dogpile expected result:  https://bitbucket.org/zzzeek/dogpile.cache/src/4cc0af95d626fa89bfc903a6a454191ae0b7a104/dogpile/cache/backends/memory.py?at\u003dmaster#cl-60\n\nSince my aim is to support any/all generic dogpile backends (where possible), it makes sense to use the same semantics.","commit_id":"a0bd171aa204424b821689123d043f10f08b6129"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"d75dba784bb34a304660ec8c34b8547d903692ae","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    To disable isolation of the in-memory db it can be passed with the"},{"line_number":47,"context_line":"    ``isolation`` argument as ``False``.  This will cause all get/set"},{"line_number":48,"context_line":"    operations with the backend to not perform a copy.deepcopy on each"},{"line_number":49,"context_line":"    element before saving/retrieving the value to ensure that no changes occur"},{"line_number":50,"context_line":"    in the backing db due to subsequent code changing the returned reference::"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9lpI%3D","line":47,"updated":"2013-12-09 22:26:07.000000000","message":"Its not clear to me when isolation could be set to false. can you explain a little more on when you would choose this option?","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    To disable isolation of the in-memory db it can be passed with the"},{"line_number":47,"context_line":"    ``isolation`` argument as ``False``.  This will cause all get/set"},{"line_number":48,"context_line":"    operations with the backend to not perform a copy.deepcopy on each"},{"line_number":49,"context_line":"    element before saving/retrieving the value to ensure that no changes occur"},{"line_number":50,"context_line":"    in the backing db due to subsequent code changing the returned reference::"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9lWo%3D","line":47,"in_reply_to":"AAAATn%2F9lpI%3D","updated":"2013-12-09 23:35:53.000000000","message":"ayoung asked for this ability.  I honestly don\u0027t know if there is a good use-case besides having the ability to muck with a reference (dict/list) and have the kvs reflect it without a subsequent store.","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            }"},{"line_number":57,"context_line":"        )"},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":"    def __init__(self, arguments):"},{"line_number":60,"context_line":"        self._db \u003d {}"},{"line_number":61,"context_line":"        self.isolation \u003d arguments.pop(\u0027isolation\u0027, True)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aUk%3D","line":59,"updated":"2013-12-11 20:12:53.000000000","message":"arguments as oppose to **kwargs?","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            }"},{"line_number":57,"context_line":"        )"},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":"    def __init__(self, arguments):"},{"line_number":60,"context_line":"        self._db \u003d {}"},{"line_number":61,"context_line":"        self.isolation \u003d arguments.pop(\u0027isolation\u0027, True)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aGw%3D","line":59,"in_reply_to":"AAAATn%2F9aUk%3D","updated":"2013-12-11 20:45:22.000000000","message":"dogpile passes in the arguments as an explcit dict, not as key-word arguments.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _isolate_value(self, value):"},{"line_number":64,"context_line":"        if self.isolation and value is not NO_VALUE:"},{"line_number":65,"context_line":"            value \u003d copy.deepcopy(value)"},{"line_number":66,"context_line":"        return value"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get(self, key):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aTE%3D","line":65,"updated":"2013-12-11 20:12:53.000000000","message":"that right? you are changing value here. Should it be just\n\nreturn copy.deepcopy(value)","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _isolate_value(self, value):"},{"line_number":64,"context_line":"        if self.isolation and value is not NO_VALUE:"},{"line_number":65,"context_line":"            value \u003d copy.deepcopy(value)"},{"line_number":66,"context_line":"        return value"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get(self, key):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aGg%3D","line":65,"in_reply_to":"AAAATn%2F9aTE%3D","updated":"2013-12-11 20:45:22.000000000","message":"both are semantically correct.  I try and develop one exit point from a method where possible (rebind and return at the end).  I\u0027ll replace this with a simple return instead of rebind.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"}],"keystone/common/kvs/backends/memcached.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5b16d0b64d86a516f9db0942a865d864844ef55d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone Memcached dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import random"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKok%3D","line":16,"updated":"2013-11-30 05:35:14.000000000","message":"spacing","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"96a400710d7b093d1c76ec57ce2748360fce9131","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Keystone Memcached dogpile.cache backend implementation."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import random"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BKIc%3D","line":16,"in_reply_to":"AAAATn%2F%2BKok%3D","updated":"2013-11-30 17:29:48.000000000","message":"Done","commit_id":"28ce9e64410c3f67082ba062a5d55200e1593120"},{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"c0cc128f784319370f2660baa641f4f48c362cc0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                sleep_time \u003d (((i + 1) * random.random()) + 2 ** i) / 2.5"},{"line_number":64,"context_line":"                time.sleep(sleep_time)"},{"line_number":65,"context_line":"            if i \u003c 15:"},{"line_number":66,"context_line":"                i +\u003d 1"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def release(self):"},{"line_number":69,"context_line":"        client \u003d self.client_fn()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BE2U%3D","line":66,"updated":"2013-12-02 21:44:23.000000000","message":"This has the potential to be an infinite loop. Is it worth adding a limit to the maximum number of retries and then raise an exception when maximum retries is exceeded (as per the link referenced above)?","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ed1a8a8a2fa89a3e7817e111450f4f0d1faf6b8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                sleep_time \u003d (((i + 1) * random.random()) + 2 ** i) / 2.5"},{"line_number":64,"context_line":"                time.sleep(sleep_time)"},{"line_number":65,"context_line":"            if i \u003c 15:"},{"line_number":66,"context_line":"                i +\u003d 1"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def release(self):"},{"line_number":69,"context_line":"        client \u003d self.client_fn()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BERE%3D","line":66,"in_reply_to":"AAAATn%2F%2BE2U%3D","updated":"2013-12-02 21:47:58.000000000","message":"Sure. Will do in the next patchset.","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"VALID_DOGPILE_BACKENDS \u003d filter("},{"line_number":39,"context_line":"    lambda x: x not in (\u0027GenericMemcachedBackend\u0027, \u0027MemcachedLock\u0027),"},{"line_number":40,"context_line":"    memcached.__all__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9ZA4%3D","line":39,"updated":"2013-12-12 00:29:48.000000000","message":"Should this list be configurable? Otherwise, we\u0027ll need to update this every time a new memcache backend is added.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fa62149e5b195a2df3c97dd8d257d21c302a7c81","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"VALID_DOGPILE_BACKENDS \u003d filter("},{"line_number":39,"context_line":"    lambda x: x not in (\u0027GenericMemcachedBackend\u0027, \u0027MemcachedLock\u0027),"},{"line_number":40,"context_line":"    memcached.__all__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y3Q%3D","line":39,"in_reply_to":"AAAATn%2F9ZA4%3D","updated":"2013-12-12 00:38:30.000000000","message":"This changes in a patchset further down the patch chain.  It represents a known list of \"valid\" memcache drivers in https://review.openstack.org/#/c/60741/11/keystone/common/kvs/backends/memcached.py it would need to be updated each time, but i\u0027m not sure what the right semantic (__subclasses__()?) would be to programmatically make it happen.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def get_mutex(self, key):"},{"line_number":124,"context_line":"        return MemcachedLock(lambda: self.driver.client, key,"},{"line_number":125,"context_line":"                             self.lock_timeout)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9ZAk%3D","line":125,"updated":"2013-12-12 00:29:48.000000000","message":"max_lock_attempts is required for MemcachedLock()\n\nTesting the locking mechanism may be a bit challenging though.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"}],"keystone/common/kvs/core.py":[{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"c0cc128f784319370f2660baa641f4f48c362cc0","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        \"\"\"Set multiple key/value pairs in the KVS backend at once."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        Like delete_multi, this call does not serialize through the"},{"line_number":345,"context_line":"        KeyValueStoreLock mechanism."},{"line_number":346,"context_line":"        \"\"\""},{"line_number":347,"context_line":"        # NOTE(morganfainberg): Due to serialization needs, it is"},{"line_number":348,"context_line":"        # easier to prevent duplicated code here by calling the"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BEkI%3D","line":345,"updated":"2013-12-02 21:44:23.000000000","message":"Could you please add a line or two explanation for why we don\u0027t serialize? Also for delete_multi(). Thanks!","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ed1a8a8a2fa89a3e7817e111450f4f0d1faf6b8","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        \"\"\"Set multiple key/value pairs in the KVS backend at once."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        Like delete_multi, this call does not serialize through the"},{"line_number":345,"context_line":"        KeyValueStoreLock mechanism."},{"line_number":346,"context_line":"        \"\"\""},{"line_number":347,"context_line":"        # NOTE(morganfainberg): Due to serialization needs, it is"},{"line_number":348,"context_line":"        # easier to prevent duplicated code here by calling the"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BEQ8%3D","line":345,"in_reply_to":"AAAATn%2F%2BEkI%3D","updated":"2013-12-02 21:47:58.000000000","message":"Done","commit_id":"9bea2c38c1e797b4fdba59e190e6252cad1ced5c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                   backend for configuration"},{"line_number":107,"context_line":"        :return:"},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        if \u0027backend\u0027 in self._region.__dict__:"},{"line_number":110,"context_line":"            # NOTE(morganfainberg): It is a bad idea to reconfigure a backend,"},{"line_number":111,"context_line":"            # there are a lot of pitfalls and potential memory leaks that could"},{"line_number":112,"context_line":"            # occur.  By far the best approach is to re-create the KVS object"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99zc%3D","line":109,"updated":"2013-12-03 23:25:00.000000000","message":"Since reconfiguring the backend is potentially dangerous is there any reason why this isn\u0027t in the __init__?  It is possible to create an instance of KeyValueStore and use it without calling configure?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                   backend for configuration"},{"line_number":107,"context_line":"        :return:"},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        if \u0027backend\u0027 in self._region.__dict__:"},{"line_number":110,"context_line":"            # NOTE(morganfainberg): It is a bad idea to reconfigure a backend,"},{"line_number":111,"context_line":"            # there are a lot of pitfalls and potential memory leaks that could"},{"line_number":112,"context_line":"            # occur.  By far the best approach is to re-create the KVS object"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99hA%3D","line":109,"in_reply_to":"AAAATn%2F99zc%3D","updated":"2013-12-04 00:11:40.000000000","message":"The idea is configuration happens independantly of creating an instance.  This was specifically asked for by adam young (and I agree with him) that the object instantiation should happen independently of configuration since the configuration is ostensibly quite complex and fairly orthogonal to the object.  This is similar to how dogpile works.  It allows for configuration to happen after other work has been done, but not have it strongly tied to the instantiation.\n\nThis does bring up another issue, making sure it is configured before use.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self._apply_region_proxy(proxy_list)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _apply_region_proxy(self, proxy_list):"},{"line_number":132,"context_line":"        if getattr(proxy_list, \u0027__iter__\u0027, False):"},{"line_number":133,"context_line":"            proxies \u003d []"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            for item in proxy_list:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99zA%3D","line":132,"updated":"2013-12-03 23:25:00.000000000","message":"Is this just making sure that the value isn\u0027t None?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self._apply_region_proxy(proxy_list)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _apply_region_proxy(self, proxy_list):"},{"line_number":132,"context_line":"        if getattr(proxy_list, \u0027__iter__\u0027, False):"},{"line_number":133,"context_line":"            proxies \u003d []"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            for item in proxy_list:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99hY%3D","line":132,"in_reply_to":"AAAATn%2F99zA%3D","updated":"2013-12-04 00:11:40.000000000","message":"This is ensuring any iterable is uses.  eg. tuple, etc.  There are I guess i could specifically do isinstance, but I didn\u0027t want to limit the options to list only.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            for item in proxy_list:"},{"line_number":136,"context_line":"                if isinstance(item, str):"},{"line_number":137,"context_line":"                    LOG.debug(_(\u0027Importing class %s as KVS proxy.\u0027) % item)"},{"line_number":138,"context_line":"                    pxy \u003d importutils.import_class(item)"},{"line_number":139,"context_line":"                else:"},{"line_number":140,"context_line":"                    pxy \u003d item"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99y0%3D","line":137,"updated":"2013-12-03 23:25:00.000000000","message":"Replace \u0027 %\u0027 with \u0027,\u0027","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            for item in proxy_list:"},{"line_number":136,"context_line":"                if isinstance(item, str):"},{"line_number":137,"context_line":"                    LOG.debug(_(\u0027Importing class %s as KVS proxy.\u0027) % item)"},{"line_number":138,"context_line":"                    pxy \u003d importutils.import_class(item)"},{"line_number":139,"context_line":"                else:"},{"line_number":140,"context_line":"                    pxy \u003d item"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99g4%3D","line":137,"in_reply_to":"AAAATn%2F99y0%3D","updated":"2013-12-04 00:11:40.000000000","message":"Good catch! Done.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        # configured here.  The key_mangler function is called prior to storing"},{"line_number":165,"context_line":"        # the value(s) in the backend.  This is to help prevent collisions and"},{"line_number":166,"context_line":"        # limit issues such as memcache\u0027s limited cache_key size."},{"line_number":167,"context_line":"        key_mangler \u003d key_mangler"},{"line_number":168,"context_line":"        use_backend_key_mangler \u003d getattr(self._region.backend,"},{"line_number":169,"context_line":"                                          \u0027use_backend_key_mangler\u0027, False)"},{"line_number":170,"context_line":"        if ((key_mangler is None or use_backend_key_mangler) and"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99yk%3D","line":167,"updated":"2013-12-03 23:25:00.000000000","message":"What\u0027s this for?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        # configured here.  The key_mangler function is called prior to storing"},{"line_number":165,"context_line":"        # the value(s) in the backend.  This is to help prevent collisions and"},{"line_number":166,"context_line":"        # limit issues such as memcache\u0027s limited cache_key size."},{"line_number":167,"context_line":"        key_mangler \u003d key_mangler"},{"line_number":168,"context_line":"        use_backend_key_mangler \u003d getattr(self._region.backend,"},{"line_number":169,"context_line":"                                          \u0027use_backend_key_mangler\u0027, False)"},{"line_number":170,"context_line":"        if ((key_mangler is None or use_backend_key_mangler) and"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99gw%3D","line":167,"in_reply_to":"AAAATn%2F99yk%3D","updated":"2013-12-04 00:11:40.000000000","message":"Good catch.  Removing it.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                   \u0027name\u0027: self._region.name})"},{"line_number":192,"context_line":"                elif isinstance(key_mangler, str):"},{"line_number":193,"context_line":"                    module_str, func_str \u003d key_mangler.rsplit(\u0027.\u0027, 1)"},{"line_number":194,"context_line":"                    module \u003d importutils.import_module(module_str)"},{"line_number":195,"context_line":"                    func \u003d getattr(module, func_str, None)"},{"line_number":196,"context_line":"                    if callable(func):"},{"line_number":197,"context_line":"                        self._region.key_mangler \u003d func"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99xk%3D","line":194,"updated":"2013-12-03 23:25:00.000000000","message":"Any reason not to use importutils.import_class?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                   \u0027name\u0027: self._region.name})"},{"line_number":192,"context_line":"                elif isinstance(key_mangler, str):"},{"line_number":193,"context_line":"                    module_str, func_str \u003d key_mangler.rsplit(\u0027.\u0027, 1)"},{"line_number":194,"context_line":"                    module \u003d importutils.import_module(module_str)"},{"line_number":195,"context_line":"                    func \u003d getattr(module, func_str, None)"},{"line_number":196,"context_line":"                    if callable(func):"},{"line_number":197,"context_line":"                        self._region.key_mangler \u003d func"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99gk%3D","line":194,"in_reply_to":"AAAATn%2F99xk%3D","updated":"2013-12-04 00:11:40.000000000","message":"Does import class function with functions?  my thought was key_mangler would either be a path to a function or a function ref.  I\u0027m actually content to make it be a required function ref instead.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def get_multi(self, keys):"},{"line_number":315,"context_line":"        \"\"\"Get multiple values in a single call from the KVS backend.\"\"\""},{"line_number":316,"context_line":"        if self._security_strategy is None:"},{"line_number":317,"context_line":"            values \u003d self._region.get_multi(keys)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            # NOTE(morganfainberg): Since we have a security strategy, we will"},{"line_number":320,"context_line":"            # use the KeyValueStore mechanism to unprotect the data.  This is"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99vM%3D","line":317,"updated":"2013-12-03 23:25:00.000000000","message":"In the case of memcached won\u0027t this return a dictionary?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2c143673b0b6ab56756a7f8e8c67daf770be2287","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def get_multi(self, keys):"},{"line_number":315,"context_line":"        \"\"\"Get multiple values in a single call from the KVS backend.\"\"\""},{"line_number":316,"context_line":"        if self._security_strategy is None:"},{"line_number":317,"context_line":"            values \u003d self._region.get_multi(keys)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            # NOTE(morganfainberg): Since we have a security strategy, we will"},{"line_number":320,"context_line":"            # use the KeyValueStore mechanism to unprotect the data.  This is"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99MU%3D","line":317,"in_reply_to":"AAAATn%2F99ek%3D","updated":"2013-12-04 01:52:27.000000000","message":"The way dogpile implements this ensures only a list will be returned, and the list is a list of values.  I guess the lesson here is make sure to send through a deterministic iterable (list, tuple) instead of something like a set.\n\n    def get_multi(self, keys):\n        values \u003d self.client.get_multi(keys)\n        return [\n            NO_VALUE if key not in values\n            else values[key] for key in keys\n        ]","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def get_multi(self, keys):"},{"line_number":315,"context_line":"        \"\"\"Get multiple values in a single call from the KVS backend.\"\"\""},{"line_number":316,"context_line":"        if self._security_strategy is None:"},{"line_number":317,"context_line":"            values \u003d self._region.get_multi(keys)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            # NOTE(morganfainberg): Since we have a security strategy, we will"},{"line_number":320,"context_line":"            # use the KeyValueStore mechanism to unprotect the data.  This is"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99ek%3D","line":317,"in_reply_to":"AAAATn%2F99vM%3D","updated":"2013-12-04 00:11:40.000000000","message":"I\u0027ll 2x check.  I... honestly don\u0027t know off the top of my head, but I thought it was a list that is returned.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                not_found.append(key)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if not_found:"},{"line_number":332,"context_line":"            raise exception.NotFound(target\u003dnot_found)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        return values"},{"line_number":335,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99vw%3D","line":332,"updated":"2013-12-03 23:25:00.000000000","message":"Is there any reason you are forcing an exception here?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                not_found.append(key)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if not_found:"},{"line_number":332,"context_line":"            raise exception.NotFound(target\u003dnot_found)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        return values"},{"line_number":335,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99gI%3D","line":332,"in_reply_to":"AAAATn%2F99vw%3D","updated":"2013-12-04 00:11:40.000000000","message":"This mirrors current .get functionality in KVS.  It was added to parrot that but with get_multi, it can be allowed.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    def set(self, key, value, lock\u003dNone):"},{"line_number":337,"context_line":"        \"\"\"Set a single value in the KVS backend.\"\"\""},{"line_number":338,"context_line":"        with self._action_with_lock(key, lock):"},{"line_number":339,"context_line":"            self._set(key, value)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def set_multi(self, mapping):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99u0%3D","line":338,"updated":"2013-12-03 23:25:00.000000000","message":"Why do you need to lock here? I would expect the backend to serialize access to a key already. Does that not happen for one of the backends?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    def set(self, key, value, lock\u003dNone):"},{"line_number":337,"context_line":"        \"\"\"Set a single value in the KVS backend.\"\"\""},{"line_number":338,"context_line":"        with self._action_with_lock(key, lock):"},{"line_number":339,"context_line":"            self._set(key, value)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def set_multi(self, mapping):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99fE%3D","line":338,"in_reply_to":"AAAATn%2F99u0%3D","updated":"2013-12-04 00:11:40.000000000","message":"The mutex for locking is handled at this layer, you can\u0027t lock in the backend, and this is designed to ensure we can perform a nearly-transactional update for a case of updating a user_token_list (or similar) that previously was relying on the CAS (memcache compare and set) mechanism.  Instead of trying to set and failing because the CAS_ID changed, we wrap in a lock and perform the get, update, set in a single locked context.\n\nThis could probably go away if we never want to lock sets (let races happen unless you wrap the set in a lock context).  Input on the approach is welcome.  But if we remove this very active systems might have a delete go through after a set occurs.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bbc30e564ec34cbf186af222d6e4cd7afdf5734d","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            c_keys, delete_key \u003d self._build_crypto_info_from_key(key)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        with self._action_with_lock(delete_key, lock):"},{"line_number":370,"context_line":"            # NOTE(morganfainberg): Always perform a \"get\" to make sure"},{"line_number":371,"context_line":"            # the value(s) exist before deletion.  This needs to be done"},{"line_number":372,"context_line":"            # in the context of a KeyValueStoreLock to limit races. This"},{"line_number":373,"context_line":"            # context manager may not be strictly required."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99uc%3D","line":370,"updated":"2013-12-03 23:25:00.000000000","message":"What\u0027s the race condition here?","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"865d028acfd52ec51d5e6e17119ecb3e3bf0a0d9","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            c_keys, delete_key \u003d self._build_crypto_info_from_key(key)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        with self._action_with_lock(delete_key, lock):"},{"line_number":370,"context_line":"            # NOTE(morganfainberg): Always perform a \"get\" to make sure"},{"line_number":371,"context_line":"            # the value(s) exist before deletion.  This needs to be done"},{"line_number":372,"context_line":"            # in the context of a KeyValueStoreLock to limit races. This"},{"line_number":373,"context_line":"            # context manager may not be strictly required."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F99dE%3D","line":370,"in_reply_to":"AAAATn%2F99uc%3D","updated":"2013-12-04 00:11:40.000000000","message":"This is more of a mirror of previous \"workings\" where an attempted delete would raise an exception.  In the case of the new delete, we want to ensure that functionality is still met, so we lock and get (raises not found if it doesn\u0027t exist) and then performs the delete.  It\u0027s about communicating back to the rest of the system that the item doesn\u0027t exist rather than silently failing or attempting to perform a delete on a non-existant value that gets set elsewhere.\n\nMost uses of the context here are edge-cases on very busy systems.","commit_id":"4b91f56fafce50619cdf26370cb851b40838587e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"NO_VALUE \u003d api.NO_VALUE"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _register_backends():"},{"line_number":47,"context_line":"    # NOTE(morganfainberg): This function exists to ensure we do not try and"},{"line_number":48,"context_line":"    # register the backends prior to the configuration object being fully"},{"line_number":49,"context_line":"    # available.  We also need to ensure we do not register a given backend"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aRA%3D","line":46,"updated":"2013-12-11 20:12:53.000000000","message":"k, why are do doing register_backend in common/kvs/__init__.py? Are those different backends?","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":43,"context_line":"NO_VALUE \u003d api.NO_VALUE"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _register_backends():"},{"line_number":47,"context_line":"    # NOTE(morganfainberg): This function exists to ensure we do not try and"},{"line_number":48,"context_line":"    # register the backends prior to the configuration object being fully"},{"line_number":49,"context_line":"    # available.  We also need to ensure we do not register a given backend"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aGU%3D","line":46,"in_reply_to":"AAAATn%2F9aRA%3D","updated":"2013-12-11 20:45:22.000000000","message":"Those are \"provided\" backends, the idea is that those should _always_ be registered.  This is designed to allow the registration of any out-of-tree backends easily via the configuration option.  I\u0027ll add a comment in the __init__.py to clarify that and make this comment reflect similar information.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d259f53e9697f0c08d03497fe38add4b8446bd0d","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    \"\"\""},{"line_number":380,"context_line":"    global KEY_VALUE_STORE_REGISTRY"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    _register_backends()"},{"line_number":383,"context_line":"    key_value_store \u003d KEY_VALUE_STORE_REGISTRY.get(name)"},{"line_number":384,"context_line":"    if key_value_store is None:"},{"line_number":385,"context_line":"        if kvs_region is None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aQI%3D","line":382,"updated":"2013-12-11 20:12:53.000000000","message":"seem redundant that we need to call _register_backends() everytime as they are statically configured in keystone.conf. May want to think about doing this just once.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0e8ef30d2e8f2cd22366d2357287fb7ec67f58a6","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    \"\"\""},{"line_number":380,"context_line":"    global KEY_VALUE_STORE_REGISTRY"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    _register_backends()"},{"line_number":383,"context_line":"    key_value_store \u003d KEY_VALUE_STORE_REGISTRY.get(name)"},{"line_number":384,"context_line":"    if key_value_store is None:"},{"line_number":385,"context_line":"        if kvs_region is None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F9aF8%3D","line":382,"in_reply_to":"AAAATn%2F9aQI%3D","updated":"2013-12-11 20:45:22.000000000","message":"_register_backends has the logic to skip if BACKENDS_REGISTERED is true.  I have no problem moving that logic here instead if that is a better design.","commit_id":"7b40e23ca8ad5a00d81b697114f9a325913f95f5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            backend_name \u003d prefix % cls"},{"line_number":61,"context_line":"            LOG.debug(_(\u0027Registering Dogpile Backend %(backend_path)s as \u0027"},{"line_number":62,"context_line":"                        \u0027%(backend_name)s\u0027),"},{"line_number":63,"context_line":"                      dict(backend_path\u003dbackend, backend_name\u003dbackend_name))"},{"line_number":64,"context_line":"            region.register_backend(backend_name, module, cls)"},{"line_number":65,"context_line":"        BACKENDS_REGISTERED \u003d True"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y%2FA%3D","line":63,"updated":"2013-12-12 00:29:48.000000000","message":"{} instead of dict()? for amusement purposes. :)\n\nhttp://doughellmann.com/2012/11/the-performance-impact-of-using-dict-instead-of-in-cpython-2-7-2.html","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                              name\u003dself._region.name))"},{"line_number":132,"context_line":"                self._region.wrap(proxy_cls)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _is_configured(self):"},{"line_number":135,"context_line":"        if\u0027backend\u0027 not in self._region.__dict__:"},{"line_number":136,"context_line":"            raise exception.UnexpectedError(_(\u0027Key Value Store not \u0027"},{"line_number":137,"context_line":"                                              \u0027configured: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y7o%3D","line":134,"updated":"2013-12-12 00:29:48.000000000","message":"_assert_configured() is probably more intuitive","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fa62149e5b195a2df3c97dd8d257d21c302a7c81","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                              name\u003dself._region.name))"},{"line_number":132,"context_line":"                self._region.wrap(proxy_cls)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _is_configured(self):"},{"line_number":135,"context_line":"        if\u0027backend\u0027 not in self._region.__dict__:"},{"line_number":136,"context_line":"            raise exception.UnexpectedError(_(\u0027Key Value Store not \u0027"},{"line_number":137,"context_line":"                                              \u0027configured: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y3I%3D","line":134,"in_reply_to":"AAAATn%2F9Y7o%3D","updated":"2013-12-12 00:38:30.000000000","message":"will change this.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        \"\"\"weakref-capable threading.Lock wrapper.\"\"\""},{"line_number":225,"context_line":"        def __init__(self):"},{"line_number":226,"context_line":"            self.lock \u003d threading.Lock()"},{"line_number":227,"context_line":"            self.lock_timeout \u003d CONF.kvs.default_lock_timeout - 1"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        def acquire(self, wait\u003dTrue):"},{"line_number":230,"context_line":"            return self.lock.acquire(wait)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y78%3D","line":227,"updated":"2013-12-12 00:29:48.000000000","message":"why -1?","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fa62149e5b195a2df3c97dd8d257d21c302a7c81","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        \"\"\"weakref-capable threading.Lock wrapper.\"\"\""},{"line_number":225,"context_line":"        def __init__(self):"},{"line_number":226,"context_line":"            self.lock \u003d threading.Lock()"},{"line_number":227,"context_line":"            self.lock_timeout \u003d CONF.kvs.default_lock_timeout - 1"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        def acquire(self, wait\u003dTrue):"},{"line_number":230,"context_line":"            return self.lock.acquire(wait)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y28%3D","line":227,"in_reply_to":"AAAATn%2F9Y78%3D","updated":"2013-12-12 00:38:30.000000000","message":"This is meant to have a comment, i\u0027ll add it here as well.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def set(self, key, value, lock\u003dNone):"},{"line_number":260,"context_line":"        \"\"\"Set a single value in the KVS backend.\"\"\""},{"line_number":261,"context_line":"        self._is_configured()"},{"line_number":262,"context_line":"        with self._action_with_lock(key, lock):"},{"line_number":263,"context_line":"            self._region.set(key, value)"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y7I%3D","line":261,"updated":"2013-12-12 00:29:48.000000000","message":"looks like _is_configured() is called in multiple places. I am seeing a decorator pattern here.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"}],"keystone/tests/core.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"d75dba784bb34a304660ec8c34b8547d903692ae","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        # only call load_backends once."},{"line_number":305,"context_line":"        dependency.reset()"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        # TODO(morganfainberg): Shouldn\u0027t need to clear the registry here, but"},{"line_number":308,"context_line":"        # some tests call load_backends multiple times.  Since it is not"},{"line_number":309,"context_line":"        # possible to re-configure a backend, we need to clear the list.  This"},{"line_number":310,"context_line":"        # should eventually be removed once testing has been cleaned up."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9lqA%3D","line":307,"updated":"2013-12-09 22:26:07.000000000","message":"Great comment!","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"}],"keystone/tests/test_kvs.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5ea2317abb41b14ba92830f7358070d06e6934da","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class TestRegionProxy(proxy.ProxyBackend):"},{"line_number":79,"context_line":"    \"\"\"A test dogpile.cache proxy that does nothing.\"\"\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"class TestRegionProxy2(proxy.ProxyBackend):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y44%3D","line":79,"updated":"2013-12-12 00:29:48.000000000","message":"so no proxy tests then?","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fa62149e5b195a2df3c97dd8d257d21c302a7c81","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class TestRegionProxy(proxy.ProxyBackend):"},{"line_number":79,"context_line":"    \"\"\"A test dogpile.cache proxy that does nothing.\"\"\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"class TestRegionProxy2(proxy.ProxyBackend):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Y2g%3D","line":79,"in_reply_to":"AAAATn%2F9Y44%3D","updated":"2013-12-12 00:38:30.000000000","message":"I\u0027ll rename these to be the _stub_ proxies.  There isn\u0027t a need to test dogpile\u0027s proxy code in this case, just that we are getting the right order of proxies.  The rename should make it more intuitive that these are fixtures (effectively) rather than a repository of tests.","commit_id":"992076580d2bf2135df21b4a253d79e2169abc53"}],"keystone/token/backends/memcache.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"d75dba784bb34a304660ec8c34b8547d903692ae","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return self._memcache_client or self._get_memcache_client()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_memcache_client(self):"},{"line_number":47,"context_line":"        memcache_servers \u003d CONF.memcache.servers"},{"line_number":48,"context_line":"        # NOTE(morganfainberg): The memcache client library for python is NOT"},{"line_number":49,"context_line":"        # thread safe and should not be passed between threads. This is highly"},{"line_number":50,"context_line":"        # specific to the cas() (compare and set) methods and the caching of"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9lqY%3D","line":47,"updated":"2013-12-09 22:26:07.000000000","message":"Why did you remove the split?   Can there only be one?  (yes, a shout out to the highlander movie :-) )","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"743cb06e547f74faaa4f68be2a016a950126cd8e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return self._memcache_client or self._get_memcache_client()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_memcache_client(self):"},{"line_number":47,"context_line":"        memcache_servers \u003d CONF.memcache.servers"},{"line_number":48,"context_line":"        # NOTE(morganfainberg): The memcache client library for python is NOT"},{"line_number":49,"context_line":"        # thread safe and should not be passed between threads. This is highly"},{"line_number":50,"context_line":"        # specific to the cas() (compare and set) methods and the caching of"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9lXk%3D","line":47,"in_reply_to":"AAAATn%2F9lqY%3D","updated":"2013-12-09 23:35:53.000000000","message":"Split was removed because we moved to a ListOpt https://review.openstack.org/#/c/59126/10/keystone/common/config.py\n\nListOpt \u003e StrOpt and the need to perform a split when we use it.  Since I am leveraging the same option, and it doesn\u0027t affect the configuration itself, moving to a ListOpt made my new code easier to work with (no need to split after the fact).","commit_id":"709dd23d1657398162ae86aaff3fe40b757a0a0b"}]}
