)]}'
{"swift/common/middleware/container_sync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dacfbd556cbbfa86a7c48a4f4a840363c31d480f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            raise HTTPBadRequest("},{"line_number":87,"context_line":"                \u0027Cannot configure container sync on a container \u0027"},{"line_number":88,"context_line":"                \u0027with object versioning configured.\u0027,"},{"line_number":89,"context_line":"                request\u003dreq)"},{"line_number":90,"context_line":"        if not self.allow_full_urls:"},{"line_number":91,"context_line":"            if sync_to and not sync_to.startswith(\u0027//\u0027):"},{"line_number":92,"context_line":"                raise HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_287e8a1a","line":89,"updated":"2019-12-13 17:28:13.000000000","message":"I\u0027m sure this will be helpful to clients.  kudos.","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            return self.app"},{"line_number":74,"context_line":"        else:"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                (version, acc, cont, obj) \u003d req.split_path(3, 4, True)"},{"line_number":77,"context_line":"            except ValueError:"},{"line_number":78,"context_line":"                return self.app"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_d6a78c08","line":76,"updated":"2020-01-07 21:06:48.000000000","message":"So this mware *used to* handle account-level requests... I take it that was a bug? What would that have even *meant*?\n\nHmm... and even things like tempauth requests...","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        versions_cont \u003d info.get("},{"line_number":83,"context_line":"            \u0027sysmeta\u0027, {}).get(\u0027versions-container\u0027)"},{"line_number":84,"context_line":"        sync_to \u003d req.headers.get(\u0027x-container-sync-to\u0027)"},{"line_number":85,"context_line":"        if sync_to and versions_cont:"},{"line_number":86,"context_line":"            raise HTTPBadRequest("},{"line_number":87,"context_line":"                \u0027Cannot configure container sync on a container \u0027"},{"line_number":88,"context_line":"                \u0027with object versioning configured.\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_96111453","line":85,"updated":"2020-01-07 21:06:48.000000000","message":"... and not obj?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        versions_cont \u003d info.get("},{"line_number":83,"context_line":"            \u0027sysmeta\u0027, {}).get(\u0027versions-container\u0027)"},{"line_number":84,"context_line":"        sync_to \u003d req.headers.get(\u0027x-container-sync-to\u0027)"},{"line_number":85,"context_line":"        if sync_to and versions_cont:"},{"line_number":86,"context_line":"            raise HTTPBadRequest("},{"line_number":87,"context_line":"                \u0027Cannot configure container sync on a container \u0027"},{"line_number":88,"context_line":"                \u0027with object versioning configured.\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_e63457e1","line":85,"in_reply_to":"3fa7e38b_96111453","updated":"2020-01-08 01:59:27.000000000","message":"Done","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            raise HTTPBadRequest("},{"line_number":87,"context_line":"                \u0027Cannot configure container sync on a container \u0027"},{"line_number":88,"context_line":"                \u0027with object versioning configured.\u0027,"},{"line_number":89,"context_line":"                request\u003dreq)"},{"line_number":90,"context_line":"        if not self.allow_full_urls:"},{"line_number":91,"context_line":"            if sync_to and not sync_to.startswith(\u0027//\u0027):"},{"line_number":92,"context_line":"                raise HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_768b3868","line":89,"updated":"2020-01-07 21:06:48.000000000","message":"I\u0027m kinda surprised we haven\u0027t had any checks on req.method...","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            raise HTTPBadRequest("},{"line_number":87,"context_line":"                \u0027Cannot configure container sync on a container \u0027"},{"line_number":88,"context_line":"                \u0027with object versioning configured.\u0027,"},{"line_number":89,"context_line":"                request\u003dreq)"},{"line_number":90,"context_line":"        if not self.allow_full_urls:"},{"line_number":91,"context_line":"            if sync_to and not sync_to.startswith(\u0027//\u0027):"},{"line_number":92,"context_line":"                raise HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_862fa387","line":89,"in_reply_to":"3fa7e38b_768b3868","updated":"2020-01-08 01:59:27.000000000","message":"Done","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \u0027container-sync-realms.conf\u0027),"},{"line_number":39,"context_line":"            self.logger)"},{"line_number":40,"context_line":"        self.allow_full_urls \u003d config_true_value("},{"line_number":41,"context_line":"            conf.get(\u0027allow_full_urls\u0027, \u0027true\u0027))"},{"line_number":42,"context_line":"        # configure current realm/cluster for /info"},{"line_number":43,"context_line":"        self.realm \u003d self.cluster \u003d None"},{"line_number":44,"context_line":"        current \u003d conf.get(\u0027current\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_557eb61b","line":41,"updated":"2020-01-16 02:58:49.000000000","message":"Do we have any func tests that run with this turned off?\n\nI think the only documentation we have for this is in proxy-server.conf-sample -- is the recommendation to run with it on or off? In light of the above... I guess on?","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \u0027container-sync-realms.conf\u0027),"},{"line_number":39,"context_line":"            self.logger)"},{"line_number":40,"context_line":"        self.allow_full_urls \u003d config_true_value("},{"line_number":41,"context_line":"            conf.get(\u0027allow_full_urls\u0027, \u0027true\u0027))"},{"line_number":42,"context_line":"        # configure current realm/cluster for /info"},{"line_number":43,"context_line":"        self.realm \u003d self.cluster \u003d None"},{"line_number":44,"context_line":"        current \u003d conf.get(\u0027current\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_e04282ac","line":41,"in_reply_to":"3fa7e38b_557eb61b","updated":"2020-01-16 06:22:47.000000000","message":"would probe test make more sense?","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            return self.app"},{"line_number":74,"context_line":"        else:"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                (version, acc, cont, obj) \u003d req.split_path(3, 4, True)"},{"line_number":77,"context_line":"            except ValueError:"},{"line_number":78,"context_line":"                return self.app"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_b2c4e00e","line":76,"range":{"start_line":76,"start_character":17,"end_line":76,"end_character":24},"updated":"2020-01-16 02:58:49.000000000","message":"We should maybe check that this really does look like an API version.","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            return self.app"},{"line_number":74,"context_line":"        else:"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                (version, acc, cont, obj) \u003d req.split_path(3, 4, True)"},{"line_number":77,"context_line":"            except ValueError:"},{"line_number":78,"context_line":"                return self.app"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c028a6ee","line":76,"range":{"start_line":76,"start_character":17,"end_line":76,"end_character":24},"in_reply_to":"3fa7e38b_b2c4e00e","updated":"2020-01-16 06:22:47.000000000","message":"Done","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            return self.app"},{"line_number":74,"context_line":"        else:"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                (version, acc, cont, obj) \u003d req.split_path(3, 4, True)"},{"line_number":77,"context_line":"            except ValueError:"},{"line_number":78,"context_line":"                return self.app"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c0874611","line":76,"range":{"start_line":76,"start_character":17,"end_line":76,"end_character":24},"in_reply_to":"3fa7e38b_b2c4e00e","updated":"2020-01-16 06:22:47.000000000","message":"Done","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                    request\u003dreq)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if not self.allow_full_urls:"},{"line_number":94,"context_line":"            if sync_to and not sync_to.startswith(\u0027//\u0027):"},{"line_number":95,"context_line":"                raise HTTPBadRequest("},{"line_number":96,"context_line":"                    body\u003d\u0027Full URLs are not allowed for X-Container-Sync-To \u0027"},{"line_number":97,"context_line":"                         \u0027values. Only realm values of the format \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_55b0f6fd","line":94,"range":{"start_line":94,"start_character":15,"end_line":94,"end_character":22},"updated":"2020-01-16 02:58:49.000000000","message":"Potential NameError","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                    request\u003dreq)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if not self.allow_full_urls:"},{"line_number":94,"context_line":"            if sync_to and not sync_to.startswith(\u0027//\u0027):"},{"line_number":95,"context_line":"                raise HTTPBadRequest("},{"line_number":96,"context_line":"                    body\u003d\u0027Full URLs are not allowed for X-Container-Sync-To \u0027"},{"line_number":97,"context_line":"                         \u0027values. Only realm values of the format \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_602f72f5","line":94,"range":{"start_line":94,"start_character":15,"end_line":94,"end_character":22},"in_reply_to":"3fa7e38b_55b0f6fd","updated":"2020-01-16 06:22:47.000000000","message":"missed pulling it out of if block, done","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be9a0628567b9ba238648e07d22697731d3c2b6e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            return self.app"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # validate container-sync metdata update"},{"line_number":87,"context_line":"        info \u003d get_container_info("},{"line_number":88,"context_line":"            req.environ, self.app, swift_source\u003d\u0027CS\u0027)"},{"line_number":89,"context_line":"        sync_to \u003d req.headers.get(\u0027x-container-sync-to\u0027)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa7e38b_f4c08f4d","line":87,"range":{"start_line":87,"start_character":15,"end_line":87,"end_character":33},"updated":"2020-01-24 06:41:58.000000000","message":"So I\u0027m pretty sure this call is causing the current probe test failures... Guess we need to pull https://review.opendev.org/#/c/682382/76/test/probe/test_container_failures.py into this patch (and update the comment a bit).","commit_id":"bc5b2d5d0c0578af43aed2d5571808a61dafb568"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5e7aa0d0a739acc2eb9f0190af7285f51a7ad317","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                # middleware from performing the usual manifest validation."},{"line_number":154,"context_line":"                req.environ[\u0027swift.slo_override\u0027] \u003d True"},{"line_number":155,"context_line":"                # Similar arguments for static symlinks"},{"line_number":156,"context_line":"                req.environ[\u0027swift.symlink_override\u0027] \u003d True"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        return self.app"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_e5c45496","line":156,"updated":"2020-01-24 19:52:16.000000000","message":"really this is the change of significance, I think the other stuff is just some house keeping","commit_id":"1942493293e72901fd382e3e174b6ca0f21fc2f9"}],"swift/common/middleware/symlink.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"04ba9c4dbbc662b64efbcfc48cce0d10ffe6ed85","unresolved":false,"context_lines":[{"line_number":514,"context_line":"    def _validate_etag_and_update_sysmeta(self, req, symlink_target_path,"},{"line_number":515,"context_line":"                                          etag):"},{"line_number":516,"context_line":"        if req.environ.get(\u0027swift.symlink_override\u0027):"},{"line_number":517,"context_line":"            return"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"        # next we\u0027ll make sure the E-Tag matches a real object"},{"line_number":520,"context_line":"        new_req \u003d make_subrequest("}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_edba6b0a","line":517,"updated":"2020-01-17 00:29:40.000000000","message":"Need to set\n\n req.headers[TGT_ETAG_SYSMETA_SYMLINK_HDR] \u003d etag\n\nbefore returning. How should we handle\n\n req.headers[TGT_BYTES_SYSMETA_SYMLINK_HDR]\n\nthough??","commit_id":"0ecec5037da08cca576681747821d5c42622ca63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e1c775a5fefc1f767c916d8180170d334c007406","unresolved":false,"context_lines":[{"line_number":507,"context_line":"        if req.environ.get(\u0027swift.symlink_override\u0027):"},{"line_number":508,"context_line":"            req.headers[TGT_ETAG_SYSMETA_SYMLINK_HDR] \u003d etag"},{"line_number":509,"context_line":"            req.headers[TGT_BYTES_SYSMETA_SYMLINK_HDR] \u003d \\"},{"line_number":510,"context_line":"                req.headers[TGT_BYTES_SYMLINK_HDR]"},{"line_number":511,"context_line":"            return"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        # next we\u0027ll make sure the E-Tag matches a real object"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa7e38b_b30b14d2","line":510,"updated":"2020-01-23 17:55:03.000000000","message":":-/ possible key error -- We probably oughta check for the header and 400 if it\u0027s missing...","commit_id":"bc5b2d5d0c0578af43aed2d5571808a61dafb568"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"b384bbd7c6cffbd631ffa04011889314a188c163","unresolved":false,"context_lines":[{"line_number":507,"context_line":"        if req.environ.get(\u0027swift.symlink_override\u0027):"},{"line_number":508,"context_line":"            req.headers[TGT_ETAG_SYSMETA_SYMLINK_HDR] \u003d etag"},{"line_number":509,"context_line":"            req.headers[TGT_BYTES_SYSMETA_SYMLINK_HDR] \u003d \\"},{"line_number":510,"context_line":"                req.headers[TGT_BYTES_SYMLINK_HDR]"},{"line_number":511,"context_line":"            return"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        # next we\u0027ll make sure the E-Tag matches a real object"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_e5e77b0f","line":510,"range":{"start_line":510,"start_character":16,"end_line":510,"end_character":50},"updated":"2020-01-24 10:59:00.000000000","message":"don\u0027t think req would have TGT_BYTES_SYMLINK_HDR at this point, would it? I think it\u0027s only added to response headers. See lines 419 and 323.\n...\ncuriously `test_sync_busted_static_symlink_different_container` should test this, so I might be missing something.","commit_id":"1d5d8ce720b4796b6a247a0762b89f3b5a5b6efb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"036c5e65895b429593193731443e943e402df7f4","unresolved":false,"context_lines":[{"line_number":507,"context_line":"        if req.environ.get(\u0027swift.symlink_override\u0027):"},{"line_number":508,"context_line":"            req.headers[TGT_ETAG_SYSMETA_SYMLINK_HDR] \u003d etag"},{"line_number":509,"context_line":"            req.headers[TGT_BYTES_SYSMETA_SYMLINK_HDR] \u003d \\"},{"line_number":510,"context_line":"                req.headers[TGT_BYTES_SYMLINK_HDR]"},{"line_number":511,"context_line":"            return"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        # next we\u0027ll make sure the E-Tag matches a real object"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_1f49bf8c","line":510,"range":{"start_line":510,"start_character":16,"end_line":510,"end_character":50},"in_reply_to":"3fa7e38b_e5e77b0f","updated":"2020-01-24 17:49:23.000000000","message":"It\u0027s a little sneaky...\n\nContainer sync uses an internal client with symlink in the pipeline to fetch data, then forwards all of that on to the remote cluster. As a result, it\u0027ll have the client-facing header in the request -- previously it would be ignored, we\u0027d only look at the client-facing etag header, and we\u0027d need to wait for the target to get synced so validation would pass. Now we just move the headers over and call it good.\n\nFortunately, only container sync can set the override flag (at least, currently), so we should be fairly confident that the header will be included. It probably would be better to check for the header and raise a 400 if it\u0027s missing, though. Follow-up?","commit_id":"1d5d8ce720b4796b6a247a0762b89f3b5a5b6efb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5e7aa0d0a739acc2eb9f0190af7285f51a7ad317","unresolved":false,"context_lines":[{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def _validate_etag_and_update_sysmeta(self, req, symlink_target_path,"},{"line_number":506,"context_line":"                                          etag):"},{"line_number":507,"context_line":"        if req.environ.get(\u0027swift.symlink_override\u0027):"},{"line_number":508,"context_line":"            req.headers[TGT_ETAG_SYSMETA_SYMLINK_HDR] \u003d etag"},{"line_number":509,"context_line":"            req.headers[TGT_BYTES_SYSMETA_SYMLINK_HDR] \u003d \\"},{"line_number":510,"context_line":"                req.headers[TGT_BYTES_SYMLINK_HDR]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_453768b0","line":507,"updated":"2020-01-24 19:52:16.000000000","message":"so the env override is set on all validated container sync requests... and the container sync client is already doing ?symlink\u003dget in the source cluster - I validated it\u0027s forwarding the response headers\n\nthe symlink-target header will have already transfered to sysmeta, the etag is coming from the x-target-symlink-etag header, the content-type will pass through and the bytes will blow up if missing","commit_id":"1942493293e72901fd382e3e174b6ca0f21fc2f9"}],"swift/common/middleware/versioned_writes/object_versioning.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dacfbd556cbbfa86a7c48a4f4a840363c31d480f","unresolved":false,"context_lines":[{"line_number":878,"context_line":"                        \u0027X-Container-Bytes-Used\u0027,"},{"line_number":879,"context_line":"                        str(int(curr_bytes) + int(ver_bytes)))"},{"line_number":880,"context_line":"                close_if_possible(vresp.app_iter)"},{"line_number":881,"context_line":"        elif is_success(self._get_status_int()) and RESERVED not in container:"},{"line_number":882,"context_line":"            # If client is doing a version-aware listing for a container that"},{"line_number":883,"context_line":"            # (as best we could tell) has never had versioning enabled,"},{"line_number":884,"context_line":"            # err on the side of there being data anyway -- the metadata we"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_e892b257","line":881,"updated":"2019-12-13 17:28:13.000000000","message":"I don\u0027t understand this change... something with the probe test maybe?","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3beaf38e5411cd0216e69a78622d83c92dc228af","unresolved":false,"context_lines":[{"line_number":878,"context_line":"                        \u0027X-Container-Bytes-Used\u0027,"},{"line_number":879,"context_line":"                        str(int(curr_bytes) + int(ver_bytes)))"},{"line_number":880,"context_line":"                close_if_possible(vresp.app_iter)"},{"line_number":881,"context_line":"        elif is_success(self._get_status_int()) and RESERVED not in container:"},{"line_number":882,"context_line":"            # If client is doing a version-aware listing for a container that"},{"line_number":883,"context_line":"            # (as best we could tell) has never had versioning enabled,"},{"line_number":884,"context_line":"            # err on the side of there being data anyway -- the metadata we"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_b515dfe8","line":881,"in_reply_to":"3fa7e38b_e892b257","updated":"2019-12-16 09:21:04.000000000","message":"The issue is that if a container has a RESERVED byte already in it then _build_versions_container_name will raise an exception.\n\nThis was exposed because of the get_container_info call that was added to the sync middleware. Once that was added the reserved_name probe test started failing[1]. I think if any middleware to the left of slo was ever to build a container name with RESERVED, it would have run into this issue here.\n\n[1] - https://zuul.opendev.org/t/openstack/build/7aa7384cc3a34dc7bc3e9fd55c945f64/log/job-output.txt#1214","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":168,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":169,"context_line":"from swift.common.utils import get_logger, Timestamp, \\"},{"line_number":170,"context_line":"    config_true_value, close_if_possible, closing_if_possible, \\"},{"line_number":171,"context_line":"    FileLikeIter, split_path, parse_content_type, RESERVED_STR, RESERVED"},{"line_number":172,"context_line":"from swift.common.wsgi import WSGIContext, make_pre_authed_request"},{"line_number":173,"context_line":"from swift.proxy.controllers.base import get_container_info"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_b610d050","line":171,"range":{"start_line":171,"start_character":64,"end_line":171,"end_character":72},"updated":"2020-01-07 21:06:48.000000000","message":"Stray import from a rebase?\n\nOh, I see -- no longer needed as of patchset 7.","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":168,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":169,"context_line":"from swift.common.utils import get_logger, Timestamp, \\"},{"line_number":170,"context_line":"    config_true_value, close_if_possible, closing_if_possible, \\"},{"line_number":171,"context_line":"    FileLikeIter, split_path, parse_content_type, RESERVED_STR, RESERVED"},{"line_number":172,"context_line":"from swift.common.wsgi import WSGIContext, make_pre_authed_request"},{"line_number":173,"context_line":"from swift.proxy.controllers.base import get_container_info"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_0651730d","line":171,"range":{"start_line":171,"start_character":64,"end_line":171,"end_character":72},"in_reply_to":"3fa7e38b_b610d050","updated":"2020-01-08 01:59:27.000000000","message":"Done","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"        sync_to \u003d container_info.get(\u0027sync_to\u0027)"},{"line_number":1054,"context_line":"        if sync_to:"},{"line_number":1055,"context_line":"            raise HTTPBadRequest("},{"line_number":1056,"context_line":"                \u0027Cannot enabled object versioning on a container \u0027"},{"line_number":1057,"context_line":"                \u0027configured as source of container syncing.\u0027,"},{"line_number":1058,"context_line":"                request\u003dreq)"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_d5c38657","line":1056,"range":{"start_line":1056,"start_character":24,"end_line":1056,"end_character":31},"updated":"2020-01-16 02:58:49.000000000","message":"enable","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"        sync_to \u003d container_info.get(\u0027sync_to\u0027)"},{"line_number":1054,"context_line":"        if sync_to:"},{"line_number":1055,"context_line":"            raise HTTPBadRequest("},{"line_number":1056,"context_line":"                \u0027Cannot enabled object versioning on a container \u0027"},{"line_number":1057,"context_line":"                \u0027configured as source of container syncing.\u0027,"},{"line_number":1058,"context_line":"                request\u003dreq)"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_04bb2410","line":1056,"range":{"start_line":1056,"start_character":24,"end_line":1056,"end_character":31},"in_reply_to":"3fa7e38b_401d96bd","updated":"2020-01-16 22:30:35.000000000","message":"Lies! ;-)","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"        sync_to \u003d container_info.get(\u0027sync_to\u0027)"},{"line_number":1054,"context_line":"        if sync_to:"},{"line_number":1055,"context_line":"            raise HTTPBadRequest("},{"line_number":1056,"context_line":"                \u0027Cannot enabled object versioning on a container \u0027"},{"line_number":1057,"context_line":"                \u0027configured as source of container syncing.\u0027,"},{"line_number":1058,"context_line":"                request\u003dreq)"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_401d96bd","line":1056,"range":{"start_line":1056,"start_character":24,"end_line":1056,"end_character":31},"in_reply_to":"3fa7e38b_d5c38657","updated":"2020-01-16 06:22:47.000000000","message":"Done","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"}],"swift/container/sync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dacfbd556cbbfa86a7c48a4f4a840363c31d480f","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                self.container_skips +\u003d 1"},{"line_number":364,"context_line":"                self.logger.increment(\u0027skips\u0027)"},{"line_number":365,"context_line":"                self.logger.info(\u0027Skipping container %s/%s with \u0027"},{"line_number":366,"context_line":"                                 \u0027object versioning configured\u0027 % ("},{"line_number":367,"context_line":"                                     info[\u0027account\u0027], info[\u0027container\u0027]))"},{"line_number":368,"context_line":"                return"},{"line_number":369,"context_line":"            if not broker.is_deleted():"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_28a52ab4","line":366,"updated":"2019-12-13 17:28:13.000000000","message":"maybe even a warning, the statsd metric for skips is probably worth monitoring.","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            if broker.metadata.get(SYSMETA_VERSIONS_CONT):"},{"line_number":364,"context_line":"                self.container_skips +\u003d 1"},{"line_number":365,"context_line":"                self.logger.increment(\u0027skips\u0027)"},{"line_number":366,"context_line":"                self.logger.info(\u0027Skipping container %s/%s with \u0027"},{"line_number":367,"context_line":"                                 \u0027object versioning configured\u0027 % ("},{"line_number":368,"context_line":"                                     info[\u0027account\u0027], info[\u0027container\u0027]))"},{"line_number":369,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_96db5478","line":366,"range":{"start_line":366,"start_character":28,"end_line":366,"end_character":32},"updated":"2020-01-07 21:06:48.000000000","message":"Still might want warning. I think I\u0027m more OK with info for the static-link skip, but his one means we\u0027re not syncing the *whole container*.","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            if broker.metadata.get(SYSMETA_VERSIONS_CONT):"},{"line_number":364,"context_line":"                self.container_skips +\u003d 1"},{"line_number":365,"context_line":"                self.logger.increment(\u0027skips\u0027)"},{"line_number":366,"context_line":"                self.logger.info(\u0027Skipping container %s/%s with \u0027"},{"line_number":367,"context_line":"                                 \u0027object versioning configured\u0027 % ("},{"line_number":368,"context_line":"                                     info[\u0027account\u0027], info[\u0027container\u0027]))"},{"line_number":369,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_669ce7be","line":366,"range":{"start_line":366,"start_character":28,"end_line":366,"end_character":32},"in_reply_to":"3fa7e38b_96db5478","updated":"2020-01-08 01:59:27.000000000","message":"Done","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":605,"context_line":"                    exc \u003d err"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"                # skip static symlinks for now"},{"line_number":608,"context_line":"                if headers.get(\u0027x-symlink-target-etag\u0027, False):"},{"line_number":609,"context_line":"                    self.logger.info(\u0027Skipping static symlink %s/%s/%s \u0027 % ("},{"line_number":610,"context_line":"                        info[\u0027account\u0027], info[\u0027container\u0027], row[\u0027name\u0027]))"},{"line_number":611,"context_line":"                    return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_f602c807","line":608,"updated":"2020-01-07 21:06:48.000000000","message":"I wonder if it\u0027d be worth making this a little more precise and skipping if\n\n* it\u0027s a static link *and*\n* it points outside of this container.\n\nStatic links within a single container should still work... right?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":605,"context_line":"                    exc \u003d err"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"                # skip static symlinks for now"},{"line_number":608,"context_line":"                if headers.get(\u0027x-symlink-target-etag\u0027, False):"},{"line_number":609,"context_line":"                    self.logger.info(\u0027Skipping static symlink %s/%s/%s \u0027 % ("},{"line_number":610,"context_line":"                        info[\u0027account\u0027], info[\u0027container\u0027], row[\u0027name\u0027]))"},{"line_number":611,"context_line":"                    return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_7144a248","line":608,"in_reply_to":"3fa7e38b_f602c807","updated":"2020-01-08 01:59:27.000000000","message":"makes sense, especially that one wouldn\u0027t be able to create static link before creating actual object\n\ndone","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":604,"context_line":"                    body \u003d None"},{"line_number":605,"context_line":"                    exc \u003d err"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"                # skip static symlink when target container !\u003d source container"},{"line_number":608,"context_line":"                symlink_target \u003d wsgi_unquote("},{"line_number":609,"context_line":"                    headers.get(\u0027x-symlink-target\u0027, \u0027\u0027))"},{"line_number":610,"context_line":"                if symlink_target:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_b59e0a66","line":607,"updated":"2020-01-16 02:58:49.000000000","message":"I wonder if this may be overly restrictive -- we allow you to sync SLOs with segments in another container, for example, and just rely on you enabling sync on both of them...","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":604,"context_line":"                    body \u003d None"},{"line_number":605,"context_line":"                    exc \u003d err"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"                # skip static symlink when target container !\u003d source container"},{"line_number":608,"context_line":"                symlink_target \u003d wsgi_unquote("},{"line_number":609,"context_line":"                    headers.get(\u0027x-symlink-target\u0027, \u0027\u0027))"},{"line_number":610,"context_line":"                if symlink_target:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_6473f81d","line":607,"in_reply_to":"3fa7e38b_00179e9f","updated":"2020-01-16 22:30:35.000000000","message":"Hmm... the bigger difference may be the fact that SLOs are necessarily going to have segments in the same account, whereas symlinks (whether static or dynamic) can reference data in another account which may not exists on the other end...\n\nI\u0027d definitely be on-board with preventing syncing of OV static links. Maybe we should plumb in a\n\n swift.symlink_override\n\nto skip validation, similar to what we do for SLO? See https://github.com/openstack/swift/blob/2.23.0/swift/common/middleware/container_sync.py#L133-L136 and https://github.com/openstack/swift/blob/2.23.0/swift/common/middleware/slo.py#L1549-L1550\n\nI\u0027m just not sure I like the idea of skipping these rows entirely -- and if we change our mind later, it\u0027ll be hard to take back :-/","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f0223214f93d2ec573f31523441427fa62f43e12","unresolved":false,"context_lines":[{"line_number":604,"context_line":"                    body \u003d None"},{"line_number":605,"context_line":"                    exc \u003d err"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"                # skip static symlink when target container !\u003d source container"},{"line_number":608,"context_line":"                symlink_target \u003d wsgi_unquote("},{"line_number":609,"context_line":"                    headers.get(\u0027x-symlink-target\u0027, \u0027\u0027))"},{"line_number":610,"context_line":"                if symlink_target:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_00179e9f","line":607,"in_reply_to":"3fa7e38b_b59e0a66","updated":"2020-01-16 06:22:47.000000000","message":"but what if user doesn\u0027t want to sync the other container? At least in the case of slos it is common to have segments containers?","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"369ef44aa864842cc240e8864c1e4f40641bd91a","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        \u0027read_acl\u0027: headers.get(\u0027x-container-read\u0027),"},{"line_number":182,"context_line":"        \u0027write_acl\u0027: headers.get(\u0027x-container-write\u0027),"},{"line_number":183,"context_line":"        \u0027sync_key\u0027: headers.get(\u0027x-container-sync-key\u0027),"},{"line_number":184,"context_line":"        \u0027sync_to\u0027: headers.get(\u0027x-container-sync-to\u0027),"},{"line_number":185,"context_line":"        \u0027object_count\u0027: headers.get(\u0027x-container-object-count\u0027),"},{"line_number":186,"context_line":"        \u0027bytes\u0027: headers.get(\u0027x-container-bytes-used\u0027),"},{"line_number":187,"context_line":"        \u0027versions\u0027: headers.get(\u0027x-versions-location\u0027),"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_55a556b3","line":184,"updated":"2020-01-16 02:58:49.000000000","message":"Hmmm... so on upgrade, we may have some stale cache entries...\n\nBut that\u0027s what the sync change is for!","commit_id":"942bd7cdc39be7ac1e3d9dedbc4acee2b7357a85"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a555b1532494fb1af0a04def7920317c459283f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3fa7e38b_258cac2c","updated":"2020-01-24 20:14:36.000000000","message":"\u0027K, sure -- we can add the sync_to in the versioning patch where it\u0027s actually needed, w/e.","commit_id":"1942493293e72901fd382e3e174b6ca0f21fc2f9"}],"test/functional/test_object_versioning.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dacfbd556cbbfa86a7c48a4f4a840363c31d480f","unresolved":false,"context_lines":[{"line_number":2238,"context_line":"        sync_to_hdr \u003d {\u0027X-Container-Sync-To\u0027: \u0027//r/c/a/c\u0027}"},{"line_number":2239,"context_line":"        with self.assertRaises(ResponseError) as caught:"},{"line_number":2240,"context_line":"            self.env.container.update_metadata(hdrs\u003dsync_to_hdr)"},{"line_number":2241,"context_line":"        self.assertEqual(400, caught.exception.status)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_88a21eac","line":2241,"updated":"2019-12-13 17:28:13.000000000","message":"this is the best part of the change, super clear and effective","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":2531,"context_line":"            container.update_metadata(hdrs\u003dversions_header)"},{"line_number":2532,"context_line":"        self.assertEqual(400, caught.exception.status)"},{"line_number":2533,"context_line":""},{"line_number":2534,"context_line":"        container.delete()"},{"line_number":2535,"context_line":""},{"line_number":2536,"context_line":"    def test_enable_sync_while_versioned(self):"},{"line_number":2537,"context_line":"        sync_to_hdr \u003d {\u0027X-Container-Sync-To\u0027: \u0027//r/c/a/c\u0027}"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_36d14030","line":2534,"updated":"2020-01-07 21:06:48.000000000","message":"tearDown() doesn\u0027t take care of this for us?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":2534,"context_line":"        container.delete()"},{"line_number":2535,"context_line":""},{"line_number":2536,"context_line":"    def test_enable_sync_while_versioned(self):"},{"line_number":2537,"context_line":"        sync_to_hdr \u003d {\u0027X-Container-Sync-To\u0027: \u0027//r/c/a/c\u0027}"},{"line_number":2538,"context_line":"        with self.assertRaises(ResponseError) as caught:"},{"line_number":2539,"context_line":"            self.env.container.update_metadata(hdrs\u003dsync_to_hdr)"},{"line_number":2540,"context_line":"        self.assertEqual(400, caught.exception.status)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_56d4fc1e","line":2537,"range":{"start_line":2537,"start_character":24,"end_line":2537,"end_character":43},"updated":"2020-01-07 21:06:48.000000000","message":"So wait, is behavior going to be dictated by X-Container-Sync-To (as here) or X-Container-Sync-Key (as above)?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"d6022791f179cf8b8e9712260b32b03856bff4cc","unresolved":false,"context_lines":[{"line_number":2534,"context_line":"        container.delete()"},{"line_number":2535,"context_line":""},{"line_number":2536,"context_line":"    def test_enable_sync_while_versioned(self):"},{"line_number":2537,"context_line":"        sync_to_hdr \u003d {\u0027X-Container-Sync-To\u0027: \u0027//r/c/a/c\u0027}"},{"line_number":2538,"context_line":"        with self.assertRaises(ResponseError) as caught:"},{"line_number":2539,"context_line":"            self.env.container.update_metadata(hdrs\u003dsync_to_hdr)"},{"line_number":2540,"context_line":"        self.assertEqual(400, caught.exception.status)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_0693b34f","line":2537,"range":{"start_line":2537,"start_character":24,"end_line":2537,"end_character":43},"in_reply_to":"3fa7e38b_56d4fc1e","updated":"2020-01-08 01:59:27.000000000","message":"They issue I had to use sync-key in object versioning is that get_container_info does not return sync_to[1], only sync_key. My guess is that containers could be configured with a sync_key but not necessarily with a sync_to?? \nMaybe in the container-sync middleware we should check for either header in the request and error out on either?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7751d31b375931dc17f015f47fc4f5f0af905d7","unresolved":false,"context_lines":[{"line_number":2537,"context_line":"        sync_to_hdr \u003d {\u0027X-Container-Sync-To\u0027: \u0027//r/c/a/c\u0027}"},{"line_number":2538,"context_line":"        with self.assertRaises(ResponseError) as caught:"},{"line_number":2539,"context_line":"            self.env.container.update_metadata(hdrs\u003dsync_to_hdr)"},{"line_number":2540,"context_line":"        self.assertEqual(400, caught.exception.status)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_f6d64826","line":2540,"updated":"2020-01-07 21:06:48.000000000","message":"Should probably have some assertions on the body. I suppose we know it\u0027s not going to be the allow_full_urls 400, but we could surely at least look for\n\n b\u0027object versioning\u0027\n\nin the body, yeah?","commit_id":"92e9176ae9f15306bd685cf38b4468c07633d397"}],"test/probe/test_container_sync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dacfbd556cbbfa86a7c48a4f4a840363c31d480f","unresolved":false,"context_lines":[{"line_number":651,"context_line":"            client.post_container(self.url, self.token, container_name,"},{"line_number":652,"context_line":"                                  headers\u003dsync_headers)"},{"line_number":653,"context_line":"        self.assertEqual(400, cm.exception.http_status)  # sanity check"},{"line_number":654,"context_line":"        \u0027\u0027\u0027"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"        # use internal client to set container-sync headers"},{"line_number":657,"context_line":"        # since it doesn\u0027t have container_sync middleware in pipeline"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_a8c35a57","line":654,"updated":"2019-12-13 17:28:13.000000000","message":"this seems useful to me, why is it commented out?","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3beaf38e5411cd0216e69a78622d83c92dc228af","unresolved":false,"context_lines":[{"line_number":651,"context_line":"            client.post_container(self.url, self.token, container_name,"},{"line_number":652,"context_line":"                                  headers\u003dsync_headers)"},{"line_number":653,"context_line":"        self.assertEqual(400, cm.exception.http_status)  # sanity check"},{"line_number":654,"context_line":"        \u0027\u0027\u0027"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"        # use internal client to set container-sync headers"},{"line_number":657,"context_line":"        # since it doesn\u0027t have container_sync middleware in pipeline"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_d5e73b0f","line":654,"in_reply_to":"3fa7e38b_a8c35a57","updated":"2019-12-16 09:21:04.000000000","message":"I had to comment out to debug the code below and forgot to remove the comment block. will update in the next patchset","commit_id":"53c966f97f5ba1526f796e74a9889e16dd481d59"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":619,"context_line":"            client.get_object("},{"line_number":620,"context_line":"                self.url, self.token, dest_container, symlink_name)"},{"line_number":621,"context_line":"        self.assertEqual(404, cm.exception.http_status)  # sanity check"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def test_sync_static_symlink(self):"},{"line_number":624,"context_line":"        source_container, dest_container \u003d self._setup_synced_containers()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_446a7cec","line":621,"range":{"start_line":621,"start_character":25,"end_line":621,"end_character":28},"updated":"2020-01-16 22:30:35.000000000","message":"If we *did* sync the symlink... but not the target... wouldn\u0027t we have the same expectation?\n\nShould we tack on a ?symlink\u003dget instead?","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a576edb5dca6ca679f36066946114b96ff2f12f","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":619,"context_line":"            client.get_object("},{"line_number":620,"context_line":"                self.url, self.token, dest_container, symlink_name)"},{"line_number":621,"context_line":"        self.assertEqual(404, cm.exception.http_status)  # sanity check"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def test_sync_static_symlink(self):"},{"line_number":624,"context_line":"        source_container, dest_container \u003d self._setup_synced_containers()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_52c1dafc","line":621,"range":{"start_line":621,"start_character":25,"end_line":621,"end_character":28},"in_reply_to":"3fa7e38b_446a7cec","updated":"2020-01-16 23:40:20.000000000","message":"Oh, I get it now -- these are all within the same account, so the counterfactual would be a 200...","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a576edb5dca6ca679f36066946114b96ff2f12f","unresolved":false,"context_lines":[{"line_number":707,"context_line":"            client.post_container(self.url, self.token, source_container,"},{"line_number":708,"context_line":"                                  headers\u003dversion_hdr)"},{"line_number":709,"context_line":"        self.assertEqual(400, cm.exception.http_status)  # sanity check"},{"line_number":710,"context_line":"        self.assertEqual(\u0027Cannot enabled object versioning on a container \u0027"},{"line_number":711,"context_line":"                         \u0027configured as source of container syncing.\u0027,"},{"line_number":712,"context_line":"                         cm.exception.http_response_content)"},{"line_number":713,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_f2c0062f","line":710,"range":{"start_line":710,"start_character":25,"end_line":710,"end_character":26},"updated":"2020-01-16 23:40:20.000000000","message":"Needs to be bytes on py3.","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":794,"context_line":"        # allowing us to bypass checks"},{"line_number":795,"context_line":"        int_client \u003d self.make_internal_client()"},{"line_number":796,"context_line":"        # TODO: what a terrible hack, maybe we need to extend internal"},{"line_number":797,"context_line":"        # client to allow caller to become a swift_owner??"},{"line_number":798,"context_line":"        int_client.app.app.app.app.swift_owner_headers \u003d []"},{"line_number":799,"context_line":"        int_client.set_container_metadata(self.account, container_name,"},{"line_number":800,"context_line":"                                          metadata\u003dsync_headers)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_44435c6c","line":797,"updated":"2020-01-16 22:30:35.000000000","message":"Alternatively, we could structure the test to have it happen like it would in prod:\n\n* Split brain,\n* one side gets versioning,\n* other side gets sync,\n* replication gets us to misconfigured state.","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":795,"context_line":"        int_client \u003d self.make_internal_client()"},{"line_number":796,"context_line":"        # TODO: what a terrible hack, maybe we need to extend internal"},{"line_number":797,"context_line":"        # client to allow caller to become a swift_owner??"},{"line_number":798,"context_line":"        int_client.app.app.app.app.swift_owner_headers \u003d []"},{"line_number":799,"context_line":"        int_client.set_container_metadata(self.account, container_name,"},{"line_number":800,"context_line":"                                          metadata\u003dsync_headers)"},{"line_number":801,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_07624642","line":798,"range":{"start_line":798,"start_character":19,"end_line":798,"end_character":34},"updated":"2020-01-16 22:30:35.000000000","message":"What if you\u0027ve got a non-default internal-client configuration? Could we at least use pipeline_property? https://github.com/openstack/swift/blob/2.23.0/swift/common/wsgi.py#L242","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62e10e67e36d9bff8335479b1e2e1776d1cdb2c6","unresolved":false,"context_lines":[{"line_number":815,"context_line":"        with self.assertRaises(ClientException) as cm:"},{"line_number":816,"context_line":"            client.get_object("},{"line_number":817,"context_line":"                self.url, self.token, dest_container, object_name)"},{"line_number":818,"context_line":"        self.assertEqual(404, cm.exception.http_status)  # sanity check"},{"line_number":819,"context_line":""},{"line_number":820,"context_line":""},{"line_number":821,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_c76bce19","line":818,"updated":"2020-01-16 22:30:35.000000000","message":"Might also be worth GET/HEADing dest_container and verifying that there are no objects.","commit_id":"4b45cf656a85bd0db67ae034da983cbef6879021"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"799025e7ae0b9873fc0bb2bfa83f3c78286a12f0","unresolved":false,"context_lines":[{"line_number":616,"context_line":"            self.url, self.token, dest_container, regular_name)"},{"line_number":617,"context_line":"        self.assertEqual(regular_body, actual_target_body)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"        # but static symlink should be skipped"},{"line_number":620,"context_line":"        resp_headers, actual_target_body \u003d client.get_object("},{"line_number":621,"context_line":"            self.url, self.token, dest_container, symlink_name)"},{"line_number":622,"context_line":"        self.assertEqual(target_body, actual_target_body)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_4d705fa8","line":619,"range":{"start_line":619,"start_character":10,"end_line":619,"end_character":46},"updated":"2020-01-17 00:13:42.000000000","message":"update comment","commit_id":"0ecec5037da08cca576681747821d5c42622ca63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d376a9ed0177940b0fcf48aecc8a9da5ec47d2ac","unresolved":false,"context_lines":[{"line_number":616,"context_line":"            self.url, self.token, dest_container, regular_name)"},{"line_number":617,"context_line":"        self.assertEqual(regular_body, actual_target_body)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"        # but static symlink should be skipped"},{"line_number":620,"context_line":"        resp_headers, actual_target_body \u003d client.get_object("},{"line_number":621,"context_line":"            self.url, self.token, dest_container, symlink_name)"},{"line_number":622,"context_line":"        self.assertEqual(target_body, actual_target_body)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_6d819b4c","line":619,"range":{"start_line":619,"start_character":10,"end_line":619,"end_character":46},"in_reply_to":"3fa7e38b_4d705fa8","updated":"2020-01-17 00:19:16.000000000","message":"And test name ;-)\n\nSorry, forgot.","commit_id":"0ecec5037da08cca576681747821d5c42622ca63"}]}
