)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8a4ff0f58f3fa49a4c5b0eb9a7e0e8c255392268","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"6f8e199d_5ee6e0c0","updated":"2024-11-12 19:12:29.000000000","message":"recheck\n\nProbe test hang in relinker.","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"adf50aeaaf155b8be17dbe794607f426e175eb07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"636e2395_97dfdd8e","updated":"2024-11-13 10:01:41.000000000","message":"I\u0027ve skipped the mpu probe tests with this patchset in an attempt to see if that affects the probe tests hanging","commit_id":"f38af05239f8435affd89202758afed50ff3563e"}],"swift/common/middleware/mpu.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":233,"context_line":"    The \u0027aborted\u0027 state is tentative. A client abortUpload request may cause a"},{"line_number":234,"context_line":"    session to transition from \u0027completing\u0027 to \u0027aborted\u0027 while a concurrent"},{"line_number":235,"context_line":"    completeUpload is being handled, and the completeUpload will typically"},{"line_number":236,"context_line":"    continue to succeed. Furthermore, concurrent requests may result in a"},{"line_number":237,"context_line":"    session transitioning from \u0027completed\u0027 to \u0027aborted\u0027. The mpu-auditor is"},{"line_number":238,"context_line":"    responsible for resolving any ambiguity."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    :param name: the name of the session object."}],"source_content_type":"text/x-python","patch_set":18,"id":"182c50b6_10fc6217","line":237,"range":{"start_line":236,"start_character":25,"end_line":237,"end_character":56},"updated":"2024-11-12 20:09:19.000000000","message":"But the MPU is in fact completed and we\u0027re not going to futz with the user-facing namespace at all in this case, right?","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":233,"context_line":"    The \u0027aborted\u0027 state is tentative. A client abortUpload request may cause a"},{"line_number":234,"context_line":"    session to transition from \u0027completing\u0027 to \u0027aborted\u0027 while a concurrent"},{"line_number":235,"context_line":"    completeUpload is being handled, and the completeUpload will typically"},{"line_number":236,"context_line":"    continue to succeed. Furthermore, concurrent requests may result in a"},{"line_number":237,"context_line":"    session transitioning from \u0027completed\u0027 to \u0027aborted\u0027. The mpu-auditor is"},{"line_number":238,"context_line":"    responsible for resolving any ambiguity."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    :param name: the name of the session object."}],"source_content_type":"text/x-python","patch_set":18,"id":"db4d0d60_f36a54c8","line":237,"range":{"start_line":236,"start_character":25,"end_line":237,"end_character":56},"in_reply_to":"09494774_a810313e","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":233,"context_line":"    The \u0027aborted\u0027 state is tentative. A client abortUpload request may cause a"},{"line_number":234,"context_line":"    session to transition from \u0027completing\u0027 to \u0027aborted\u0027 while a concurrent"},{"line_number":235,"context_line":"    completeUpload is being handled, and the completeUpload will typically"},{"line_number":236,"context_line":"    continue to succeed. Furthermore, concurrent requests may result in a"},{"line_number":237,"context_line":"    session transitioning from \u0027completed\u0027 to \u0027aborted\u0027. The mpu-auditor is"},{"line_number":238,"context_line":"    responsible for resolving any ambiguity."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    :param name: the name of the session object."}],"source_content_type":"text/x-python","patch_set":18,"id":"09494774_a810313e","line":237,"range":{"start_line":236,"start_character":25,"end_line":237,"end_character":56},"in_reply_to":"182c50b6_10fc6217","updated":"2024-11-13 09:59:54.000000000","message":"Correct. Will add text to emphasize that.\n\nThe session state acts as a hint to the auditor; in the aborted state the auditor must check if the user namespace object was in fact created and if so leave it alone.","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":312,"context_line":"        # complete fails the user should still be able to upload and list parts"},{"line_number":313,"context_line":"        # because it is possible that a missing part caused the complete to"},{"line_number":314,"context_line":"        # fail."},{"line_number":315,"context_line":"        return not (self.is_completed or self.is_aborted)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @property"},{"line_number":318,"context_line":"    def is_aborted(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f84769f_0a8301e9","line":315,"range":{"start_line":315,"start_character":25,"end_line":315,"end_character":37},"updated":"2024-11-12 20:09:19.000000000","message":"`is_completed`, or `is_completing`?","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":312,"context_line":"        # complete fails the user should still be able to upload and list parts"},{"line_number":313,"context_line":"        # because it is possible that a missing part caused the complete to"},{"line_number":314,"context_line":"        # fail."},{"line_number":315,"context_line":"        return not (self.is_completed or self.is_aborted)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @property"},{"line_number":318,"context_line":"    def is_aborted(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"c328a578_7a4cd899","line":315,"range":{"start_line":315,"start_character":25,"end_line":315,"end_character":37},"in_reply_to":"3f84769f_0a8301e9","updated":"2024-11-13 09:59:54.000000000","message":"is_completing is treated as active because we don\u0027t know that the completeUpload succeeded, so it must be possible to continue to uploadPart and retry the completeUpload while state is \u0027completing\u0027","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        # complete fails the user should still be able to upload and list parts"},{"line_number":313,"context_line":"        # because it is possible that a missing part caused the complete to"},{"line_number":314,"context_line":"        # fail."},{"line_number":315,"context_line":"        return not (self.is_completed or self.is_aborted)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @property"},{"line_number":318,"context_line":"    def is_aborted(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"19d50219_59bc3f7f","line":315,"range":{"start_line":315,"start_character":25,"end_line":315,"end_character":37},"in_reply_to":"c328a578_7a4cd899","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        listing \u003d []"},{"line_number":502,"context_line":"        while True:"},{"line_number":503,"context_line":"            # sessions that are aborted or completed are dropped from the"},{"line_number":504,"context_line":"            # backend listing, so we may need more than one listing to reach"},{"line_number":505,"context_line":"            # the desired limit"},{"line_number":506,"context_line":"            sub_req \u003d self.make_subrequest("},{"line_number":507,"context_line":"                path\u003dpath, method\u003d\u0027GET\u0027, params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":18,"id":"79bb3751_f671e363","line":504,"range":{"start_line":503,"start_character":14,"end_line":504,"end_character":29},"updated":"2024-11-12 20:09:19.000000000","message":"Pretty sure this should either read\n\n\u003e sessions that are aborted or completed are **not** dropped from the backend listing\n\nor\n\n\u003e sessions that are aborted or completed are dropped from the **client** listing","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        listing \u003d []"},{"line_number":502,"context_line":"        while True:"},{"line_number":503,"context_line":"            # sessions that are aborted or completed are dropped from the"},{"line_number":504,"context_line":"            # backend listing, so we may need more than one listing to reach"},{"line_number":505,"context_line":"            # the desired limit"},{"line_number":506,"context_line":"            sub_req \u003d self.make_subrequest("},{"line_number":507,"context_line":"                path\u003dpath, method\u003d\u0027GET\u0027, params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da988699_0c40b1aa","line":504,"range":{"start_line":503,"start_character":14,"end_line":504,"end_character":29},"in_reply_to":"79bb3751_f671e363","updated":"2024-11-13 09:59:54.000000000","message":"ah, ambiguous sentence structure! they are included in the listing received from the backend but then dropped from it. Will clarify.","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        listing \u003d []"},{"line_number":502,"context_line":"        while True:"},{"line_number":503,"context_line":"            # sessions that are aborted or completed are dropped from the"},{"line_number":504,"context_line":"            # backend listing, so we may need more than one listing to reach"},{"line_number":505,"context_line":"            # the desired limit"},{"line_number":506,"context_line":"            sub_req \u003d self.make_subrequest("},{"line_number":507,"context_line":"                path\u003dpath, method\u003d\u0027GET\u0027, params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bfe6b13c_a1c2dbbf","line":504,"range":{"start_line":503,"start_character":14,"end_line":504,"end_character":29},"in_reply_to":"da988699_0c40b1aa","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":516,"context_line":"                        continue"},{"line_number":517,"context_line":"                    item[\u0027name\u0027] \u003d split_reserved_name(item[\u0027name\u0027])[0]"},{"line_number":518,"context_line":"                    listing.append(item)"},{"line_number":519,"context_line":"                    if len(listing) \u003e\u003d limit:"},{"line_number":520,"context_line":"                        break"},{"line_number":521,"context_line":"                else:"},{"line_number":522,"context_line":"                    if items:"},{"line_number":523,"context_line":"                        continue"},{"line_number":524,"context_line":"                break"},{"line_number":525,"context_line":"            else:"},{"line_number":526,"context_line":"                return resp"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"49d265dc_88b5317d","line":524,"range":{"start_line":519,"start_character":0,"end_line":524,"end_character":21},"updated":"2024-11-12 20:09:19.000000000","message":"I think I grok what\u0027s going on here, but it\u0027s not easy.\n\nMaybe we add some new `need_another_request` var? Start it as `True` outside the loop, change to `while need_another_request:`, then end the loop with\n```\nneed_another_request \u003d items and (len(listing) \u003c limit)\n```\n\nOr go a step further:\n```\nitems \u003d [None]  # dummy value to get us into the loop\nwhile items and (len(listing) \u003c limit):\n    sub_req \u003d ...\n    resp \u003d ...\n    if not resp.is_success:\n        return resp\n    items \u003d json.loads(resp.body)\n    ...\n```","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":516,"context_line":"                        continue"},{"line_number":517,"context_line":"                    item[\u0027name\u0027] \u003d split_reserved_name(item[\u0027name\u0027])[0]"},{"line_number":518,"context_line":"                    listing.append(item)"},{"line_number":519,"context_line":"                    if len(listing) \u003e\u003d limit:"},{"line_number":520,"context_line":"                        break"},{"line_number":521,"context_line":"                else:"},{"line_number":522,"context_line":"                    if items:"},{"line_number":523,"context_line":"                        continue"},{"line_number":524,"context_line":"                break"},{"line_number":525,"context_line":"            else:"},{"line_number":526,"context_line":"                return resp"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"c15d3add_0c945db0","line":524,"range":{"start_line":519,"start_character":0,"end_line":524,"end_character":21},"in_reply_to":"49d265dc_88b5317d","updated":"2024-11-13 09:59:54.000000000","message":"fair enough, it\u0027s correct but hard to grok. Thanks for the suggestion.\n\nI feel like (a) there must be multiple places in swift where we do a very similar filtered iteration and (b) there\u0027s a keyword missing from the language for breaking out of nested loops, like ``escape`` 😊","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"                        continue"},{"line_number":517,"context_line":"                    item[\u0027name\u0027] \u003d split_reserved_name(item[\u0027name\u0027])[0]"},{"line_number":518,"context_line":"                    listing.append(item)"},{"line_number":519,"context_line":"                    if len(listing) \u003e\u003d limit:"},{"line_number":520,"context_line":"                        break"},{"line_number":521,"context_line":"                else:"},{"line_number":522,"context_line":"                    if items:"},{"line_number":523,"context_line":"                        continue"},{"line_number":524,"context_line":"                break"},{"line_number":525,"context_line":"            else:"},{"line_number":526,"context_line":"                return resp"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"4f334de5_90c27bdf","line":524,"range":{"start_line":519,"start_character":0,"end_line":524,"end_character":21},"in_reply_to":"c15d3add_0c945db0","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":651,"context_line":"            path\u003dself.session_path,"},{"line_number":652,"context_line":"            headers\u003dself.session.get_post_headers())"},{"line_number":653,"context_line":"        session_resp \u003d session_req.get_response(self.app)"},{"line_number":654,"context_line":"        drain_and_close(session_resp)"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def _get_user_object_metadata(self):"},{"line_number":657,"context_line":"        req \u003d self.make_subrequest(method\u003d\u0027HEAD\u0027, path\u003dself.req.path)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9d375129_7c061e0e","line":654,"updated":"2024-11-12 20:09:19.000000000","message":"Just fire and forget? What if there was some 503 or something? Suppose nothing ever made it to any disk -- how does that mess with the assumptions for our state machine?","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":651,"context_line":"            path\u003dself.session_path,"},{"line_number":652,"context_line":"            headers\u003dself.session.get_post_headers())"},{"line_number":653,"context_line":"        session_resp \u003d session_req.get_response(self.app)"},{"line_number":654,"context_line":"        drain_and_close(session_resp)"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def _get_user_object_metadata(self):"},{"line_number":657,"context_line":"        req \u003d self.make_subrequest(method\u003d\u0027HEAD\u0027, path\u003dself.req.path)"}],"source_content_type":"text/x-python","patch_set":18,"id":"b12466f7_a6a76480","line":654,"in_reply_to":"9d375129_7c061e0e","updated":"2024-11-13 09:59:54.000000000","message":"oops, I should have retained the TODO - we DO need to let the client know if an abortUpload didn\u0027t get recorded. Similarly we DO need completing state to be recorded - otherwise the auditor won\u0027t check to see if the complete ever succeeded in writing a symlink.","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":651,"context_line":"            path\u003dself.session_path,"},{"line_number":652,"context_line":"            headers\u003dself.session.get_post_headers())"},{"line_number":653,"context_line":"        session_resp \u003d session_req.get_response(self.app)"},{"line_number":654,"context_line":"        drain_and_close(session_resp)"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def _get_user_object_metadata(self):"},{"line_number":657,"context_line":"        req \u003d self.make_subrequest(method\u003d\u0027HEAD\u0027, path\u003dself.req.path)"}],"source_content_type":"text/x-python","patch_set":18,"id":"a6a787ed_6b0ccfbf","line":654,"in_reply_to":"b12466f7_a6a76480","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":762,"context_line":"        # MPU resources while handling an aborted session."},{"line_number":763,"context_line":"        self.session.set_aborted(self.req.timestamp)"},{"line_number":764,"context_line":"        self._post_session()"},{"line_number":765,"context_line":"        # TODO: check _post_session response"},{"line_number":766,"context_line":"        return HTTPNoContent()"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def _parse_part_number(self, part_dict, previous_part):"}],"source_content_type":"text/x-python","patch_set":18,"id":"67f060eb_b5e8fb84","line":765,"updated":"2024-11-12 20:09:19.000000000","message":"Oh, I see -- the `TODO`s moved to the callers. Shouldn\u0027t `_post_response` return something then for the callers to check?","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":762,"context_line":"        # MPU resources while handling an aborted session."},{"line_number":763,"context_line":"        self.session.set_aborted(self.req.timestamp)"},{"line_number":764,"context_line":"        self._post_session()"},{"line_number":765,"context_line":"        # TODO: check _post_session response"},{"line_number":766,"context_line":"        return HTTPNoContent()"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def _parse_part_number(self, part_dict, previous_part):"}],"source_content_type":"text/x-python","patch_set":18,"id":"de31e042_eb8475f1","line":765,"in_reply_to":"67f060eb_b5e8fb84","updated":"2024-11-13 09:59:54.000000000","message":"I\u0027m returning the TODO to the method","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        # MPU resources while handling an aborted session."},{"line_number":763,"context_line":"        self.session.set_aborted(self.req.timestamp)"},{"line_number":764,"context_line":"        self._post_session()"},{"line_number":765,"context_line":"        # TODO: check _post_session response"},{"line_number":766,"context_line":"        return HTTPNoContent()"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def _parse_part_number(self, part_dict, previous_part):"}],"source_content_type":"text/x-python","patch_set":18,"id":"ed9cdbf1_e27fbd8d","line":765,"in_reply_to":"de31e042_eb8475f1","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3e9b143be9f14c7d2150b1f92deeb8277d541319","unresolved":true,"context_lines":[{"line_number":976,"context_line":"        if not self.session.is_active:"},{"line_number":977,"context_line":"            # The session has been previously aborted or completed."},{"line_number":978,"context_line":"            # Refuse to complete."},{"line_number":979,"context_line":"            return HTTPNotFound()"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        manifest, mpu_etag \u003d self._parse_user_manifest(self.req.body)"},{"line_number":982,"context_line":"        # TODO: check if a manifest already exists with same mpu_etag, if it"}],"source_content_type":"text/x-python","patch_set":18,"id":"6627a191_5edf7a5d","line":979,"updated":"2024-11-12 20:09:19.000000000","message":"How quickly does AWS switch to 404s? I thought Clay looked into this a while back in the context of a double-complete and it\u0027d go a while... maybe that\u0027s not as true with an abort followed by a complete?","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00e7140c4c23f164901c5ed570d3064d6d82c77d","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        if not self.session.is_active:"},{"line_number":977,"context_line":"            # The session has been previously aborted or completed."},{"line_number":978,"context_line":"            # Refuse to complete."},{"line_number":979,"context_line":"            return HTTPNotFound()"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        manifest, mpu_etag \u003d self._parse_user_manifest(self.req.body)"},{"line_number":982,"context_line":"        # TODO: check if a manifest already exists with same mpu_etag, if it"}],"source_content_type":"text/x-python","patch_set":18,"id":"4c66e3e7_f8904fe0","line":979,"in_reply_to":"18c1c6aa_d80cc884","updated":"2024-11-29 09:58:20.000000000","message":"Done","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"22076ea354baf32c543ba5c2114ecca5629b5ef2","unresolved":true,"context_lines":[{"line_number":976,"context_line":"        if not self.session.is_active:"},{"line_number":977,"context_line":"            # The session has been previously aborted or completed."},{"line_number":978,"context_line":"            # Refuse to complete."},{"line_number":979,"context_line":"            return HTTPNotFound()"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        manifest, mpu_etag \u003d self._parse_user_manifest(self.req.body)"},{"line_number":982,"context_line":"        # TODO: check if a manifest already exists with same mpu_etag, if it"}],"source_content_type":"text/x-python","patch_set":18,"id":"18c1c6aa_d80cc884","line":979,"in_reply_to":"6627a191_5edf7a5d","updated":"2024-11-13 09:59:54.000000000","message":"Yeah, we need to allow retries to succeed. Fixed in another patch on the chain towards getting s3api func tests passing (there\u0027s a func test that expects completeUpload retries to succeed).\n\nSimilarly with abortUpload, AWS returns a 204 on retries. I have been intermittently retrying an aborted upload in s3 for 9 months and still get back a 204.\n\nThe pain is that I only get 204s from AWS if the (key, uploadId) did ever exist, otherwise it\u0027s a 404. My thinking is to \"sign\" uploadIds so we can do stateless verification if they ever existed, rather than retain server state forever.","commit_id":"1094057cc396d4f007ce8f3ecc4766d35626cff8"}]}
