)]}'
{"doc/source/overview_container_sync.rst":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    In the case of :ref:`Static Large Objects \u003cstatic-large-objects\u003e`, a GET"},{"line_number":29,"context_line":"    request for a manifest whose segments have yet to be completely synced will"},{"line_number":30,"context_line":"    fail with none or only part of the large object content being returned."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    In the case of :ref:`Dynamic Large Objects \u003cdynamic-large-objects\u003e`, a GET"},{"line_number":33,"context_line":"    request for a manifest whose segments have yet to be completely synced will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a89bdaa_249d6e66","line":30,"updated":"2016-09-12 20:15:27.000000000","message":"this is unfortunate, but probably acceptable","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    In the case of :ref:`Dynamic Large Objects \u003cdynamic-large-objects\u003e`, a GET"},{"line_number":33,"context_line":"    request for a manifest whose segments have yet to be completely synced will"},{"line_number":34,"context_line":"    either fail or return unexpected (and most likely incorrect) content."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":".. note::"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a89bdaa_a4a89e8d","line":34,"updated":"2016-09-12 20:15:27.000000000","message":"this is probably un-avoidable","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"swift/common/middleware/container_sync.py":[{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"03c533ebf2ea2a7ee965aa0a6ade54be0e3871f8","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                raise exc"},{"line_number":131,"context_line":"            else:"},{"line_number":132,"context_line":"                req.environ[\u0027swift.authorize_override\u0027] \u003d True"},{"line_number":133,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":136,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_47530717","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":56},"updated":"2016-09-08 11:16:21.000000000","message":"Can you add a comment to explain the purpose? Something such as:\n\n   # An SLO manifest might be synced before its segments. Stop SLO\n   # middleware from performing the usual manifest validation.","commit_id":"6f987f4c65cfa1b11a4c16a3f5f4b4696afe56df"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d1c72fb7d668a6efc4727f1a2ea781951a93f17","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                raise exc"},{"line_number":131,"context_line":"            else:"},{"line_number":132,"context_line":"                req.environ[\u0027swift.authorize_override\u0027] \u003d True"},{"line_number":133,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":136,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_6a5439c9","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":56},"in_reply_to":"9a89bdaa_47530717","updated":"2016-09-08 16:48:33.000000000","message":"Done, good suggestion","commit_id":"6f987f4c65cfa1b11a4c16a3f5f4b4696afe56df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                # An SLO manifest will already be in the internal manifest"},{"line_number":134,"context_line":"                # syntax and might be synced before its segments, so stop SLO"},{"line_number":135,"context_line":"                # middleware from performing the usual manifest validation."},{"line_number":136,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":139,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_a2dfb338","line":136,"updated":"2016-09-12 20:15:27.000000000","message":"maybe it would make more sense to set source to indicate container-sync somehow and let middleware\u0027s opt-in (or make configurable) their behavior when the source is container sync?","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"53ef39ed14cdd8ec26a3c00ea54f491e573091d2","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                # An SLO manifest will already be in the internal manifest"},{"line_number":134,"context_line":"                # syntax and might be synced before its segments, so stop SLO"},{"line_number":135,"context_line":"                # middleware from performing the usual manifest validation."},{"line_number":136,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":139,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_6bcb0954","line":136,"in_reply_to":"7a8ec9b2_b181264d","updated":"2016-09-14 17:38:48.000000000","message":"I think the common pattern will eventually be \"I am container sync - I have no idea what *any* of this means - here is the raw object I have represented with sysmeta and everything else - please if you trust me - will you put this as unmolested as possible into this location (feel free to perform any validation you must; perhaps I\u0027ll learn how to deal with your rejection someday)?\"\n\nauthorize_override says \"I have *done* authorization - if you try to authorize this request you will fail and actively circumvent the work I just did\" - makes sense\n\nslo_override says \"I have not done anything helpful (maybe someone else did one time in the past; who knows); but if *you* try now things break horribly; so it\u0027s best to not try - *trust* me - because of coupling in the system and a long series of previous (and/or future events) this will work out to be what we want (and maybe even what the user wants!?)\" - not great\n\nSo validation override might work... as long as we remember when we write middlewares like symlinks we\u0027ll remember to ask - \"hey what about when a request comes in with that `dumb_raw_object_from_dumb_container_sync` flag like we have in all the other middlewares that manage wrapping semantic value around on-disk format-y stuff?","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"e7d10572db654d5c25cab587d203ac04553c9012","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                # An SLO manifest will already be in the internal manifest"},{"line_number":134,"context_line":"                # syntax and might be synced before its segments, so stop SLO"},{"line_number":135,"context_line":"                # middleware from performing the usual manifest validation."},{"line_number":136,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":139,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_adcbf1a2","line":136,"in_reply_to":"9a89bdaa_a2dfb338","updated":"2016-09-13 14:46:17.000000000","message":"That\u0027s the way to go if we think there might be another middleware that has similar problem as SLO. However, that feels like feature-creep, so I\u0027m happy as-is -- the comment tells us what\u0027s going on.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2d81d9e6366814121eaf7ec34e5ce7cb9f7d9ff","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                # An SLO manifest will already be in the internal manifest"},{"line_number":134,"context_line":"                # syntax and might be synced before its segments, so stop SLO"},{"line_number":135,"context_line":"                # middleware from performing the usual manifest validation."},{"line_number":136,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":139,"context_line":"            # Ensure /info requests get the freshest results"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_b181264d","line":136,"in_reply_to":"9a89bdaa_adcbf1a2","updated":"2016-09-14 14:53:02.000000000","message":"Interesting thought. I\u0027m not totally against Clay\u0027s idea, however on balance I feel its a better model to have container-sync know what container-sync needs to happen (albeit with some knowledge of SLO leaking into container sync), rather than have SLO know what container sync needs. \n\nI also like the similarity with authorize_override*...we could equally have middlewares set some request source indicator and have auth short-circuit itself based on the request source, but that is not the existing pattern.\n\nWe could make the name of the env variable less specific e.g. swift.validation_override with the meaning that any middleware that would otherwise perform some validation of the request data and/or metadata should not??? That avoids the knowledge of SLO, specifically, leaking into container-sync.\n\nWith the two actors here (container sync and SLO) both being proxy middleware, it seems that this pattern could be changed later, if we decide there is a better way, with little disruption.\n\n(* acknowledging that existence of a pattern is not always proof of goodness)","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        WSGI entry point"},{"line_number":1043,"context_line":"        \"\"\""},{"line_number":1044,"context_line":"        if env.get(\u0027swift.slo_override\u0027):"},{"line_number":1045,"context_line":"            return self.app(env, start_response)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        req \u003d Request(env)"},{"line_number":1048,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_a25a53f0","line":1045,"updated":"2016-09-12 20:15:27.000000000","message":"I think this highlights that a bunch of slo semantics are bleeding out of this middleware - which may not be desirable.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"53ef39ed14cdd8ec26a3c00ea54f491e573091d2","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        WSGI entry point"},{"line_number":1043,"context_line":"        \"\"\""},{"line_number":1044,"context_line":"        if env.get(\u0027swift.slo_override\u0027):"},{"line_number":1045,"context_line":"            return self.app(env, start_response)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        req \u003d Request(env)"},{"line_number":1048,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_ebbc796e","line":1045,"in_reply_to":"7a8ec9b2_b1b046f6","updated":"2016-09-14 17:38:48.000000000","message":"Separate service endpoint would only work in the general sense if didn\u0027t have a gatekeeper - and it\u0027s not a terrible idea.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2d81d9e6366814121eaf7ec34e5ce7cb9f7d9ff","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        WSGI entry point"},{"line_number":1043,"context_line":"        \"\"\""},{"line_number":1044,"context_line":"        if env.get(\u0027swift.slo_override\u0027):"},{"line_number":1045,"context_line":"            return self.app(env, start_response)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        req \u003d Request(env)"},{"line_number":1048,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_b1b046f6","line":1045,"in_reply_to":"9a89bdaa_a25a53f0","updated":"2016-09-14 14:53:02.000000000","message":"I see your point. But as discussed here [1] the alternative seems to be for the requirements of other middlewares to bleed into SLO. IDK, I acknowledge that this is not pretty, am I missing a better way?\n\nPerhaps the \"purest way\" would be to require a separate endpoint for container sync which reaches a proxy server that does not have SLO installed. So ops just configure their way around this problem.\n\n[1] https://review.openstack.org/#/c/348495/5/swift/common/middleware/container_sync.py@136","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"swift/container/sync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                    if \u0027x-static-large-object\u0027 in headers:"},{"line_number":600,"context_line":"                        # the etag of an slo manifest is not the md5 of its"},{"line_number":601,"context_line":"                        # content so would cause a 422 if included with the PUT"},{"line_number":602,"context_line":"                        del headers[\u0027etag\u0027]"},{"line_number":603,"context_line":"                    else:"},{"line_number":604,"context_line":"                        headers[\u0027etag\u0027] \u003d headers[\u0027etag\u0027].strip(\u0027\"\u0027)"},{"line_number":605,"context_line":"                if \u0027content-type\u0027 in headers:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_62184bd4","line":602,"updated":"2016-09-12 20:15:27.000000000","message":"if we retrieve it with multipart-manifest\u003dget the etag *is* the (unquoted) etag of the json object?","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"e69a5bd79871930696f2843fa0063ea638ef86a8","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                    if \u0027x-static-large-object\u0027 in headers:"},{"line_number":600,"context_line":"                        # the etag of an slo manifest is not the md5 of its"},{"line_number":601,"context_line":"                        # content so would cause a 422 if included with the PUT"},{"line_number":602,"context_line":"                        del headers[\u0027etag\u0027]"},{"line_number":603,"context_line":"                    else:"},{"line_number":604,"context_line":"                        headers[\u0027etag\u0027] \u003d headers[\u0027etag\u0027].strip(\u0027\"\u0027)"},{"line_number":605,"context_line":"                if \u0027content-type\u0027 in headers:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_904faf91","line":602,"in_reply_to":"7a8ec9b2_905edae7","updated":"2016-09-14 15:09:14.000000000","message":"update: I tested leaving etag as-is, and it *did* sync SLO manifests","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ee61f8932f5aabd83fe0c5e36a9fa1c31cee3290","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                    if \u0027x-static-large-object\u0027 in headers:"},{"line_number":600,"context_line":"                        # the etag of an slo manifest is not the md5 of its"},{"line_number":601,"context_line":"                        # content so would cause a 422 if included with the PUT"},{"line_number":602,"context_line":"                        del headers[\u0027etag\u0027]"},{"line_number":603,"context_line":"                    else:"},{"line_number":604,"context_line":"                        headers[\u0027etag\u0027] \u003d headers[\u0027etag\u0027].strip(\u0027\"\u0027)"},{"line_number":605,"context_line":"                if \u0027content-type\u0027 in headers:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_cd54deff","line":602,"in_reply_to":"9a89bdaa_62184bd4","updated":"2016-09-13 00:01:25.000000000","message":"AIUI this is actively harmful","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2d81d9e6366814121eaf7ec34e5ce7cb9f7d9ff","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                    if \u0027x-static-large-object\u0027 in headers:"},{"line_number":600,"context_line":"                        # the etag of an slo manifest is not the md5 of its"},{"line_number":601,"context_line":"                        # content so would cause a 422 if included with the PUT"},{"line_number":602,"context_line":"                        del headers[\u0027etag\u0027]"},{"line_number":603,"context_line":"                    else:"},{"line_number":604,"context_line":"                        headers[\u0027etag\u0027] \u003d headers[\u0027etag\u0027].strip(\u0027\"\u0027)"},{"line_number":605,"context_line":"                if \u0027content-type\u0027 in headers:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_905edae7","line":602,"in_reply_to":"9a89bdaa_732d43fd","updated":"2016-09-14 14:53:02.000000000","message":"my bad. I got confused - at one point I was trying to send the manifest in raw format and the ETag in the PUT caused the receiver to barf because the receiver SLO translates the raw format manifest into internal format, and the md5 of *that* does not match the ETag that was sent.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"5d4afbfd3a9efc4a0ff6d9da4db7e9b12470d57d","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                    if \u0027x-static-large-object\u0027 in headers:"},{"line_number":600,"context_line":"                        # the etag of an slo manifest is not the md5 of its"},{"line_number":601,"context_line":"                        # content so would cause a 422 if included with the PUT"},{"line_number":602,"context_line":"                        del headers[\u0027etag\u0027]"},{"line_number":603,"context_line":"                    else:"},{"line_number":604,"context_line":"                        headers[\u0027etag\u0027] \u003d headers[\u0027etag\u0027].strip(\u0027\"\u0027)"},{"line_number":605,"context_line":"                if \u0027content-type\u0027 in headers:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_732d43fd","line":602,"in_reply_to":"9a89bdaa_cd54deff","updated":"2016-09-13 15:33:26.000000000","message":"I think the comment/premise is wrong (that etag is not the etag of the manifest) -- the ETag at this point is whatever diskfile has, and since we bypass SLO at the other end, it becomes pretty much a PUT directly to disk file. So if I\u0027m right, there is no need to delete the ETag. Need to test this.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"test/probe/common.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                \u0027test2:tester2\u0027, \u0027testing2\u0027)"},{"line_number":370,"context_line":"            self.account_2 \u003d {"},{"line_number":371,"context_line":"                \u0027url\u0027: url2, \u0027token\u0027: token2, \u0027account\u0027: url2.split(\u0027/\u0027)[-1]}"},{"line_number":372,"context_line":"            head_account(url2, token2)  # sanity check"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"            self.replicators \u003d Manager("},{"line_number":375,"context_line":"                [\u0027account-replicator\u0027, \u0027container-replicator\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_c18594cf","line":372,"updated":"2016-09-12 20:15:27.000000000","message":"this could use some refactoring, follow up obviously:\n\nhttps://gist.github.com/clayg/5cfbce5b6831cf5b1ed1a8a34f1a4c29","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2d81d9e6366814121eaf7ec34e5ce7cb9f7d9ff","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                \u0027test2:tester2\u0027, \u0027testing2\u0027)"},{"line_number":370,"context_line":"            self.account_2 \u003d {"},{"line_number":371,"context_line":"                \u0027url\u0027: url2, \u0027token\u0027: token2, \u0027account\u0027: url2.split(\u0027/\u0027)[-1]}"},{"line_number":372,"context_line":"            head_account(url2, token2)  # sanity check"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"            self.replicators \u003d Manager("},{"line_number":375,"context_line":"                [\u0027account-replicator\u0027, \u0027container-replicator\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_3cd96d22","line":372,"in_reply_to":"9a89bdaa_c18594cf","updated":"2016-09-14 14:53:02.000000000","message":"nice follow up","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"test/probe/test_container_sync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9976f5bc18c4e6e1288c1b0d63d8f715f930518a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":224,"context_line":"            client.get_object(dest_account[\u0027url\u0027], dest_account[\u0027token\u0027],"},{"line_number":225,"context_line":"                              dest_container, manifest_name)"},{"line_number":226,"context_line":"        self.assertEqual(409, cm.exception.http_status)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # now set sync key on destination segments container"},{"line_number":229,"context_line":"        client.put_container("}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_225003d4","line":226,"updated":"2016-09-12 20:15:27.000000000","message":"maybe this is a reasonable failure mode until the manifest is synced, although unless the 409 pre-existed it seems to hi-jack the if-match semantics in a not helpful way","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"53ef39ed14cdd8ec26a3c00ea54f491e573091d2","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":224,"context_line":"            client.get_object(dest_account[\u0027url\u0027], dest_account[\u0027token\u0027],"},{"line_number":225,"context_line":"                              dest_container, manifest_name)"},{"line_number":226,"context_line":"        self.assertEqual(409, cm.exception.http_status)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # now set sync key on destination segments container"},{"line_number":229,"context_line":"        client.put_container("}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_101c7476","line":226,"in_reply_to":"7a8ec9b2_b73af634","updated":"2016-09-14 17:38:48.000000000","message":"sorry, left over comment/note-to-self to do more research - which I have done and there is no concern.  Sorry for wasting your brain cells.","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2d81d9e6366814121eaf7ec34e5ce7cb9f7d9ff","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":224,"context_line":"            client.get_object(dest_account[\u0027url\u0027], dest_account[\u0027token\u0027],"},{"line_number":225,"context_line":"                              dest_container, manifest_name)"},{"line_number":226,"context_line":"        self.assertEqual(409, cm.exception.http_status)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # now set sync key on destination segments container"},{"line_number":229,"context_line":"        client.put_container("}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_b73af634","line":226,"in_reply_to":"9a89bdaa_225003d4","updated":"2016-09-14 14:53:02.000000000","message":"I need to clarify your concern ... here the manifest has synced, SLO returns 409 because the first segment has not synced and cannot be validated...is your comment about whether 409 is a good response status from SLO in that scenario. (AIUI if the first segment had synced but later segments had not, client gets 200 plus first segment then a disconnect, so in the case we have here should SLO return 200 but no data???)","commit_id":"6067a740ac1d0fc823a3fff6ff7aae110d4148a2"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8cec3704fc3af9d86497aec7ce68ce4bb5236560","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_slo_env_override(self):"},{"line_number":124,"context_line":"        req \u003d Request.blank("},{"line_number":125,"context_line":"            \u0027/\u0027, headers\u003d{\u0027x-static-large-object\u0027: \"true\"},"},{"line_number":126,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027, \u0027swift.slo_override\u0027: True})"},{"line_number":127,"context_line":"        resp_iter \u003d self.slo(req.environ, fake_start_response)"},{"line_number":128,"context_line":"        self.assertEqual(self.app.calls, [(\u0027PUT\u0027, \u0027/\u0027)])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_69946536","line":125,"updated":"2016-08-05 15:50:31.000000000","message":"with a path of \u0027/\u0027 SLO is always bypassed - need to use an object path e.g. \u0027/v1/a/c/o\u0027","commit_id":"0d6f7964824d3d1c3858ab86a2b531c95ee3185c"}],"test/unit/container/test_sync.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8cec3704fc3af9d86497aec7ce68ce4bb5236560","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"            expected_put_count +\u003d 1"},{"line_number":1042,"context_line":"            self.assertEqual(cs.container_puts, expected_put_count)"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"            def fake_put_object(sync_to, name\u003dNone, headers\u003dNone,"},{"line_number":1045,"context_line":"                                contents\u003dNone, proxy\u003dNone, logger\u003dNone,"},{"line_number":1046,"context_line":"                                timeout\u003dNone):"},{"line_number":1047,"context_line":"                self.assertEqual(sync_to, \u0027http://sync/to/path\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_67b8092b","line":1044,"updated":"2016-08-05 15:50:31.000000000","message":"It would be nice to (a) re-use the put_object we already have and (b) not make assertions dep down in the code under test but stash the args and check after the code under test has completed.","commit_id":"0d6f7964824d3d1c3858ab86a2b531c95ee3185c"}]}
