)]}'
{"swift/obj/server.py":[{"author":{"_account_id":9205,"name":"Gil Vernik","email":"gilv@il.ibm.com","username":"gilv"},"change_message_id":"56ea2d62d41a408848a7d9bf002fd73351b3af76","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":345,"context_line":"        # existing sysmeta is not changed by a POST..."},{"line_number":346,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":347,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":348,"context_line":"        for header_key in self.allowed_headers:"},{"line_number":349,"context_line":"            if header_key in request.headers:"},{"line_number":350,"context_line":"                header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BgSo%3D","line":347,"updated":"2014-03-26 10:47:45.000000000","message":"Assume user1 and user2 will send both almost simultaneously, a  POST /a/c/o, but each send different metadata keys. Since there is no atomicity here, you may have  orig_metadata which is not updated and so you will over write other keys here. Both users will get success message, but in reality one\u0027s keys got lost during update.","commit_id":"2a4f93d15a6935735cee85beb1ec8b356ed8ce03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fe7fdc307ca2ffb6e8bb089cf113ad06c0e63db2","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":345,"context_line":"        # existing sysmeta is not changed by a POST..."},{"line_number":346,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":347,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":348,"context_line":"        for header_key in self.allowed_headers:"},{"line_number":349,"context_line":"            if header_key in request.headers:"},{"line_number":350,"context_line":"                header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_2346ff4f","line":347,"in_reply_to":"AAAAWH%2F%2BgSo%3D","updated":"2014-07-10 14:23:59.000000000","message":"There is no atomicity but both concurrent requests perform the same action w.r.t. sysmeta i.e. copy from original to new, so the outcome is deterministic.\n\nWhat you describe is true for user metadata, but each request will have a different timestamp and the later timestamp.meta file will always survive, so its consistent with sending two sequential POSTs of user metadata.","commit_id":"2a4f93d15a6935735cee85beb1ec8b356ed8ce03"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"e9f0da833f7d80cae982110c5fbd7ff61bcca6c1","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: req_timestamp.internal}"},{"line_number":348,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":349,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":350,"context_line":"        # existing sysmeta is not changed by a POST..."},{"line_number":351,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":352,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":353,"context_line":"        for header_key in self.allowed_headers:"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_1a32005f","line":350,"updated":"2014-07-11 19:45:38.000000000","message":"sorry, haven\u0027t worked much with obj metadata so may ask some basic questions... here I thought the intent was to update existing sys metadata (read/modify/write), isn\u0027t this just reading the orig metadata and preserving it such that any new sys meta of the same name would be lost?\n\nalso, for my own clarification, this is what you call \u0027fast POST\u0027 in the wiki right?  (when object_post_as_copy\u003dfalse)","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"8adbc2a5bb6ab1044a40ca6221a4bf26e51ae405","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: req_timestamp.internal}"},{"line_number":348,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":349,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":350,"context_line":"        # existing sysmeta is not changed by a POST..."},{"line_number":351,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":352,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":353,"context_line":"        for header_key in self.allowed_headers:"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_e6005503","line":350,"in_reply_to":"baada198_1a32005f","updated":"2014-07-11 20:39:53.000000000","message":"OK, never mind I think I get it now.  This patch will simply ignore any object sysmeta that\u0027s used in a POST correct?  You are intentionally only putting back what was in there before for now at least","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a300c4c52ca25aa6f0fa92db1ad8e5eb59d95c37","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: req_timestamp.internal}"},{"line_number":348,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":349,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":350,"context_line":"        # existing sysmeta is not changed by a POST..."},{"line_number":351,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":352,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":353,"context_line":"        for header_key in self.allowed_headers:"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_b013d0ff","line":350,"in_reply_to":"baada198_e6005503","updated":"2014-07-14 14:34:36.000000000","message":"Exactly. Intent of this patch is that sysmeta from PUT is unchanged by POST.","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"e9f0da833f7d80cae982110c5fbd7ff61bcca6c1","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                if config_true_value("},{"line_number":454,"context_line":"                        request.headers.get(\u0027x-fresh-metadata\u0027, \u0027false\u0027)):"},{"line_number":455,"context_line":"                    # this is a POST-as-copy, preserve existing sysmeta"},{"line_number":456,"context_line":"                    metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":457,"context_line":"                                    if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":458,"context_line":"                else:"},{"line_number":459,"context_line":"                    metadata.update((k, (v, req_timestamp.internal))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_fa7aacef","line":456,"updated":"2014-07-11 19:45:38.000000000","message":"same question here as above, what happens to incoming sys meta?","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a300c4c52ca25aa6f0fa92db1ad8e5eb59d95c37","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                if config_true_value("},{"line_number":454,"context_line":"                        request.headers.get(\u0027x-fresh-metadata\u0027, \u0027false\u0027)):"},{"line_number":455,"context_line":"                    # this is a POST-as-copy, preserve existing sysmeta"},{"line_number":456,"context_line":"                    metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":457,"context_line":"                                    if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":458,"context_line":"                else:"},{"line_number":459,"context_line":"                    metadata.update((k, (v, req_timestamp.internal))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_10b39c0a","line":456,"in_reply_to":"baada198_8666b9eb","updated":"2014-07-14 14:34:36.000000000","message":"Yep, and the x-fresh-metadata conveniently gives us a hint that this PUT is actually the result of a POST-as-copy","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"8adbc2a5bb6ab1044a40ca6221a4bf26e51ae405","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                if config_true_value("},{"line_number":454,"context_line":"                        request.headers.get(\u0027x-fresh-metadata\u0027, \u0027false\u0027)):"},{"line_number":455,"context_line":"                    # this is a POST-as-copy, preserve existing sysmeta"},{"line_number":456,"context_line":"                    metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":457,"context_line":"                                    if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":458,"context_line":"                else:"},{"line_number":459,"context_line":"                    metadata.update((k, (v, req_timestamp.internal))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_8666b9eb","line":456,"in_reply_to":"baada198_fa7aacef","updated":"2014-07-11 20:39:53.000000000","message":"again, its intentionally dropped here since this patch isn\u0027t supporting updating of obj sysmeta on POST","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"e9f0da833f7d80cae982110c5fbd7ff61bcca6c1","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":457,"context_line":"                                    if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":458,"context_line":"                else:"},{"line_number":459,"context_line":"                    metadata.update((k, (v, req_timestamp.internal))"},{"line_number":460,"context_line":"                                    for k, v in request.headers.iteritems()"},{"line_number":461,"context_line":"                                    if is_sys_meta(\u0027object\u0027, k))"},{"line_number":462,"context_line":"                for header_key in ("}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_9a6b701d","line":459,"updated":"2014-07-11 19:45:38.000000000","message":"so this is just a regular old PUT that has sys meta, right?","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a300c4c52ca25aa6f0fa92db1ad8e5eb59d95c37","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":457,"context_line":"                                    if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":458,"context_line":"                else:"},{"line_number":459,"context_line":"                    metadata.update((k, (v, req_timestamp.internal))"},{"line_number":460,"context_line":"                                    for k, v in request.headers.iteritems()"},{"line_number":461,"context_line":"                                    if is_sys_meta(\u0027object\u0027, k))"},{"line_number":462,"context_line":"                for header_key in ("}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_50d0b41e","line":459,"in_reply_to":"baada198_9a6b701d","updated":"2014-07-14 14:34:36.000000000","message":"Right","commit_id":"4cf1b540a839919193a8f0d324d907413fa4132f"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"b67dd590ad1a184951d8fd5723fe0428eb16ca6d","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                }"},{"line_number":448,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":449,"context_line":"                                if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":450,"context_line":"                # include timestamp with sysmeta with a view to sysmeta items"},{"line_number":451,"context_line":"                # being independently updatable in future"},{"line_number":452,"context_line":"                metadata.update((k, (v, req_timestamp.internal))"},{"line_number":453,"context_line":"                                for k, v in request.headers.iteritems()"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_8933be61","line":450,"updated":"2014-07-15 22:25:56.000000000","message":"meaning of this comment isn\u0027t super obvious to me at least...  \"with a view to sysmeta items\", maybe try re-wording it?","commit_id":"6f58c6df8da6dd73a962729a495b13cb55398fd7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"241081a9c9484daaf87d0a3fc8098df7fb316e9d","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                }"},{"line_number":448,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":449,"context_line":"                                if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":450,"context_line":"                # include timestamp with sysmeta with a view to sysmeta items"},{"line_number":451,"context_line":"                # being independently updatable in future"},{"line_number":452,"context_line":"                metadata.update((k, (v, req_timestamp.internal))"},{"line_number":453,"context_line":"                                for k, v in request.headers.iteritems()"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_20f395a0","line":450,"in_reply_to":"baada198_8933be61","updated":"2014-07-16 09:07:31.000000000","message":"fair point :) i\u0027ll improve that","commit_id":"6f58c6df8da6dd73a962729a495b13cb55398fd7"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a347cf05e5fb622b644f31b666c031773635a1a1","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            self.assertEquals("},{"line_number":889,"context_line":"                resp.headers[\u0027last-modified\u0027],"},{"line_number":890,"context_line":"                strftime(\u0027%a, %d %b %Y %H:%M:%S GMT\u0027,"},{"line_number":891,"context_line":"                         gmtime(math.ceil(float(timestamp)))))"},{"line_number":892,"context_line":"            self.assertEquals(resp.headers[\u0027etag\u0027],"},{"line_number":893,"context_line":"                              \u0027\"1000d172764c9dbc3a5798a67ec5bb76\"\u0027)"},{"line_number":894,"context_line":"            self.assertEquals(resp.headers[\u0027x-object-meta-1\u0027], \u0027Not One\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_391a5dc7","line":891,"updated":"2014-08-01 23:41:08.000000000","message":"should be timestamp2 here; Last-Modified does get updated by a POST.\n\nThe test will pass as long as timestamp and timestamp2 share the same integer part, which is likely, but sometimes it\u0027ll fail.","commit_id":"e7db31efeea3c5d02a96f2d1e444ffbe3cc4a34f"}]}
