)]}'
{"doc/source/api/large_objects.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":160,"context_line":"the object segments are in and ``{prefix}`` is the common prefix for all"},{"line_number":161,"context_line":"the segments. You must UTF-8-encode and then URL-encode the container"},{"line_number":162,"context_line":"and common prefix in the ``X-Object-Manifest`` header.  You must"},{"line_number":163,"context_line":"supply the ``X-Object-Manifest`` header on a POST to the manifest file."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is best to upload all the segments first and then create or update"},{"line_number":166,"context_line":"the manifest. With this method, the full object is not available for"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_f7e08afc","line":163,"updated":"2016-01-28 12:35:19.000000000","message":"This could be interpreted as \u0027the only time you can set the header is on a POST\u0027\n\nI would suggest moving the sentence to its own paragraph at line 171 and make it a note, \n\nMaybe: \"Whenever you update a manifest object using a POST request you must include an \u0027X-Object-Manifest\u0027 header in order for the object to continue to behave as a manifest object.\"","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":160,"context_line":"the object segments are in and ``{prefix}`` is the common prefix for all"},{"line_number":161,"context_line":"the segments. You must UTF-8-encode and then URL-encode the container"},{"line_number":162,"context_line":"and common prefix in the ``X-Object-Manifest`` header.  You must"},{"line_number":163,"context_line":"supply the ``X-Object-Manifest`` header on a POST to the manifest file."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is best to upload all the segments first and then create or update"},{"line_number":166,"context_line":"the manifest. With this method, the full object is not available for"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_e54a0283","line":163,"in_reply_to":"7a5de9d1_f7e08afc","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":233,"context_line":"request that created the manifest. You can easily change the"},{"line_number":234,"context_line":"``Content-Type`` by reissuing the **PUT** request."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"**Example POSt to manifest request: HTTP**"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":".. code::"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_d76eaec8","line":236,"updated":"2016-01-28 12:35:19.000000000","message":"typo in POSt","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":233,"context_line":"request that created the manifest. You can easily change the"},{"line_number":234,"context_line":"``Content-Type`` by reissuing the **PUT** request."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"**Example POSt to manifest request: HTTP**"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":".. code::"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_e518c286","line":236,"in_reply_to":"7a5de9d1_d76eaec8","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a94b1994d446bdb86c4edc51afdf2e70c0d362df","unresolved":false,"context_lines":[{"line_number":168,"context_line":"this new location. During the upload of the new segments, the original"},{"line_number":169,"context_line":"manifest is still available to download the first set of segments."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Note"},{"line_number":172,"context_line":"~~~~"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Whenever you update a manifest object using a POST request you must"}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a5de9d1_82d2e75a","line":171,"updated":"2016-01-29 16:51:32.000000000","message":"This creates a new heading at same level as previous, which then separates the following content.\n\nSuggest:\n\n  .. note::\n\nthen text indented by two spaces","commit_id":"18393ecd5cc08c201bf96ac5db673f9affc07f3e"}],"doc/source/overview_large_objects.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  so you can tell where it\u0027s getting its segments from."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"* The client must supply the ``X-Object-Manifest`` header on a POST.  If not,"},{"line_number":61,"context_line":"  then the manifest file will be lost."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* The response\u0027s ``Content-Length`` for a ``GET`` or ``HEAD`` on the manifest"},{"line_number":64,"context_line":"  file will be the sum of all the segments in the ``\u003ccontainer\u003e/\u003cprefix\u003e``"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_77725a4b","line":61,"updated":"2016-01-28 12:35:19.000000000","message":"the file is not lost, but it ceases to behave as a manifest","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  so you can tell where it\u0027s getting its segments from."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"* The client must supply the ``X-Object-Manifest`` header on a POST.  If not,"},{"line_number":61,"context_line":"  then the manifest file will be lost."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* The response\u0027s ``Content-Length`` for a ``GET`` or ``HEAD`` on the manifest"},{"line_number":64,"context_line":"  file will be the sum of all the segments in the ``\u003ccontainer\u003e/\u003cprefix\u003e``"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a5de9d1_30edbaef","line":61,"in_reply_to":"7a5de9d1_77725a4b","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"}],"swift/common/middleware/dlo.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b77bdd227c60d6a97e4b60ef08147139280f839f","unresolved":false,"context_lines":[{"line_number":451,"context_line":"                    # object."},{"line_number":452,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":453,"context_line":"                else:"},{"line_number":454,"context_line":"                    orig_method \u003d source_req.environ.\\"},{"line_number":455,"context_line":"                        get(\u0027swift.orig_req_method\u0027, source_req.method)"},{"line_number":456,"context_line":"                    if \u0027swift.post_as_copy\u0027 in source_req.environ and \\"},{"line_number":457,"context_line":"                        source_req.environ[\u0027swift.post_as_copy\u0027] is True:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_a09d90bd","line":454,"updated":"2015-12-07 17:40:42.000000000","message":"orig_method does not appear to be used","commit_id":"76e414c30d7fa42898e418294cf5c09029b76f28"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b77bdd227c60d6a97e4b60ef08147139280f839f","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                else:"},{"line_number":454,"context_line":"                    orig_method \u003d source_req.environ.\\"},{"line_number":455,"context_line":"                        get(\u0027swift.orig_req_method\u0027, source_req.method)"},{"line_number":456,"context_line":"                    if \u0027swift.post_as_copy\u0027 in source_req.environ and \\"},{"line_number":457,"context_line":"                        source_req.environ[\u0027swift.post_as_copy\u0027] is True:"},{"line_number":458,"context_line":"                        sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":459,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_00682486","line":456,"updated":"2015-12-07 17:40:42.000000000","message":"looks like the nested if/else could reduce to an if/elif/else at outer level","commit_id":"76e414c30d7fa42898e418294cf5c09029b76f28"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b77bdd227c60d6a97e4b60ef08147139280f839f","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                    orig_method \u003d source_req.environ.\\"},{"line_number":455,"context_line":"                        get(\u0027swift.orig_req_method\u0027, source_req.method)"},{"line_number":456,"context_line":"                    if \u0027swift.post_as_copy\u0027 in source_req.environ and \\"},{"line_number":457,"context_line":"                        source_req.environ[\u0027swift.post_as_copy\u0027] is True:"},{"line_number":458,"context_line":"                        sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":459,"context_line":"                    else:"},{"line_number":460,"context_line":"                        ctx \u003d GetContext(self, self.logger)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_20e0c028","line":457,"updated":"2015-12-07 17:40:42.000000000","message":"in SLO it is sufficient for swift.post_as_copy to be in the env, its value is not tested, so perhaps this should be the same for consistency.","commit_id":"76e414c30d7fa42898e418294cf5c09029b76f28"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"bdbac50fda39cd34758c503599b366746fa12cd0","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                    # To copy the manifest, we let the copy proceed as normal,"},{"line_number":451,"context_line":"                    # but ensure that X-Object-Manifest is set on the new"},{"line_number":452,"context_line":"                    # object."},{"line_number":453,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":454,"context_line":"                else:"},{"line_number":455,"context_line":"                    ctx \u003d GetContext(self, self.logger)"},{"line_number":456,"context_line":"                    source_resp \u003d ctx.get_or_head_response("}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_3cc31b8b","line":453,"range":{"start_line":453,"start_character":60,"end_line":453,"end_character":65},"updated":"2016-01-11 03:37:01.000000000","message":"this is the part that Alistair was saying was bad for fast-post, I believe.","commit_id":"71f78b292fd2caa827fad0298abcce5076836d1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":449,"context_line":"            orig_method \u003d source_req.environ.get(\u0027swift.orig_req_method\u0027,"},{"line_number":450,"context_line":"                                                 source_req.method)"},{"line_number":451,"context_line":"            if x_o_m:"},{"line_number":452,"context_line":"                if source_req.params.get(\u0027multipart-manifest\u0027) \u003d\u003d \u0027get\u0027:"},{"line_number":453,"context_line":"                    # To copy the manifest, we let the copy proceed as normal,"},{"line_number":454,"context_line":"                    # but ensure that X-Object-Manifest is set on the new"},{"line_number":455,"context_line":"                    # object."}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_341ce076","line":452,"updated":"2016-01-28 12:35:19.000000000","message":"I\u0027m still bothered that this condition overrides the post-as-copy - seem my gist for how the test fails when multipart-manifest \u003d get with a POST.\n\nWith fast-post it will be hard to have multipart-manifest influence the outcome of a POST, so I think we need to make this consistent i.e. POST behavior ignores multipart-manifest param.","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                    # object."},{"line_number":456,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":457,"context_line":"                elif (\u0027swift.post_as_copy\u0027 in source_req.environ) and \\"},{"line_number":458,"context_line":"                        (orig_method \u003d\u003d \u0027POST\u0027):"},{"line_number":459,"context_line":"                    # client didn\u0027t send x_o_m in this case, so don\u0027t persist"},{"line_number":460,"context_line":"                    pass"},{"line_number":461,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_0473b581","line":458,"updated":"2016-01-28 12:35:19.000000000","message":"nit: use parentheses around whole condition to avoid the \\ line break\n\nactually I don\u0027t think the second part of the condition (orig_method \u003d\u003d POST) is necessary, post_as_copy is only set for a POST request in obj.py","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                    # object."},{"line_number":456,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":457,"context_line":"                elif (\u0027swift.post_as_copy\u0027 in source_req.environ) and \\"},{"line_number":458,"context_line":"                        (orig_method \u003d\u003d \u0027POST\u0027):"},{"line_number":459,"context_line":"                    # client didn\u0027t send x_o_m in this case, so don\u0027t persist"},{"line_number":460,"context_line":"                    pass"},{"line_number":461,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_d060e637","line":458,"in_reply_to":"7a5de9d1_0473b581","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":457,"context_line":"                elif (\u0027swift.post_as_copy\u0027 in source_req.environ) and \\"},{"line_number":458,"context_line":"                        (orig_method \u003d\u003d \u0027POST\u0027):"},{"line_number":459,"context_line":"                    # client didn\u0027t send x_o_m in this case, so don\u0027t persist"},{"line_number":460,"context_line":"                    pass"},{"line_number":461,"context_line":"                else:"},{"line_number":462,"context_line":"                    ctx \u003d GetContext(self, self.logger)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_c4f11dcf","line":459,"updated":"2016-01-28 12:35:19.000000000","message":"this comment doesn\u0027t make sense to me - the client may have sent x-o-m. the significant point here is that we do not copy it across from source to req.","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    sink_req.headers[\u0027X-Object-Manifest\u0027] \u003d x_o_m"},{"line_number":457,"context_line":"                elif (\u0027swift.post_as_copy\u0027 in source_req.environ) and \\"},{"line_number":458,"context_line":"                        (orig_method \u003d\u003d \u0027POST\u0027):"},{"line_number":459,"context_line":"                    # client didn\u0027t send x_o_m in this case, so don\u0027t persist"},{"line_number":460,"context_line":"                    pass"},{"line_number":461,"context_line":"                else:"},{"line_number":462,"context_line":"                    ctx \u003d GetContext(self, self.logger)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_50dcf6e3","line":459,"in_reply_to":"7a5de9d1_c4f11dcf","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a94b1994d446bdb86c4edc51afdf2e70c0d362df","unresolved":false,"context_lines":[{"line_number":83,"context_line":"During the upload of the new segments, the original manifest will still be"},{"line_number":84,"context_line":"available to download the first set of segments."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":".. notes::"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    The \u0027X-Object-Manifest\u0027 must be provided on a POST to the manifest file."},{"line_number":89,"context_line":"    Otherwise, the manifest will no longer be treated as a manifest file."}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_51b28307","line":86,"updated":"2016-01-29 16:51:32.000000000","message":".. note:: is a sphinx inline directive, it doesn\u0027t know what notes:: is :)\n\nremove the \u0027s\u0027","commit_id":"18393ecd5cc08c201bf96ac5db673f9affc07f3e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a94b1994d446bdb86c4edc51afdf2e70c0d362df","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            x_o_m \u003d source_resp.headers.get(\u0027X-Object-Manifest\u0027)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"            if x_o_m:"},{"line_number":451,"context_line":"                if (\u0027swift.post_as_copy\u0027 in source_req.environ):"},{"line_number":452,"context_line":"                    # don\u0027t persist x_o_m in this case"},{"line_number":453,"context_line":"                    pass"},{"line_number":454,"context_line":"                elif source_req.params.get(\u0027multipart-manifest\u0027) \u003d\u003d \u0027get\u0027:"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_eaf05193","line":451,"updated":"2016-01-29 16:51:32.000000000","message":"parentheses not needed","commit_id":"18393ecd5cc08c201bf96ac5db673f9affc07f3e"}],"swift/obj/diskfile.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"bdbac50fda39cd34758c503599b366746fa12cd0","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"                [(key, val) for key, val in self._datafile_metadata.items()"},{"line_number":1728,"context_line":"                 if key.lower() in DATAFILE_SYSTEM_META"},{"line_number":1729,"context_line":"                 or is_sys_meta(\u0027object\u0027, key)"},{"line_number":1730,"context_line":"                 or key.lower() \u003d\u003d \u0027x-object-manifest\u0027])"},{"line_number":1731,"context_line":"            self._metadata.update(self._metafile_metadata)"},{"line_number":1732,"context_line":"            self._metadata.update(sys_metadata)"},{"line_number":1733,"context_line":"            # diskfile writer added \u0027name\u0027 to metafile, so remove it here"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_c4d93985","line":1730,"range":{"start_line":1730,"start_character":53,"end_line":1730,"end_character":56},"updated":"2016-01-11 03:37:01.000000000","message":"it would be bad to add specific headers here.  Diskfile should not have specific logic about DLO headers.  this header is not considered to be sysmeta, and should not be treated as such.","commit_id":"71f78b292fd2caa827fad0298abcce5076836d1f"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b77bdd227c60d6a97e4b60ef08147139280f839f","unresolved":false,"context_lines":[{"line_number":458,"context_line":"    def _preserve_dlo_manifest(self, update_metadata, orig_metadata):"},{"line_number":459,"context_line":"        if \u0027X-Object-Manifest\u0027 in orig_metadata:"},{"line_number":460,"context_line":"            update_metadata[\u0027X-Object-Manifest\u0027] \u003d \\"},{"line_number":461,"context_line":"                orig_metadata[\u0027X-Object-Manifest\u0027] "},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @public"},{"line_number":464,"context_line":"    @timing_stats()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_8012d407","line":461,"updated":"2015-12-07 17:40:42.000000000","message":"training whitespace","commit_id":"76e414c30d7fa42898e418294cf5c09029b76f28"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b77bdd227c60d6a97e4b60ef08147139280f839f","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        self._preserve_slo_manifest(metadata, orig_metadata)"},{"line_number":493,"context_line":"        x_o_m \u003d request.headers.get(\"X-Object-Manifest\")"},{"line_number":494,"context_line":"        if not x_o_m:"},{"line_number":495,"context_line":"            self._preserve_dlo_manifest(metadata, orig_metadata)"},{"line_number":496,"context_line":"        metadata.update(val for val in request.headers.items()"},{"line_number":497,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":498,"context_line":"        headers_to_copy \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_7b0f5d88","line":495,"updated":"2015-12-07 17:40:42.000000000","message":"hmmm, I feel uneasy about this because it amounts to \"if no new manifest header value is provided in the request then take whatever value exists and make it valid *at the new timestamp*\" - how do we know that the current value is indeed the latest value in the system and therefore valid??\n\nConsider:\n\n  replica A has t0.data with X-Object-Manifest\u003dfoo\n  replica B has t0.data with X-Object-Manifest\u003dfoo\n                      t1.meta with X-Object-Manifest\u003dbar\n\nPOST arrives at t2 with no X-Object-Manifest value...\n\n  replica A will have t2.meta X-Object-Manifest\u003dfoo\n  replica B will have t2.meta X-Object-Manifest\u003dbar\n\ni.e. they are inconsistent :(","commit_id":"76e414c30d7fa42898e418294cf5c09029b76f28"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ec2eca7559d1240b3ed278449d9117d141cc0a2","unresolved":false,"context_lines":[{"line_number":489,"context_line":"                request\u003drequest,"},{"line_number":490,"context_line":"                headers\u003d{\u0027X-Backend-Timestamp\u0027: orig_timestamp.internal})"},{"line_number":491,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: req_timestamp.internal}"},{"line_number":492,"context_line":"        self._preserve_slo_manifest(metadata, orig_metadata)"},{"line_number":493,"context_line":"        x_o_m \u003d request.headers.get(\"X-Object-Manifest\")"},{"line_number":494,"context_line":"        if not x_o_m:"},{"line_number":495,"context_line":"            self._preserve_dlo_manifest(metadata, orig_metadata)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_b1cccfbb","line":492,"updated":"2015-12-08 15:10:53.000000000","message":"^^ this is safe because the value of X-Static-Large-Object never changes, we are just making sure it never gets lost during a POST update.","commit_id":"75da0c2c1c8ea8c0233d5c4607b691e4fc1ff078"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ec2eca7559d1240b3ed278449d9117d141cc0a2","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        self._preserve_slo_manifest(metadata, orig_metadata)"},{"line_number":493,"context_line":"        x_o_m \u003d request.headers.get(\"X-Object-Manifest\")"},{"line_number":494,"context_line":"        if not x_o_m:"},{"line_number":495,"context_line":"            self._preserve_dlo_manifest(metadata, orig_metadata)"},{"line_number":496,"context_line":"        metadata.update(val for val in request.headers.items()"},{"line_number":497,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":498,"context_line":"        headers_to_copy \u003d ("}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_91dc3347","line":495,"updated":"2015-12-08 15:10:53.000000000","message":"this is not safe because it assumes that the old value of the X-Object-Manifest is the correct value at the timestamp of the current POST, which as I illustrated in comment on version 7, can lead to inconsistency between replicas.","commit_id":"75da0c2c1c8ea8c0233d5c4607b691e4fc1ff078"}],"test/functional/tests.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ec2eca7559d1240b3ed278449d9117d141cc0a2","unresolved":false,"context_lines":[{"line_number":2389,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2390,"context_line":""},{"line_number":2391,"context_line":"        updated_contents \u003d updated.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2392,"context_line":"        self.assertEqual(orig_contents, updated_contents)"},{"line_number":2393,"context_line":""},{"line_number":2394,"context_line":""},{"line_number":2395,"context_line":"class TestDloUTF8(Base2, TestDlo):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_91e753ab","line":2392,"updated":"2015-12-08 15:10:53.000000000","message":"being a manifest object the body would be empty I think?","commit_id":"75da0c2c1c8ea8c0233d5c4607b691e4fc1ff078"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"abf361d16a5fe1c352eae78920516cad53b3cb11","unresolved":false,"context_lines":[{"line_number":2389,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2390,"context_line":""},{"line_number":2391,"context_line":"        updated_contents \u003d updated.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2392,"context_line":"        self.assertEqual(orig_contents, updated_contents)"},{"line_number":2393,"context_line":""},{"line_number":2394,"context_line":""},{"line_number":2395,"context_line":"class TestDloUTF8(Base2, TestDlo):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_2da030a5","line":2392,"in_reply_to":"7a740942_91e753ab","updated":"2016-01-05 03:59:26.000000000","message":"IIRC, the dlo api allows the user could put contents into the manifest, but in this test it is probably an empty file.  So, you could change it to assert 0 filesize.  I wonder if we do have a test that asserts that we preserve any user contents if they are given?","commit_id":"75da0c2c1c8ea8c0233d5c4607b691e4fc1ff078"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":2428,"context_line":"            contents,"},{"line_number":2429,"context_line":"            \"ffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj\")"},{"line_number":2430,"context_line":""},{"line_number":2431,"context_line":"    def test_dlo_post_the_manifest_metadata_update(self):"},{"line_number":2432,"context_line":"        file_item \u003d self.env.container.file(\u0027man1\u0027)"},{"line_number":2433,"context_line":"        info \u003d file_item.info()"},{"line_number":2434,"context_line":"        orig_contents \u003d file_item.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_f723aaa5","line":2431,"updated":"2016-01-28 12:35:19.000000000","message":"i think this test could be more comprehensive - see my gist","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":2428,"context_line":"            contents,"},{"line_number":2429,"context_line":"            \"ffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj\")"},{"line_number":2430,"context_line":""},{"line_number":2431,"context_line":"    def test_dlo_post_the_manifest_metadata_update(self):"},{"line_number":2432,"context_line":"        file_item \u003d self.env.container.file(\u0027man1\u0027)"},{"line_number":2433,"context_line":"        info \u003d file_item.info()"},{"line_number":2434,"context_line":"        orig_contents \u003d file_item.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_30e13a9b","line":2431,"in_reply_to":"7a5de9d1_f723aaa5","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":2435,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2436,"context_line":"        x_o_m \u003d info[\u0027x_object_manifest\u0027]"},{"line_number":2437,"context_line":""},{"line_number":2438,"context_line":"        print orig_contents"},{"line_number":2439,"context_line":""},{"line_number":2440,"context_line":"        # POST must supply the x-object-manifest"},{"line_number":2441,"context_line":"        # file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027},"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_b408d02e","line":2438,"updated":"2016-01-28 12:35:19.000000000","message":"oops","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":2435,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2436,"context_line":"        x_o_m \u003d info[\u0027x_object_manifest\u0027]"},{"line_number":2437,"context_line":""},{"line_number":2438,"context_line":"        print orig_contents"},{"line_number":2439,"context_line":""},{"line_number":2440,"context_line":"        # POST must supply the x-object-manifest"},{"line_number":2441,"context_line":"        # file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027},"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_b0ebea77","line":2438,"in_reply_to":"7a5de9d1_b408d02e","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":2439,"context_line":""},{"line_number":2440,"context_line":"        # POST must supply the x-object-manifest"},{"line_number":2441,"context_line":"        # file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027},"},{"line_number":2442,"context_line":"        #                parms\u003d{})"},{"line_number":2443,"context_line":"        file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027})"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        updated \u003d self.env.container.file(\"man1\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_d709ce2d","line":2442,"updated":"2016-01-28 12:35:19.000000000","message":"remove commented code","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":2439,"context_line":""},{"line_number":2440,"context_line":"        # POST must supply the x-object-manifest"},{"line_number":2441,"context_line":"        # file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027},"},{"line_number":2442,"context_line":"        #                parms\u003d{})"},{"line_number":2443,"context_line":"        file_item.post({\u0027x-object-manifest\u0027: x_o_m, \u0027post\u0027: \u0027update\u0027})"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        updated \u003d self.env.container.file(\"man1\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_30f85a49","line":2442,"in_reply_to":"7a5de9d1_d709ce2d","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6228d7d7442675cf05329000bdfc9065a75ad815","unresolved":false,"context_lines":[{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        updated \u003d self.env.container.file(\"man1\")"},{"line_number":2446,"context_line":"        info \u003d updated.info()"},{"line_number":2447,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"        updated_contents \u003d updated.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2450,"context_line":"        self.assertEqual(orig_contents, updated_contents)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_f75aca29","line":2447,"updated":"2016-01-28 12:35:19.000000000","message":"ok but did it updated by the POST or just retain existing value?","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"020291aa0eeb7ad18953028fbe02cdf484916e8e","unresolved":false,"context_lines":[{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        updated \u003d self.env.container.file(\"man1\")"},{"line_number":2446,"context_line":"        info \u003d updated.info()"},{"line_number":2447,"context_line":"        self.assertIn(\u0027x_object_manifest\u0027, info)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"        updated_contents \u003d updated.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2450,"context_line":"        self.assertEqual(orig_contents, updated_contents)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_10943ee0","line":2447,"in_reply_to":"7a5de9d1_f75aca29","updated":"2016-01-28 17:11:04.000000000","message":"Done","commit_id":"3d85cb263bcc9db4a7f1a6b538057b8a7645ece3"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"abf361d16a5fe1c352eae78920516cad53b3cb11","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        self.assertTrue(\"X-Object-Meta-1\" not in resp.headers and"},{"line_number":285,"context_line":"                        \"Foo\" not in resp.headers and"},{"line_number":286,"context_line":"                        \"Content-Encoding\" not in resp.headers and"},{"line_number":287,"context_line":"                        \"X-Object-Manifest\" in resp.headers and"},{"line_number":288,"context_line":"                        \"Content-Disposition\" not in resp.headers and"},{"line_number":289,"context_line":"                        \"X-Object-Meta-3\" in resp.headers and"},{"line_number":290,"context_line":"                        \"X-Static-Large-Object\" in resp.headers)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a740942_4d8c9c35","line":287,"updated":"2016-01-05 03:59:26.000000000","message":"I think it is strange that it was asserted that the manifest was not preserved, and that now that has changed.  Isn\u0027t this an SLO case?  I didn\u0027t think SLO would be affected from the changes here.","commit_id":"75da0c2c1c8ea8c0233d5c4607b691e4fc1ff078"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"bdbac50fda39cd34758c503599b366746fa12cd0","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        self.assertTrue(\"X-Object-Meta-1\" not in resp.headers and"},{"line_number":285,"context_line":"                        \"Foo\" not in resp.headers and"},{"line_number":286,"context_line":"                        \"Content-Encoding\" not in resp.headers and"},{"line_number":287,"context_line":"                        \"X-Object-Manifest\" in resp.headers and"},{"line_number":288,"context_line":"                        \"Content-Disposition\" not in resp.headers and"},{"line_number":289,"context_line":"                        \"X-Object-Meta-3\" in resp.headers and"},{"line_number":290,"context_line":"                        \"X-Static-Large-Object\" in resp.headers)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_7c43d313","line":287,"range":{"start_line":287,"start_character":60,"end_line":287,"end_character":63},"updated":"2016-01-11 03:37:01.000000000","message":"again, I am bothered by the fact that this has changed for an SLO.  I don\u0027t think this assertion should need to be modified.  unless I am missing something ...","commit_id":"71f78b292fd2caa827fad0298abcce5076836d1f"}]}
