)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alistair Coles \u003calistair.coles@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-24 11:50:50 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable middleware to set metadata on object POST"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Sysmeta cannot be updated by an object POST because"},{"line_number":10,"context_line":"that would cause all existing sysmeta to be deleted."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3aaa91ec_a4148be8","line":7,"range":{"start_line":7,"start_character":25,"end_line":7,"end_character":33},"updated":"2016-06-27 08:33:54.000000000","message":"nits) sys-meta? correctly.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alistair Coles \u003calistair.coles@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-24 11:50:50 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable middleware to set metadata on object POST"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Sysmeta cannot be updated by an object POST because"},{"line_number":10,"context_line":"that would cause all existing sysmeta to be deleted."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3aaa91ec_acf1f86c","line":7,"range":{"start_line":7,"start_character":25,"end_line":7,"end_character":33},"in_reply_to":"3aaa91ec_a4148be8","updated":"2016-06-27 14:50:22.000000000","message":"hmmm, not sure about changing - its neither user metadata for sysmeta, it\u0027s a new form of metadata. To clarify will make the commit subject line too long.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":19,"context_line":"without polluting the x-object-meta-* namespace."},{"line_number":20,"context_line":"All headers in this namespace will be filtered"},{"line_number":21,"context_line":"inbound and outbound by the gatekeeper, so cannot"},{"line_number":22,"context_line":"be set or read by clients."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":25,"context_line":"Co-Authored-By: Janie Richling \u003cjrichli@us.ibm.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3aaa91ec_24dffb3a","line":22,"updated":"2016-06-27 08:33:54.000000000","message":"Ok, this patch doesn\u0027t resolve anything with transient-sysmeta and normal sysmeta. Just allowing to make a new namespace for internal usage.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"without polluting the x-object-meta-* namespace."},{"line_number":20,"context_line":"All headers in this namespace will be filtered"},{"line_number":21,"context_line":"inbound and outbound by the gatekeeper, so cannot"},{"line_number":22,"context_line":"be set or read by clients."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":25,"context_line":"Co-Authored-By: Janie Richling \u003cjrichli@us.ibm.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3aaa91ec_53e63317","line":22,"in_reply_to":"3aaa91ec_24dffb3a","updated":"2016-06-27 14:50:22.000000000","message":"correct","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"}],"doc/source/development_middleware.rst":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ef345e0d962b2455040386e58668cfda88552f62","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"},{"line_number":301,"context_line":"by a middleware is therefore prone to deletion by a subsequent client-generated"},{"line_number":302,"context_line":"POST request unless the middleware is careful to include its transient-sysmeta"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3aaa91ec_e0b88377","line":299,"range":{"start_line":299,"start_character":40,"end_line":299,"end_character":48},"updated":"2016-06-24 08:20:37.000000000","message":"nit: en-masse is quoted here but bare in the section above. We should probably pick one or the other.","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dabaf72ca3eb89201aac2b950be5ab8adb362ab2","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"},{"line_number":301,"context_line":"by a middleware is therefore prone to deletion by a subsequent client-generated"},{"line_number":302,"context_line":"POST request unless the middleware is careful to include its transient-sysmeta"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3aaa91ec_32d5ba1b","line":299,"range":{"start_line":299,"start_character":40,"end_line":299,"end_character":48},"in_reply_to":"3aaa91ec_e0b88377","updated":"2016-06-24 10:50:23.000000000","message":"Done","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":274,"context_line":"System metadata may be set on objects using only PUT requests. All items of"},{"line_number":275,"context_line":"existing system metadata will be deleted and replaced en-masse by any system"},{"line_number":276,"context_line":"metadata headers included with the PUT request. System metadata is neither"},{"line_number":277,"context_line":"updated nor deleted by a POST request: updating individual items of system"},{"line_number":278,"context_line":"metadata with a POST request is not yet supported in the same way that updating"},{"line_number":279,"context_line":"individual items of user metadata is not supported. In cases where middleware"},{"line_number":280,"context_line":"needs to store its own metadata with a POST request, it may use Object Transient"},{"line_number":281,"context_line":"Sysmeta."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":284,"context_line":"Object Transient-Sysmeta"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_69755ec9","line":281,"range":{"start_line":277,"start_character":39,"end_line":281,"end_character":8},"updated":"2016-06-27 08:33:54.000000000","message":"That\u0027s why swift3 middleware uses COPY instead of POST[1] to update object-sysmeta. Perhaps, this work saves our swift3 from odd handling.\n1: https://github.com/openstack/swift3/blob/master/swift3/controllers/s3_acl.py#L58-L60","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":274,"context_line":"System metadata may be set on objects using only PUT requests. All items of"},{"line_number":275,"context_line":"existing system metadata will be deleted and replaced en-masse by any system"},{"line_number":276,"context_line":"metadata headers included with the PUT request. System metadata is neither"},{"line_number":277,"context_line":"updated nor deleted by a POST request: updating individual items of system"},{"line_number":278,"context_line":"metadata with a POST request is not yet supported in the same way that updating"},{"line_number":279,"context_line":"individual items of user metadata is not supported. In cases where middleware"},{"line_number":280,"context_line":"needs to store its own metadata with a POST request, it may use Object Transient"},{"line_number":281,"context_line":"Sysmeta."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":284,"context_line":"Object Transient-Sysmeta"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_b3e037ce","line":281,"range":{"start_line":277,"start_character":39,"end_line":281,"end_character":8},"in_reply_to":"3aaa91ec_69755ec9","updated":"2016-06-27 14:50:22.000000000","message":"Updating *individual* items of object metadata during a POST is a hard problem :/ We are not trying to do that here.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3af4e90650b958954d61900f4142097e5cba277c","unresolved":false,"context_lines":[{"line_number":274,"context_line":"System metadata may be set on objects using only PUT requests. All items of"},{"line_number":275,"context_line":"existing system metadata will be deleted and replaced en-masse by any system"},{"line_number":276,"context_line":"metadata headers included with the PUT request. System metadata is neither"},{"line_number":277,"context_line":"updated nor deleted by a POST request: updating individual items of system"},{"line_number":278,"context_line":"metadata with a POST request is not yet supported in the same way that updating"},{"line_number":279,"context_line":"individual items of user metadata is not supported. In cases where middleware"},{"line_number":280,"context_line":"needs to store its own metadata with a POST request, it may use Object Transient"},{"line_number":281,"context_line":"Sysmeta."},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":284,"context_line":"Object Transient-Sysmeta"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_daf8564c","line":281,"range":{"start_line":277,"start_character":39,"end_line":281,"end_character":8},"in_reply_to":"3aaa91ec_b3e037ce","updated":"2016-06-28 02:19:26.000000000","message":"Right, that\u0027s what I noticed below :/","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_041bdf81","line":297,"updated":"2016-06-27 08:33:54.000000000","message":"Oh, the transient meta have the semantic as same as *x-object-user-meta-*, hmm...that seems helpful for encyrpiton to save such transient (encrypted) headers but it doesn\u0027t seem to fit my use case with swift3 but it\u0027s ok right now with this.\n\nnits) Though the section title is \"Object Transient-Sysmeta\", it would be better to say \"same smatic as object user meta\" explicitly. Because :ref:`usermeta` is pointing to general conversation for usermetadata (includes account/container semantics) and there is a couple of semantics for each resource (account/container vs object).","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_56258108","line":297,"in_reply_to":"3aaa91ec_041bdf81","updated":"2016-06-27 14:50:22.000000000","message":"Done","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e568bb7905f0fc76f2d24cd5a8746512c180d47a","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"},{"line_number":301,"context_line":"by a middleware is therefore prone to deletion by a subsequent client-generated"},{"line_number":302,"context_line":"POST request unless the middleware is careful to include its transient-sysmeta"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_6c5aa9f3","line":299,"range":{"start_line":299,"start_character":40,"end_line":299,"end_character":48},"updated":"2016-06-24 22:08:55.000000000","message":"Looks like we previously had *two* instances of \"en-masse\" and just one of en-masse, and now we\u0027ve still got one \"en-masse\" left.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates have the same semantic as :ref:`usermeta` updates on an"},{"line_number":298,"context_line":"object i.e. whenever any PUT or POST request is made to an object, all existing"},{"line_number":299,"context_line":"items of transient-sysmeta are deleted \"en-masse\" and replaced with any"},{"line_number":300,"context_line":"transient-sysmeta included with the PUT or POST request. Transient-sysmeta set"},{"line_number":301,"context_line":"by a middleware is therefore prone to deletion by a subsequent client-generated"},{"line_number":302,"context_line":"POST request unless the middleware is careful to include its transient-sysmeta"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3aaa91ec_f39c7f5f","line":299,"range":{"start_line":299,"start_character":40,"end_line":299,"end_character":48},"in_reply_to":"3aaa91ec_6c5aa9f3","updated":"2016-06-27 14:50:22.000000000","message":"Ugh, I took the last comment too literally :/","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"User metadata takes the form of ``X-\u003ctype\u003e-Meta-\u003ckey\u003e: \u003cvalue\u003e``, where"},{"line_number":210,"context_line":"``\u003ctype\u003e`` depends on the resources type (i.e. Account, Container, Object)"},{"line_number":211,"context_line":"and ``\u003ckey\u003e`` and ``\u003cvalue\u003e`` are set by the client."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"User metadata should generally be reserved for use by the client or"},{"line_number":214,"context_line":"client applications.  A perfect example use-case for user metadata is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_30e1c4d1","line":211,"updated":"2016-06-27 21:56:32.000000000","message":"For completeness, should this also mention standard (but configurable) HTTP headers like Content-Disposition and Content-Encoding?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"User metadata takes the form of ``X-\u003ctype\u003e-Meta-\u003ckey\u003e: \u003cvalue\u003e``, where"},{"line_number":210,"context_line":"``\u003ctype\u003e`` depends on the resources type (i.e. Account, Container, Object)"},{"line_number":211,"context_line":"and ``\u003ckey\u003e`` and ``\u003cvalue\u003e`` are set by the client."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"User metadata should generally be reserved for use by the client or"},{"line_number":214,"context_line":"client applications.  A perfect example use-case for user metadata is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_dc8167fd","line":211,"in_reply_to":"3aaa91ec_30e1c4d1","updated":"2016-06-28 10:01:13.000000000","message":"Beyond the scope of this patch, but IMO no, this is defining User Metadata for the pruposes of this discussion ot be x-*-meta- headers. In other places the term \"custom metadata\" is used, maybe that\u0027s a better term, but again, not something I intend to change in this patch.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":229,"context_line":"resource persists until it is explicitly removed by a subsequent PUT or POST"},{"line_number":230,"context_line":"request that includes a header ``X-\u003ctype\u003e-Meta-\u003ckey\u003e`` with no value or a"},{"line_number":231,"context_line":"header ``X-Remove-\u003ctype\u003e-Meta-\u003ckey\u003e: \u003cignored-value\u003e``. In the latter case the"},{"line_number":232,"context_line":"``\u003cignored-value\u003e`` is not stored."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"User metadata that is stored with an object resource has a different semantic;"},{"line_number":235,"context_line":"object user metadata persists until any subsequent PUT or POST request is made"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_59fda26d","line":232,"updated":"2016-06-27 21:56:32.000000000","message":"Alternatively, *all* user metadata may be removed by emptying the container, deleting it, then re-creating it, right?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":229,"context_line":"resource persists until it is explicitly removed by a subsequent PUT or POST"},{"line_number":230,"context_line":"request that includes a header ``X-\u003ctype\u003e-Meta-\u003ckey\u003e`` with no value or a"},{"line_number":231,"context_line":"header ``X-Remove-\u003ctype\u003e-Meta-\u003ckey\u003e: \u003cignored-value\u003e``. In the latter case the"},{"line_number":232,"context_line":"``\u003cignored-value\u003e`` is not stored."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"User metadata that is stored with an object resource has a different semantic;"},{"line_number":235,"context_line":"object user metadata persists until any subsequent PUT or POST request is made"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_5c4e17c2","line":232,"in_reply_to":"3aaa91ec_59fda26d","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":232,"context_line":"``\u003cignored-value\u003e`` is not stored."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"User metadata that is stored with an object resource has a different semantic;"},{"line_number":235,"context_line":"object user metadata persists until any subsequent PUT or POST request is made"},{"line_number":236,"context_line":"to the same object, at which point all user metadata stored with that object is"},{"line_number":237,"context_line":"deleted en-masse and replaced with any user metadata included with the PUT or"},{"line_number":238,"context_line":"POST request. As a result, it is not possible to update a subset of the user"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_f9b9eecc","line":235,"range":{"start_line":235,"start_character":0,"end_line":235,"end_character":20},"updated":"2016-06-27 21:56:32.000000000","message":"nit: Three nouns in a row like that triggered a re-parse in my brain. Maybe worth changing to \"such user metadata\"?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":232,"context_line":"``\u003cignored-value\u003e`` is not stored."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"User metadata that is stored with an object resource has a different semantic;"},{"line_number":235,"context_line":"object user metadata persists until any subsequent PUT or POST request is made"},{"line_number":236,"context_line":"to the same object, at which point all user metadata stored with that object is"},{"line_number":237,"context_line":"deleted en-masse and replaced with any user metadata included with the PUT or"},{"line_number":238,"context_line":"POST request. As a result, it is not possible to update a subset of the user"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_7cf2f370","line":235,"range":{"start_line":235,"start_character":0,"end_line":235,"end_character":20},"in_reply_to":"3aaa91ec_f9b9eecc","updated":"2016-06-28 10:01:13.000000000","message":"I like the repeated emphasis that this applies specifically to object user metadata.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":290,"context_line":"All headers on client requests in the form of ``X-Object-Transient-Sysmeta-\u003ckey\u003e``"},{"line_number":291,"context_line":"will be dropped from the request before being processed by any"},{"line_number":292,"context_line":"middleware.  All headers on responses from back-end systems in the form"},{"line_number":293,"context_line":"of ``X-Object-Transient-Sysmeta-\u003ckey\u003e`` will be removed after all middleware has"},{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_34ec1b8f","line":293,"range":{"start_line":293,"start_character":62,"end_line":293,"end_character":80},"updated":"2016-06-27 21:56:32.000000000","message":"nit: \"all middlewares have\"?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":290,"context_line":"All headers on client requests in the form of ``X-Object-Transient-Sysmeta-\u003ckey\u003e``"},{"line_number":291,"context_line":"will be dropped from the request before being processed by any"},{"line_number":292,"context_line":"middleware.  All headers on responses from back-end systems in the form"},{"line_number":293,"context_line":"of ``X-Object-Transient-Sysmeta-\u003ckey\u003e`` will be removed after all middleware has"},{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_7c99531f","line":293,"range":{"start_line":293,"start_character":62,"end_line":293,"end_character":80},"in_reply_to":"3aaa91ec_34ec1b8f","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates on an object have the same semantic as object user"},{"line_number":298,"context_line":"metadata updates on an object (see :ref:`usermeta`) i.e. whenever any PUT or"},{"line_number":299,"context_line":"POST request is made to an object, all existing items of transient-sysmeta are"},{"line_number":300,"context_line":"deleted en-masse and replaced with any transient-sysmeta included with the PUT"},{"line_number":301,"context_line":"or POST request. Transient-sysmeta set by a middleware is therefore prone to"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_0ffe2c05","line":298,"range":{"start_line":297,"start_character":65,"end_line":298,"end_character":29},"updated":"2016-06-27 21:56:32.000000000","message":"I think we only need to specify that this is for an object once. I vote for keeping the \"on an object\" part, for the same three-nouns-in-a-row reason I gave above.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":294,"context_line":"processed the response but before the response is sent to the client."},{"line_number":295,"context_line":"See :ref:`gatekeeper` middleware for more information."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"Transient-sysmeta updates on an object have the same semantic as object user"},{"line_number":298,"context_line":"metadata updates on an object (see :ref:`usermeta`) i.e. whenever any PUT or"},{"line_number":299,"context_line":"POST request is made to an object, all existing items of transient-sysmeta are"},{"line_number":300,"context_line":"deleted en-masse and replaced with any transient-sysmeta included with the PUT"},{"line_number":301,"context_line":"or POST request. Transient-sysmeta set by a middleware is therefore prone to"}],"source_content_type":"text/x-rst","patch_set":9,"id":"3aaa91ec_7c679325","line":298,"range":{"start_line":297,"start_character":65,"end_line":298,"end_character":29},"in_reply_to":"3aaa91ec_0ffe2c05","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":20988,"name":"Mathias Bjoerkqvist","email":"mbj@zurich.ibm.com","username":"mathiasb"},"change_message_id":"aeb292a6434604c72373185684b9c99386184634","unresolved":false,"context_lines":[{"line_number":280,"context_line":"individual items of user metadata is not supported. In cases where middleware"},{"line_number":281,"context_line":"needs to store its own metadata with a POST request, it may use Object Transient"},{"line_number":282,"context_line":"Sysmeta."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":285,"context_line":"Object Transient-Sysmeta"},{"line_number":286,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3aaa91ec_587ea76a","line":283,"updated":"2016-06-30 08:51:30.000000000","message":"I was initially confused by the difference between X-Object-Sysmeta and X-Object-Transient-Sysmeta, and I\u0027m wondering if it would help to explicitly mention that object sysmeta that never needs to be modified can be PUT as Sysmeta, but object metadata that may need to be modified later should be PUT (and subsequently modified using POST) as Transient-Sysmeta? (Hopefully I finally understood it!)","commit_id":"3ad003cf51151f8ce6dfc6c2c529206eda5f7b60"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"726312373375883c117f8be9e7b15f2fa4d09810","unresolved":false,"context_lines":[{"line_number":280,"context_line":"individual items of user metadata is not supported. In cases where middleware"},{"line_number":281,"context_line":"needs to store its own metadata with a POST request, it may use Object Transient"},{"line_number":282,"context_line":"Sysmeta."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":285,"context_line":"Object Transient-Sysmeta"},{"line_number":286,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3aaa91ec_852b6d81","line":283,"in_reply_to":"3aaa91ec_587ea76a","updated":"2016-06-30 16:41:15.000000000","message":"Fair point. I\u0027d prefer not to change this patch now but will note on trello for follow up.","commit_id":"3ad003cf51151f8ce6dfc6c2c529206eda5f7b60"}],"swift/common/middleware/copy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ef345e0d962b2455040386e58668cfda88552f62","unresolved":false,"context_lines":[{"line_number":214,"context_line":"    \"\"\""},{"line_number":215,"context_line":"    pass_headers \u003d [\u0027x-delete-at\u0027]"},{"line_number":216,"context_line":"    for k, v in from_r.headers.items():"},{"line_number":217,"context_line":"        if (is_sys_or_user_meta(\u0027object\u0027, k) or"},{"line_number":218,"context_line":"                is_object_transient_sysmeta(k) or"},{"line_number":219,"context_line":"                k.lower() in pass_headers):"},{"line_number":220,"context_line":"            to_r.headers[k] \u003d v"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_e06fe3f9","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":31},"updated":"2016-06-24 08:20:37.000000000","message":"Hrm. I feel like we should maybe just have is_sys_meta and is_user_meta, because is_sys_or_user_or_transient_meta is just ridiculous. Probably better as a follow-up, though.","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dabaf72ca3eb89201aac2b950be5ab8adb362ab2","unresolved":false,"context_lines":[{"line_number":214,"context_line":"    \"\"\""},{"line_number":215,"context_line":"    pass_headers \u003d [\u0027x-delete-at\u0027]"},{"line_number":216,"context_line":"    for k, v in from_r.headers.items():"},{"line_number":217,"context_line":"        if (is_sys_or_user_meta(\u0027object\u0027, k) or"},{"line_number":218,"context_line":"                is_object_transient_sysmeta(k) or"},{"line_number":219,"context_line":"                k.lower() in pass_headers):"},{"line_number":220,"context_line":"            to_r.headers[k] \u003d v"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_98880fc7","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":31},"in_reply_to":"3aaa91ec_e06fe3f9","updated":"2016-06-24 10:50:23.000000000","message":"Not sure I see the problem here. Having pass_headers be a list is superflous though.","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ef345e0d962b2455040386e58668cfda88552f62","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            if (is_sys_or_user_meta(\u0027object\u0027, k) or"},{"line_number":429,"context_line":"                    k.lower() \u003d\u003d \u0027x-delete-at\u0027 or"},{"line_number":430,"context_line":"                    is_object_transient_sysmeta(k)):"},{"line_number":431,"context_line":"                resp_headers[k] \u003d v"},{"line_number":432,"context_line":"        return resp_headers"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def handle_PUT(self, req, start_response):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_20760bd7","line":431,"updated":"2016-06-24 08:20:37.000000000","message":"This looks an awful lot like _copy_headers_into... should we just have that accept dicts (or dict-like objects) instead of Requests/Responses?","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dabaf72ca3eb89201aac2b950be5ab8adb362ab2","unresolved":false,"context_lines":[{"line_number":428,"context_line":"            if (is_sys_or_user_meta(\u0027object\u0027, k) or"},{"line_number":429,"context_line":"                    k.lower() \u003d\u003d \u0027x-delete-at\u0027 or"},{"line_number":430,"context_line":"                    is_object_transient_sysmeta(k)):"},{"line_number":431,"context_line":"                resp_headers[k] \u003d v"},{"line_number":432,"context_line":"        return resp_headers"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def handle_PUT(self, req, start_response):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_78b44381","line":431,"in_reply_to":"3aaa91ec_20760bd7","updated":"2016-06-24 10:50:23.000000000","message":"Done","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    Will copy desired headers from src to dest."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    :params src: an instance of collections.Mapping"},{"line_number":214,"context_line":"    :params dest: an instance of collections.Mapping"},{"line_number":215,"context_line":"    \"\"\""},{"line_number":216,"context_line":"    for k, v in src.items():"},{"line_number":217,"context_line":"        if (is_sys_or_user_meta(\u0027object\u0027, k) or"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_aae455ab","line":214,"updated":"2016-06-27 08:33:54.000000000","message":"nits) swift.common.headers_key_dict.HeadersKeyDict rather than collections.Mapping? It seems ok because HeadersKeyDict inherits dict.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    Will copy desired headers from src to dest."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    :params src: an instance of collections.Mapping"},{"line_number":214,"context_line":"    :params dest: an instance of collections.Mapping"},{"line_number":215,"context_line":"    \"\"\""},{"line_number":216,"context_line":"    for k, v in src.items():"},{"line_number":217,"context_line":"        if (is_sys_or_user_meta(\u0027object\u0027, k) or"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_73452fb2","line":214,"in_reply_to":"3aaa91ec_aae455ab","updated":"2016-06-27 14:50:22.000000000","message":"The function will accept any Mapping so I didn\u0027t restrict it to HeaderKeyDict","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"}],"swift/common/request_helpers.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"5b813eb5bc6e84f8a20e1860c6581b4f8cce3bc7","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    return \u0027x-%s-%s-\u0027 % (server_type.lower(), \u0027sysmeta\u0027)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def is_object_transient_sysmeta(key):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_24e278d5","line":238,"updated":"2016-06-14 12:36:18.000000000","message":"nit: I would prefer if this is defined earlier, either before strip_object_transient_sysmeta_prefix or even at the head of the file (though that\u0027s only a matter of taste)","commit_id":"7e174952ebcad49e75fa94fdeb166e6f1d8a552c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"81d86e8213ebd27bd430d226f4795d8e5c131511","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    return \u0027x-%s-%s-\u0027 % (server_type.lower(), \u0027sysmeta\u0027)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def is_object_transient_sysmeta(key):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_86d4bebd","line":238,"in_reply_to":"7aa08908_24e278d5","updated":"2016-06-15 18:16:29.000000000","message":"Done. Agree.","commit_id":"7e174952ebcad49e75fa94fdeb166e6f1d8a552c"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a75becf84317150e35e2bc7afd7edb91b5f40711","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def get_param(req, name, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_7f47701d","line":47,"updated":"2016-06-22 18:02:11.000000000","message":"just a nit or maybe my ocd kicking in, not sure...\nthis is not necessarily wrong, but it really hasn\u0027t been our coding style to have constants like this, we already have get_user_meta_prefix() and get_sys_meta_prefix(), would it not be cleaner more consistent to have something like get_transient_sysmeta_prefix()?\n\njust my 2 cents...","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7abbeeb64a116f3806c1c228e379b18813d4f302","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def get_param(req, name, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_65e04cfb","line":47,"in_reply_to":"3aaa91ec_7f47701d","updated":"2016-06-23 22:57:29.000000000","message":"Didn\u0027t we have a discussion about string constants back on feature/crypto ? :)\n\nSee Clay\u0027s comment here [1] on the original patch - the difference wrt get_sys_meta_prefix() and get_user_meta_prefix() is that those functions take an arg - as Clay pointed out, get_transient_sysmeta_prefix would look superfluous (it would have no server_type arg since transient meta only applies to objects).\n\n[1] https://review.openstack.org/#/c/158401/10/swift/common/request_helpers.py@279","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ef345e0d962b2455040386e58668cfda88552f62","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    :param key: header key"},{"line_number":211,"context_line":"    :returns: stripped header key"},{"line_number":212,"context_line":"    \"\"\""},{"line_number":213,"context_line":"    return key[len(OBJECT_TRANSIENT_SYSMETA_PREFIX):]"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"def get_user_meta_prefix(server_type):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_e046c379","line":213,"updated":"2016-06-24 08:20:37.000000000","message":"I think I\u0027d be more comfortable if this had something like\n\n if not key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX.lower()):\n      raise ValueError(...)\n\n(With similar changes to the other strip_*meta_prefix functions.)\n\nMaybe that\u0027s too much overhead, idk.","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dabaf72ca3eb89201aac2b950be5ab8adb362ab2","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    :param key: header key"},{"line_number":211,"context_line":"    :returns: stripped header key"},{"line_number":212,"context_line":"    \"\"\""},{"line_number":213,"context_line":"    return key[len(OBJECT_TRANSIENT_SYSMETA_PREFIX):]"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"def get_user_meta_prefix(server_type):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_3b9d95bc","line":213,"in_reply_to":"3aaa91ec_e046c379","updated":"2016-06-24 10:50:23.000000000","message":"I don\u0027t disagree, but maybe a follow up if its going to be changing the existing methods too? Seems like this following the existing pattern.","commit_id":"314dc23a53884aa2fe75360c27f937e34430a2a6"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"94d9af78380d9d4f48ec8fbdea1e04667e2649f7","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :returns: True if the key satisfies the test, False otherwise"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if len(key) \u003c\u003d len(OBJECT_TRANSIENT_SYSMETA_PREFIX):"},{"line_number":251,"context_line":"        return False"},{"line_number":252,"context_line":"    return key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_911bb380","line":251,"updated":"2016-06-24 20:13:32.000000000","message":"Why have this len() check first? According to my local test, this makes the function slower: https://gist.github.com/notmyname/a207d9c27c47f4910d1322597df3b0bc\n\nedit: ah, ok, I see now. We want to return False if the key exactly matches the prefix. Leaving my comment instead of deleting it, in case someone else has the same thought.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :returns: True if the key satisfies the test, False otherwise"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if len(key) \u003c\u003d len(OBJECT_TRANSIENT_SYSMETA_PREFIX):"},{"line_number":251,"context_line":"        return False"},{"line_number":252,"context_line":"    return key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_a9a44ab9","line":251,"in_reply_to":"3aaa91ec_2c88a170","updated":"2016-06-27 14:50:22.000000000","message":"When the key is shorter than OBJECT_TRANSIENT_SYSMETA_PREFIX, the current impl is 2x faster. When the key is longer but does not start with OBJECT_TRANSIENT_SYSMETA_PREFIX, Tim\u0027s proposal is approx 10-20% faster.\n\n? leave it as it is ?","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e568bb7905f0fc76f2d24cd5a8746512c180d47a","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :returns: True if the key satisfies the test, False otherwise"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if len(key) \u003c\u003d len(OBJECT_TRANSIENT_SYSMETA_PREFIX):"},{"line_number":251,"context_line":"        return False"},{"line_number":252,"context_line":"    return key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_2c88a170","line":251,"in_reply_to":"3aaa91ec_911bb380","updated":"2016-06-24 22:08:55.000000000","message":"I suppose we *could* make it something like\n\n return (key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)\n         and key[len(OBJECT_TRANSIENT_SYSMETA_PREFIX):] !\u003d \u0027\u0027)\n\nthough. Not sure how that compares.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    :param key: metadata key"},{"line_number":264,"context_line":"    :returns: the entire object transient system metadata header for key"},{"line_number":265,"context_line":"    \"\"\""},{"line_number":266,"context_line":"    return \u0027%s%s\u0027 % (OBJECT_TRANSIENT_SYSMETA_PREFIX, key)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_64f743d3","line":266,"updated":"2016-06-27 08:33:54.000000000","message":"This function seems to appear only in test case. Ah, probably get_object_ttransient_sysmeta and strip_object_transient_sysmeta_prefix are used in following patches in crypto-review chain.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3af4e90650b958954d61900f4142097e5cba277c","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    :param key: metadata key"},{"line_number":264,"context_line":"    :returns: the entire object transient system metadata header for key"},{"line_number":265,"context_line":"    \"\"\""},{"line_number":266,"context_line":"    return \u0027%s%s\u0027 % (OBJECT_TRANSIENT_SYSMETA_PREFIX, key)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_5a7106e0","line":266,"in_reply_to":"3aaa91ec_53af532b","updated":"2016-06-28 02:19:26.000000000","message":"Ok, got it. Leave this as it is here and I\u0027ll check the middleware later.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    :param key: metadata key"},{"line_number":264,"context_line":"    :returns: the entire object transient system metadata header for key"},{"line_number":265,"context_line":"    \"\"\""},{"line_number":266,"context_line":"    return \u0027%s%s\u0027 % (OBJECT_TRANSIENT_SYSMETA_PREFIX, key)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_53af532b","line":266,"in_reply_to":"3aaa91ec_64f743d3","updated":"2016-06-27 14:50:22.000000000","message":"Yes, this function is used in the crypto middlewares","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def get_param(req, name, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_6aab5ed7","line":47,"updated":"2016-06-27 21:56:32.000000000","message":"Should this be grouped separately in swift/cli/info.py, similar to user meta and sysmeta?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076091fbc3f262937daf828643817c9beb17efd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def get_param(req, name, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_458e1ed1","line":47,"in_reply_to":"3aaa91ec_3773644f","updated":"2016-06-28 17:29:35.000000000","message":"Sorry, I meant \"Should this class of metadata be grouped separately ...\". Something like http://paste.openstack.org/show/523815/\n\nCould be done as follow-up.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def get_param(req, name, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_3773644f","line":47,"in_reply_to":"3aaa91ec_6aab5ed7","updated":"2016-06-28 10:01:13.000000000","message":"I don\u0027t understand this comment - why would this declaration be in swift/cli/info.py ?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    return \u0027x-%s-%s-\u0027 % (server_type.lower(), \u0027sysmeta\u0027)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"def is_object_transient_sysmeta(key):"},{"line_number":243,"context_line":"    \"\"\""},{"line_number":244,"context_line":"    Tests if a header key starts with and is longer than the prefix for object"},{"line_number":245,"context_line":"    transient system metadata."}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_6f6ed097","line":242,"updated":"2016-06-27 21:56:32.000000000","message":"nit: I vaguely feel like this should be up around L169 or L181 (so it\u0027s grouped with the other is_*_meta functions) but I suppose it doesn\u0027t really matter.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    return \u0027x-%s-%s-\u0027 % (server_type.lower(), \u0027sysmeta\u0027)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"def is_object_transient_sysmeta(key):"},{"line_number":243,"context_line":"    \"\"\""},{"line_number":244,"context_line":"    Tests if a header key starts with and is longer than the prefix for object"},{"line_number":245,"context_line":"    transient system metadata."}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_d7aae084","line":242,"in_reply_to":"3aaa91ec_6f6ed097","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    return key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"def get_object_transient_sysmeta(key):"},{"line_number":256,"context_line":"    \"\"\""},{"line_number":257,"context_line":"    Returns the Object Transient System Metadata header for key."},{"line_number":258,"context_line":"    The Object Transient System Metadata namespace will be persisted by"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_8f94dc44","line":255,"updated":"2016-06-27 21:56:32.000000000","message":"This breaks style a bit. Why not leave middlewares in charge of the concatenating, similar to how things are for user meta and sysmeta?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    return key.lower().startswith(OBJECT_TRANSIENT_SYSMETA_PREFIX)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"def get_object_transient_sysmeta(key):"},{"line_number":256,"context_line":"    \"\"\""},{"line_number":257,"context_line":"    Returns the Object Transient System Metadata header for key."},{"line_number":258,"context_line":"    The Object Transient System Metadata namespace will be persisted by"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_f7ac3c37","line":255,"in_reply_to":"3aaa91ec_8f94dc44","updated":"2016-06-28 10:01:13.000000000","message":"I didn\u0027t author this but seems like it provides a useful convenience function and helps encapsulate OBJECT_TRANSIENT_SYSMETA_PREFIX in this module. I could see that get_user_meta(server_type, key) might also be useful additions that might clean up other code and move the style towards this.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a75becf84317150e35e2bc7afd7edb91b5f40711","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    for key, val in headers.iteritems():"},{"line_number":186,"context_line":"        if is_object_transient_sysmeta(key):"},{"line_number":187,"context_line":"            key \u003d strip_object_transient_sysmeta_prefix(key.lower())"},{"line_number":188,"context_line":"            transient_sysmeta[key] \u003d val"},{"line_number":189,"context_line":"    info \u003d {\u0027status\u0027: status_int,"},{"line_number":190,"context_line":"            \u0027length\u0027: headers.get(\u0027content-length\u0027),"},{"line_number":191,"context_line":"            \u0027type\u0027: headers.get(\u0027content-type\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_6e2188b4","line":188,"updated":"2016-06-22 18:02:11.000000000","message":"how about moving this code to _prep_headers_to_info method?","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7abbeeb64a116f3806c1c228e379b18813d4f302","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    for key, val in headers.iteritems():"},{"line_number":186,"context_line":"        if is_object_transient_sysmeta(key):"},{"line_number":187,"context_line":"            key \u003d strip_object_transient_sysmeta_prefix(key.lower())"},{"line_number":188,"context_line":"            transient_sysmeta[key] \u003d val"},{"line_number":189,"context_line":"    info \u003d {\u0027status\u0027: status_int,"},{"line_number":190,"context_line":"            \u0027length\u0027: headers.get(\u0027content-length\u0027),"},{"line_number":191,"context_line":"            \u0027type\u0027: headers.get(\u0027content-type\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_f9ed00b8","line":188,"in_reply_to":"3aaa91ec_6e2188b4","updated":"2016-06-23 22:57:29.000000000","message":"_prep_headers_to_info is generic to all server types, whereas transient sysmeta is specific to object servers, so I felt it was better to keep the transient sysmeta handling here.","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    }"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def headers_to_object_info(headers, status_int\u003dHTTP_OK):"},{"line_number":180,"context_line":"    \"\"\""},{"line_number":181,"context_line":"    Construct a cacheable dict of object info based on response headers."},{"line_number":182,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_64c2a386","line":179,"updated":"2016-06-27 08:33:54.000000000","message":"(memo for myself):\nPerhaps, headers_to_object_info and related functions are only used in *TEST CASES*? oh...but basically it\u0027s sort of kinds of common translation as well as account/container. And yeah, transient is a thing only for object, make sense.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    }"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def headers_to_object_info(headers, status_int\u003dHTTP_OK):"},{"line_number":180,"context_line":"    \"\"\""},{"line_number":181,"context_line":"    Construct a cacheable dict of object info based on response headers."},{"line_number":182,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_f3159f49","line":179,"in_reply_to":"3aaa91ec_64c2a386","updated":"2016-06-27 14:50:22.000000000","message":"Done","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":1411,"context_line":"        dst_headers.update((k.lower(), v)"},{"line_number":1412,"context_line":"                           for k, v in src_headers.items()"},{"line_number":1413,"context_line":"                           if k.lower() in self.pass_through_headers or"},{"line_number":1414,"context_line":"                           is_sys_or_user_meta(st, k))"},{"line_number":1415,"context_line":""},{"line_number":1416,"context_line":"    def generate_request_headers(self, orig_req\u003dNone, additional\u003dNone,"},{"line_number":1417,"context_line":"                                 transfer\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_eabf4e5e","line":1414,"range":{"start_line":1414,"start_character":27,"end_line":1414,"end_character":46},"updated":"2016-06-27 21:56:32.000000000","message":"We don\u0027t need to worry about transient sysmeta here?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":1411,"context_line":"        dst_headers.update((k.lower(), v)"},{"line_number":1412,"context_line":"                           for k, v in src_headers.items()"},{"line_number":1413,"context_line":"                           if k.lower() in self.pass_through_headers or"},{"line_number":1414,"context_line":"                           is_sys_or_user_meta(st, k))"},{"line_number":1415,"context_line":""},{"line_number":1416,"context_line":"    def generate_request_headers(self, orig_req\u003dNone, additional\u003dNone,"},{"line_number":1417,"context_line":"                                 transfer\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_c940880a","line":1414,"range":{"start_line":1414,"start_character":27,"end_line":1414,"end_character":46},"in_reply_to":"3aaa91ec_eabf4e5e","updated":"2016-06-28 10:01:13.000000000","message":"No, this method is not called by the object controller - note the default value transfer\u003dFalse in generate_request_headers. The object controller uses that default.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/probe/test_object_metadata_replication.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        # post some user meta to second server subset"},{"line_number":359,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":360,"context_line":"        self.container_brain.stop_handoff_half()"},{"line_number":361,"context_line":"        user_and_transient_sysmeta \u003d dict(usermeta.items() +"},{"line_number":362,"context_line":"                                          transient_sysmeta.items())"},{"line_number":363,"context_line":"        self._post_object(user_and_transient_sysmeta)"},{"line_number":364,"context_line":"        metadata \u003d self._get_object_metadata()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_50fe1006","line":361,"updated":"2016-06-27 21:56:32.000000000","message":"dict1.items() + dict2.items() doesn\u0027t work on py3. Maybe better?\n\n user_and_transient_sysmeta \u003d dict(usermeta, **transient_sysmeta)","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        # post some user meta to second server subset"},{"line_number":359,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":360,"context_line":"        self.container_brain.stop_handoff_half()"},{"line_number":361,"context_line":"        user_and_transient_sysmeta \u003d dict(usermeta.items() +"},{"line_number":362,"context_line":"                                          transient_sysmeta.items())"},{"line_number":363,"context_line":"        self._post_object(user_and_transient_sysmeta)"},{"line_number":364,"context_line":"        metadata \u003d self._get_object_metadata()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_692fd4f6","line":361,"in_reply_to":"3aaa91ec_50fe1006","updated":"2016-06-28 10:01:13.000000000","message":"hmmm, ** will break for non-str keys, which we don\u0027t have, but to be safe maybe I\u0027ll just use an update","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        # put user meta to first server subset"},{"line_number":414,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":415,"context_line":"        self.container_brain.stop_handoff_half()"},{"line_number":416,"context_line":"        user_and_transient_sysmeta \u003d dict(usermeta.items() +"},{"line_number":417,"context_line":"                                          transient_sysmeta.items())"},{"line_number":418,"context_line":"        self._post_object(user_and_transient_sysmeta)"},{"line_number":419,"context_line":"        metadata \u003d self._get_object_metadata()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_101da866","line":416,"updated":"2016-06-27 21:56:32.000000000","message":"Ditto.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        # put user meta to first server subset"},{"line_number":414,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":415,"context_line":"        self.container_brain.stop_handoff_half()"},{"line_number":416,"context_line":"        user_and_transient_sysmeta \u003d dict(usermeta.items() +"},{"line_number":417,"context_line":"                                          transient_sysmeta.items())"},{"line_number":418,"context_line":"        self._post_object(user_and_transient_sysmeta)"},{"line_number":419,"context_line":"        metadata \u003d self._get_object_metadata()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_a987fcd5","line":416,"in_reply_to":"3aaa91ec_101da866","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":131,"context_line":"                self.uploaded[path][0][\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        req \u003d swob.Request(env)"},{"line_number":134,"context_line":"        # simulate object POST"},{"line_number":135,"context_line":"        if method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":136,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_6d61e704","line":133,"updated":"2016-06-27 08:33:54.000000000","message":"nits) Is there a chance for init a Request instance at L92? Or use req_headers instead of req.headers. The reason I thought is I\u0027d like to make the if condition into elif. I don\u0027t think method will be changed in PUT handling above but for safety.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":131,"context_line":"                self.uploaded[path][0][\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        req \u003d swob.Request(env)"},{"line_number":134,"context_line":"        # simulate object POST"},{"line_number":135,"context_line":"        if method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":136,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_e99c925f","line":133,"in_reply_to":"3aaa91ec_6d61e704","updated":"2016-06-27 14:50:22.000000000","message":"Done","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # simulate object PUT"},{"line_number":118,"context_line":"        if method \u003d\u003d \u0027PUT\u0027 and obj:"},{"line_number":119,"context_line":"            input \u003d \u0027\u0027.join(iter(env[\u0027wsgi.input\u0027].read, \u0027\u0027))"},{"line_number":120,"context_line":"            if \u0027swift.callback.update_footers\u0027 in env:"},{"line_number":121,"context_line":"                footers \u003d HeaderKeyDict()"},{"line_number":122,"context_line":"                env[\u0027swift.callback.update_footers\u0027](footers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_1062c8d8","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":17},"updated":"2016-06-27 21:56:32.000000000","message":"Can be a follow-up, but we should fix this to not shadow a built-in at some point...","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # simulate object PUT"},{"line_number":118,"context_line":"        if method \u003d\u003d \u0027PUT\u0027 and obj:"},{"line_number":119,"context_line":"            input \u003d \u0027\u0027.join(iter(env[\u0027wsgi.input\u0027].read, \u0027\u0027))"},{"line_number":120,"context_line":"            if \u0027swift.callback.update_footers\u0027 in env:"},{"line_number":121,"context_line":"                footers \u003d HeaderKeyDict()"},{"line_number":122,"context_line":"                env[\u0027swift.callback.update_footers\u0027](footers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_e9fe2437","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":17},"in_reply_to":"3aaa91ec_1062c8d8","updated":"2016-06-28 10:01:13.000000000","message":"Done","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/unit/common/middleware/test_copy.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":777,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o-copy2\u0027, method\u003d\u0027GET\u0027)"},{"line_number":778,"context_line":"        status, resp_headers, body \u003d self.call_ssc(req)"},{"line_number":779,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":780,"context_line":"        verify_headers(source_headers.copy(), [], resp_headers)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_COPY_no_destination_header(self):"},{"line_number":783,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_30e612e8","line":780,"updated":"2016-06-27 08:33:54.000000000","message":"Probably, it\u0027s worth to add more asserts somewhere to test x-object-transient-sysmeta-* is safe when *EVEN IT IS COPY FOR SELF (i.e. same path between src and dest)?\n\ne.g.:\nhttps://gist.github.com/bloodeagle40234/b1780bb275006ea82860b0c6038700c7","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":777,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o-copy2\u0027, method\u003d\u0027GET\u0027)"},{"line_number":778,"context_line":"        status, resp_headers, body \u003d self.call_ssc(req)"},{"line_number":779,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":780,"context_line":"        verify_headers(source_headers.copy(), [], resp_headers)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_COPY_no_destination_header(self):"},{"line_number":783,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_ac3a9896","line":780,"in_reply_to":"3aaa91ec_30e612e8","updated":"2016-06-27 14:50:22.000000000","message":"Done -added another scenario to end of this test.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3af4e90650b958954d61900f4142097e5cba277c","unresolved":false,"context_lines":[{"line_number":777,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o-copy2\u0027, method\u003d\u0027GET\u0027)"},{"line_number":778,"context_line":"        status, resp_headers, body \u003d self.call_ssc(req)"},{"line_number":779,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":780,"context_line":"        verify_headers(source_headers.copy(), [], resp_headers)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_COPY_no_destination_header(self):"},{"line_number":783,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_fa2ef2a3","line":780,"in_reply_to":"3aaa91ec_ac3a9896","updated":"2016-06-28 02:19:26.000000000","message":"Confirmed, thanks!","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"}],"test/unit/common/middleware/test_gatekeeper.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                         \u0027X-Backend-Replication-Headers\u0027: \u0027stuff\u0027}"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    object_transient_sysmeta_headers \u003d {"},{"line_number":78,"context_line":"        \u0027x-object-transient-sysmeta-\u0027: \u0027value\u0027,"},{"line_number":79,"context_line":"        \u0027x-object-transient-sysmeta-foo\u0027: \u0027value\u0027}"},{"line_number":80,"context_line":"    x_timestamp_headers \u003d {\u0027X-Timestamp\u0027: \u00271455952805.719739\u0027}"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_33e1ced1","line":78,"range":{"start_line":78,"start_character":9,"end_line":78,"end_character":36},"updated":"2016-06-27 21:56:32.000000000","message":"Given the way gatekeeper works, it makes sense that this behaves the way it does, but it\u0027s still kinda odd in this context that that the header doesn\u0027t pass is_object_transient_sysmeta.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                         \u0027X-Backend-Replication-Headers\u0027: \u0027stuff\u0027}"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    object_transient_sysmeta_headers \u003d {"},{"line_number":78,"context_line":"        \u0027x-object-transient-sysmeta-\u0027: \u0027value\u0027,"},{"line_number":79,"context_line":"        \u0027x-object-transient-sysmeta-foo\u0027: \u0027value\u0027}"},{"line_number":80,"context_line":"    x_timestamp_headers \u003d {\u0027X-Timestamp\u0027: \u00271455952805.719739\u0027}"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_2c315aed","line":78,"range":{"start_line":78,"start_character":9,"end_line":78,"end_character":36},"in_reply_to":"3aaa91ec_33e1ced1","updated":"2016-06-28 10:01:13.000000000","message":"The behaviour is consistent with user and sys meta","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    forbidden_headers_out \u003d dict(sysmeta_headers.items() +"},{"line_number":83,"context_line":"                                 x_backend_headers.items() +"},{"line_number":84,"context_line":"                                 object_transient_sysmeta_headers.items())"},{"line_number":85,"context_line":"    forbidden_headers_in \u003d dict(sysmeta_headers.items() +"},{"line_number":86,"context_line":"                                x_backend_headers.items() +"},{"line_number":87,"context_line":"                                object_transient_sysmeta_headers.items())"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_8c732eb4","line":84,"updated":"2016-06-28 10:01:13.000000000","message":"I guess these aren\u0027t py3 compatible either but I am not embarking upon a port to py3 :)","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/unit/common/test_request_helpers.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"5b813eb5bc6e84f8a20e1860c6581b4f8cce3bc7","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_is_object_transient_sysmeta(self):"},{"line_number":73,"context_line":"        self.assertTrue(is_object_transient_sysmeta("},{"line_number":74,"context_line":"            \u0027x-object-transient-sysmeta-foo\u0027))"},{"line_number":75,"context_line":"        self.assertFalse(is_object_transient_sysmeta("},{"line_number":76,"context_line":"            \u0027x-object-transient-sysmeta-\u0027))"},{"line_number":77,"context_line":"        self.assertFalse(is_object_transient_sysmeta("}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_27a0baf3","line":74,"updated":"2016-06-14 12:36:18.000000000","message":"I\u0027m wondering if we should enforce a length limit, even if it\u0027s never exposed to a client and only used internally. In that case we\u0027d need a test here","commit_id":"7e174952ebcad49e75fa94fdeb166e6f1d8a552c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"81d86e8213ebd27bd430d226f4795d8e5c131511","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_is_object_transient_sysmeta(self):"},{"line_number":73,"context_line":"        self.assertTrue(is_object_transient_sysmeta("},{"line_number":74,"context_line":"            \u0027x-object-transient-sysmeta-foo\u0027))"},{"line_number":75,"context_line":"        self.assertFalse(is_object_transient_sysmeta("},{"line_number":76,"context_line":"            \u0027x-object-transient-sysmeta-\u0027))"},{"line_number":77,"context_line":"        self.assertFalse(is_object_transient_sysmeta("}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_26a98a25","line":74,"in_reply_to":"7aa08908_27a0baf3","updated":"2016-06-15 18:16:29.000000000","message":"Worth considering, but we do not impose any limit on sysmeta currently. Please comment again if you feel we definitely should.","commit_id":"7e174952ebcad49e75fa94fdeb166e6f1d8a552c"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":1931,"context_line":"                             {\u0027X-Timestamp\u0027: timestamp2,"},{"line_number":1932,"context_line":"                              \u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":1933,"context_line":"                              \u0027X-Object-Meta-1\u0027: \u0027Not One\u0027,"},{"line_number":1934,"context_line":"                              \u0027X-Object-Transient-Sysmeta-Foo\u0027: \u0027Not Bar\u0027})"},{"line_number":1935,"context_line":""},{"line_number":1936,"context_line":"    def test_PUT_then_fetch_system_metadata(self):"},{"line_number":1937,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_f0c92a27","line":1934,"updated":"2016-06-27 08:33:54.000000000","message":"Looks great.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":1931,"context_line":"                             {\u0027X-Timestamp\u0027: timestamp2,"},{"line_number":1932,"context_line":"                              \u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":1933,"context_line":"                              \u0027X-Object-Meta-1\u0027: \u0027Not One\u0027,"},{"line_number":1934,"context_line":"                              \u0027X-Object-Transient-Sysmeta-Foo\u0027: \u0027Not Bar\u0027})"},{"line_number":1935,"context_line":""},{"line_number":1936,"context_line":"    def test_PUT_then_fetch_system_metadata(self):"},{"line_number":1937,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_366ef596","line":1934,"in_reply_to":"3aaa91ec_f0c92a27","updated":"2016-06-27 14:50:22.000000000","message":":)","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":1997,"context_line":"                     \u0027X-Object-Meta-1\u0027: \u0027Not One\u0027,"},{"line_number":1998,"context_line":"                     \u0027X-Object-Sysmeta-1\u0027: \u0027Not One\u0027,"},{"line_number":1999,"context_line":"                     \u0027X-Object-Sysmeta-Two\u0027: \u0027Not Two\u0027,"},{"line_number":2000,"context_line":"                     \u0027X-Object-Transient-Sysmeta-Foo\u0027: \u0027Not Bar\u0027})"},{"line_number":2001,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":2002,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":2003,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_362a5c7f","line":2000,"updated":"2016-06-27 21:56:32.000000000","message":"I feel like at least one of these tests ought to POST to X-Object-Transient-Sysmeta-Not-Foo and verify that X-Object-Transient-Sysmeta-Foo is gone.\n\nOh, it looks like we do it in test/unit/proxy/test_sysmeta.py -- I guess it\u0027s not strictly necessary here, then.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":1997,"context_line":"                     \u0027X-Object-Meta-1\u0027: \u0027Not One\u0027,"},{"line_number":1998,"context_line":"                     \u0027X-Object-Sysmeta-1\u0027: \u0027Not One\u0027,"},{"line_number":1999,"context_line":"                     \u0027X-Object-Sysmeta-Two\u0027: \u0027Not Two\u0027,"},{"line_number":2000,"context_line":"                     \u0027X-Object-Transient-Sysmeta-Foo\u0027: \u0027Not Bar\u0027})"},{"line_number":2001,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":2002,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":2003,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_8c87ae11","line":2000,"in_reply_to":"3aaa91ec_362a5c7f","updated":"2016-06-28 10:01:13.000000000","message":"Done.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"73b2fb847262f5b00c46187f54cd40a7103a91ec","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    iter_multipart_mime_documents, public"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from test.unit import ("},{"line_number":56,"context_line":"    connect_tcp, readuntil2crlfs, FakeLogger, fake_http_connect, FakeRing,"},{"line_number":57,"context_line":"    FakeMemcache, debug_logger, patch_policies, write_fake_ring,"},{"line_number":58,"context_line":"    mocked_http_conn, DEFAULT_TEST_EC_TYPE)"},{"line_number":59,"context_line":"from swift.proxy import server as proxy_server"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_505c7e4a","line":56,"updated":"2016-06-27 08:33:54.000000000","message":"nits) it seems not necessary to flip the FakeRing place.","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9db84ae15ea7283333212cf0f6bb547c694c5a1a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    iter_multipart_mime_documents, public"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from test.unit import ("},{"line_number":56,"context_line":"    connect_tcp, readuntil2crlfs, FakeLogger, fake_http_connect, FakeRing,"},{"line_number":57,"context_line":"    FakeMemcache, debug_logger, patch_policies, write_fake_ring,"},{"line_number":58,"context_line":"    mocked_http_conn, DEFAULT_TEST_EC_TYPE)"},{"line_number":59,"context_line":"from swift.proxy import server as proxy_server"}],"source_content_type":"text/x-python","patch_set":8,"id":"3aaa91ec_d6b851eb","line":56,"in_reply_to":"3aaa91ec_505c7e4a","updated":"2016-06-27 14:50:22.000000000","message":"hmmm, this is how it is on master so it must be flopped earlier in the patch chain and flipped here*. Can I leave it this way to avoid rebase noise?\n\n* It was moved in first patch, 328203 https://review.openstack.org/#/c/328203/3/test/unit/proxy/test_server.py","commit_id":"0cdfe310b52e38de225578bfc3267742aa8eb5cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    iter_multipart_mime_documents, public"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from test.unit import ("},{"line_number":56,"context_line":"    connect_tcp, readuntil2crlfs, FakeLogger, fake_http_connect, FakeRing,"},{"line_number":57,"context_line":"    FakeMemcache, debug_logger, patch_policies, write_fake_ring,"},{"line_number":58,"context_line":"    mocked_http_conn, DEFAULT_TEST_EC_TYPE)"},{"line_number":59,"context_line":"from swift.proxy import server as proxy_server"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_b6648ce5","line":56,"updated":"2016-06-27 21:56:32.000000000","message":"nit: unnecessary change.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    iter_multipart_mime_documents, public"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from test.unit import ("},{"line_number":56,"context_line":"    connect_tcp, readuntil2crlfs, FakeLogger, fake_http_connect, FakeRing,"},{"line_number":57,"context_line":"    FakeMemcache, debug_logger, patch_policies, write_fake_ring,"},{"line_number":58,"context_line":"    mocked_http_conn, DEFAULT_TEST_EC_TYPE)"},{"line_number":59,"context_line":"from swift.proxy import server as proxy_server"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_0cca9e4f","line":56,"in_reply_to":"3aaa91ec_b6648ce5","updated":"2016-06-28 10:01:13.000000000","message":"see comment on patch set 8 - this is undoing an earlier unnecessary change in first patch of chain. I have left as is to avoid rebase noise.","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}],"test/unit/proxy/test_sysmeta.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a75becf84317150e35e2bc7afd7edb91b5f40711","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        req \u003d Request.blank(path, environ\u003d{})"},{"line_number":441,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":442,"context_line":"        self._assertStatus(resp, 200)"},{"line_number":443,"context_line":"        self._assertNotInHeaders(resp, self.original_meta_headers_2)"},{"line_number":444,"context_line":"        self._assertInHeaders(resp, self.changed_transient_sysmeta_headers)"},{"line_number":445,"context_line":"        self._assertInHeaders(resp, self.new_transient_sysmeta_headers)"},{"line_number":446,"context_line":"        self._assertNotInHeaders(resp,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_24483f87","line":443,"range":{"start_line":443,"start_character":39,"end_line":443,"end_character":67},"updated":"2016-06-22 18:02:11.000000000","message":"I don\u0027t understand why tests for original_meta_headers_2, it was never PUT in the first place. Should it be testing for original_meta_headers_1 instead?\n\nPlus, I just realized that when a middleware updates a transient metadata, that will also erase user\u0027s metadata. I think that\u0027s important information that should be called out explicitly for third-party middleware developers in the docs.","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7abbeeb64a116f3806c1c228e379b18813d4f302","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        req \u003d Request.blank(path, environ\u003d{})"},{"line_number":441,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":442,"context_line":"        self._assertStatus(resp, 200)"},{"line_number":443,"context_line":"        self._assertNotInHeaders(resp, self.original_meta_headers_2)"},{"line_number":444,"context_line":"        self._assertInHeaders(resp, self.changed_transient_sysmeta_headers)"},{"line_number":445,"context_line":"        self._assertInHeaders(resp, self.new_transient_sysmeta_headers)"},{"line_number":446,"context_line":"        self._assertNotInHeaders(resp,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_102ee4a4","line":443,"range":{"start_line":443,"start_character":39,"end_line":443,"end_character":67},"in_reply_to":"3aaa91ec_24483f87","updated":"2016-06-23 22:57:29.000000000","message":"Fixed, plus a couple of other were needed in this test. Good catch.\n\nWill add text to the docs too.","commit_id":"ecca6437fd33a95dca529b4d7018e3665c54f5af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    # these are replacement transient_sysmeta headers"},{"line_number":183,"context_line":"    changed_transient_sysmeta_headers \u003d \\"},{"line_number":184,"context_line":"        {\u0027x-object-transient-sysmeta-testA\u0027: \u0027changed_A\u0027}"},{"line_number":185,"context_line":"    new_transient_sysmeta_headers \u003d {\u0027x-object-transient-sysmeta-testC\u0027: \u0027C\u0027}"},{"line_number":186,"context_line":"    new_transient_sysmeta_headers_2 \u003d {\u0027x-object-transient-sysmeta-testD\u0027: \u0027D\u0027}"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_PUT_sysmeta_then_GET(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_b692cc9d","line":185,"range":{"start_line":185,"start_character":4,"end_line":185,"end_character":33},"updated":"2016-06-27 21:56:32.000000000","message":"nit: not new_transient_sysmeta_headers_1?","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f94528639e9c9762f1751a315631c7b818c7b53","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self.assertEqual({\u0027testa\u0027: \u0027changed_A\u0027, \u0027testc\u0027: \u0027C\u0027},"},{"line_number":454,"context_line":"                         info[\u0027transient_sysmeta\u0027])"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        # subsequent PUT replaces all transient_sysmeta and usermeta values"},{"line_number":457,"context_line":"        env \u003d {\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027}"},{"line_number":458,"context_line":"        hdrs \u003d dict(self.new_transient_sysmeta_headers_2)"},{"line_number":459,"context_line":"        hdrs.update(self.original_meta_headers_2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_56a0c8a5","line":456,"range":{"start_line":456,"start_character":38,"end_line":456,"end_character":68},"updated":"2016-06-27 21:56:32.000000000","message":"nit: and sysmeta","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e3df1307c3c699f2d96ad42369bd31fe4f043eb9","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self.assertEqual({\u0027testa\u0027: \u0027changed_A\u0027, \u0027testc\u0027: \u0027C\u0027},"},{"line_number":454,"context_line":"                         info[\u0027transient_sysmeta\u0027])"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        # subsequent PUT replaces all transient_sysmeta and usermeta values"},{"line_number":457,"context_line":"        env \u003d {\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027}"},{"line_number":458,"context_line":"        hdrs \u003d dict(self.new_transient_sysmeta_headers_2)"},{"line_number":459,"context_line":"        hdrs.update(self.original_meta_headers_2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aaa91ec_2c55da1c","line":456,"range":{"start_line":456,"start_character":38,"end_line":456,"end_character":68},"in_reply_to":"3aaa91ec_56a0c8a5","updated":"2016-06-28 10:01:13.000000000","message":"there is no sysmeta top be replaced. True, it would be deleted/replaced if it was there, but perhaps best not to leave a comment that sends the reader looking for sysmeta headers in the first PUT.\n\nBTW  sysmeta replaced on second PUT is tested by test_sysmeta_not_updated_by_POST","commit_id":"882aec52fe6a732a3396dee181c08eabe39653ab"}]}
