)]}'
{"swift/proxy/controllers/base.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a095580ea521895c1241ca7db32d9d682f26c80","unresolved":false,"context_lines":[{"line_number":1981,"context_line":"        # TODO: we need to instantiate controller directly rather than simply"},{"line_number":1982,"context_line":"        # pass the subreq to the proxy app because we may need to include an"},{"line_number":1983,"context_line":"        # object in the pat to the container server :/ Perhaps we should pass"},{"line_number":1984,"context_line":"        # the obj as a parameter when fetching a specific shard range??"},{"line_number":1985,"context_line":"        controller, path_parts \u003d self.app.get_controller(subreq)"},{"line_number":1986,"context_line":"        controller \u003d controller(self.app, **path_parts)"},{"line_number":1987,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f4e5783_17cd3130","line":1984,"updated":"2017-10-17 17:24:57.000000000","message":"any better ideas? should/could we move the obj name to an includes\u003d query string param?","commit_id":"58cd47872ac019b3c9047f82c7257469369ddb4c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a23fec7f8b504f54ea9f4984f64eae4a8c28f4bc","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2028,"context_line":"        \"\"\""},{"line_number":2029,"context_line":"        params \u003d req.params.copy()"},{"line_number":2030,"context_line":"        params.update({\u0027items\u0027: \u0027shard\u0027, \u0027format\u0027: \u0027json\u0027})"},{"line_number":2031,"context_line":"        listing, response \u003d self._get_container_listing(req, account,"},{"line_number":2032,"context_line":"                                                        container, obj\u003dobj,"},{"line_number":2033,"context_line":"                                                        params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_96f2ff05","line":2030,"range":{"start_line":2030,"start_character":41,"end_line":2030,"end_character":57},"updated":"2017-10-18 23:32:47.000000000","message":"With Tim\u0027s new listing middleware can\u0027t we assume that json is now the default?","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2ad3da577aa4388e6aa646df5dc1d9b18108a710","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2028,"context_line":"        \"\"\""},{"line_number":2029,"context_line":"        params \u003d req.params.copy()"},{"line_number":2030,"context_line":"        params.update({\u0027items\u0027: \u0027shard\u0027, \u0027format\u0027: \u0027json\u0027})"},{"line_number":2031,"context_line":"        listing, response \u003d self._get_container_listing(req, account,"},{"line_number":2032,"context_line":"                                                        container, obj\u003dobj,"},{"line_number":2033,"context_line":"                                                        params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_747d22b0","line":2030,"range":{"start_line":2030,"start_character":41,"end_line":2030,"end_character":57},"in_reply_to":"3f4b6375_69c2ef35","updated":"2017-10-19 19:41:46.000000000","message":"I\u0027m not sure we can drop this, actually -- the proxy controllers are still responsible for tacking on a format\u003djson query param, since the backend servers are still perfectly capable of responding with text or xml. Indeed, they still *default* to text.","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71c01d6a81d89636a66f7ac68765cf65d1eb5c0f","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2028,"context_line":"        \"\"\""},{"line_number":2029,"context_line":"        params \u003d req.params.copy()"},{"line_number":2030,"context_line":"        params.update({\u0027items\u0027: \u0027shard\u0027, \u0027format\u0027: \u0027json\u0027})"},{"line_number":2031,"context_line":"        listing, response \u003d self._get_container_listing(req, account,"},{"line_number":2032,"context_line":"                                                        container, obj\u003dobj,"},{"line_number":2033,"context_line":"                                                        params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_69c2ef35","line":2030,"range":{"start_line":2030,"start_character":41,"end_line":2030,"end_character":57},"in_reply_to":"3f4b6375_96f2ff05","updated":"2017-10-19 18:40:00.000000000","message":"I guess so. But will all my test assertion break? :O","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9ea294767ebf8865e14fd972d37f51952f81c215","unresolved":false,"context_lines":[{"line_number":1998,"context_line":"        version, _a, _c, _other \u003d req.split_path(3, 4, True)"},{"line_number":1999,"context_line":"        path \u003d \u0027/\u0027.join([\u0027\u0027, version, account, container])"},{"line_number":2000,"context_line":""},{"line_number":2001,"context_line":"        # TODO: consider adding user agent and swift source to subreq"},{"line_number":2002,"context_line":"        subreq \u003d make_pre_authed_request("},{"line_number":2003,"context_line":"            req.environ, method\u003d\u0027GET\u0027, path\u003dquote(path), headers\u003dreq.headers)"},{"line_number":2004,"context_line":"        subreq.params \u003d params"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_361d57bd","line":2001,"updated":"2018-01-20 00:50:12.000000000","message":"+1\n\nMaybe even accept an optional kwarg for it, similar to what we do with get_container_info.","commit_id":"866c2645d4fad4f8f450f0d40fc25f4d949d9702"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9ea294767ebf8865e14fd972d37f51952f81c215","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2037,"context_line":"        \"\"\""},{"line_number":2038,"context_line":"        params \u003d req.params.copy()"},{"line_number":2039,"context_line":"        params.update({\u0027items\u0027: \u0027shard\u0027, \u0027format\u0027: \u0027json\u0027})"},{"line_number":2040,"context_line":"        if includes:"},{"line_number":2041,"context_line":"            params[\u0027includes\u0027] \u003d includes"},{"line_number":2042,"context_line":"        if state:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_b68647db","line":2039,"range":{"start_line":2039,"start_character":41,"end_line":2039,"end_character":57},"updated":"2018-01-20 00:50:12.000000000","message":"*Now* we can probably drop this (if we want) -- app.handle_request should go through the container controller and force it to json regardless.","commit_id":"866c2645d4fad4f8f450f0d40fc25f4d949d9702"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c02a5611da2a85c955731828f377606292d54111","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2037,"context_line":"        \"\"\""},{"line_number":2038,"context_line":"        params \u003d req.params.copy()"},{"line_number":2039,"context_line":"        params.update({\u0027items\u0027: \u0027shard\u0027, \u0027format\u0027: \u0027json\u0027})"},{"line_number":2040,"context_line":"        if includes:"},{"line_number":2041,"context_line":"            params[\u0027includes\u0027] \u003d includes"},{"line_number":2042,"context_line":"        if state:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_93ef84e8","line":2039,"range":{"start_line":2039,"start_character":41,"end_line":2039,"end_character":57},"in_reply_to":"7f96bb07_b68647db","updated":"2018-01-22 09:14:19.000000000","message":"+1","commit_id":"866c2645d4fad4f8f450f0d40fc25f4d949d9702"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a23fec7f8b504f54ea9f4984f64eae4a8c28f4bc","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                req, shard_range.account, shard_range.container,"},{"line_number":186,"context_line":"                params\u003dparams)"},{"line_number":187,"context_line":"            if objs is None and tmp_resp:"},{"line_number":188,"context_line":"                return objs, tmp_resp"},{"line_number":189,"context_line":"        finally:"},{"line_number":190,"context_line":"            params.pop(\u0027items\u0027, None)"},{"line_number":191,"context_line":"            params[\u0027limit\u0027] \u003d limit"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_f673734c","line":188,"updated":"2017-10-18 23:32:47.000000000","message":"If there is an error, say we had an error talking to a shard, here we return the error. Is that what we want? or should we continue building the container listing for this range solely based on the newest data we could get our hands on.. the locked + holding below?","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71c01d6a81d89636a66f7ac68765cf65d1eb5c0f","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                req, shard_range.account, shard_range.container,"},{"line_number":186,"context_line":"                params\u003dparams)"},{"line_number":187,"context_line":"            if objs is None and tmp_resp:"},{"line_number":188,"context_line":"                return objs, tmp_resp"},{"line_number":189,"context_line":"        finally:"},{"line_number":190,"context_line":"            params.pop(\u0027items\u0027, None)"},{"line_number":191,"context_line":"            params[\u0027limit\u0027] \u003d limit"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_c9a2039b","line":188,"in_reply_to":"3f4b6375_f673734c","updated":"2017-10-19 18:40:00.000000000","message":"good question.\n\nIf we consider an error getting from a shard equivalent to delayed updates then yes, we could just take what the root has.\n\nBut if we want to avoid objects (or whole swathes of them) coming and going from listings then maybe we should require all contributing shards to return their pieces...or fail. That would be equivalent to a normal container backend GET filing - we return failure, not an empty list. So shoudl we here return failure, not a partial list?","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a23fec7f8b504f54ea9f4984f64eae4a8c28f4bc","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        # now get the headers from the old db + holding (shard range) db."},{"line_number":194,"context_line":"        # TODO; why are we not getting items\u003dall here too? are we assuming"},{"line_number":195,"context_line":"        # that everything in the shard must be newer then the root? what"},{"line_number":196,"context_line":"        # about old async pendings that ended up in shard?"},{"line_number":197,"context_line":"        old_objs, old_resp \u003d self._get_container_listing("},{"line_number":198,"context_line":"            req, self.account_name, self.container_name, params\u003dparams)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_16accf8a","line":195,"updated":"2017-10-18 23:32:47.000000000","message":"Hmm, I think I was assuming anything in the holding table is newer then what would be newer. But yeah old async pending could be possible.","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a23fec7f8b504f54ea9f4984f64eae4a8c28f4bc","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                return tmp_resp"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"            if not objs:"},{"line_number":337,"context_line":"                # TODO: Can we be more aggressive here, and break instead?"},{"line_number":338,"context_line":"                continue"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"            objects.extend(objs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_16760f08","line":337,"updated":"2017-10-18 23:32:47.000000000","message":"Well is it possible to have an empty shard? I assume it is, we\u0027d hope it would shrink (merge) but there could be a time it doesn\u0027t. So if there are no objects.. ok that can happen, lets move to the next and continue building the list.\n\nMaybe is can\u0027t in merge_old_new.. but in sharded state I assume there can be.","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"71c01d6a81d89636a66f7ac68765cf65d1eb5c0f","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                return tmp_resp"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"            if not objs:"},{"line_number":337,"context_line":"                # TODO: Can we be more aggressive here, and break instead?"},{"line_number":338,"context_line":"                continue"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"            objects.extend(objs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_09b25be7","line":337,"in_reply_to":"3f4b6375_16760f08","updated":"2017-10-19 18:40:00.000000000","message":"Agree, an empty list from a shard is possible an acceptable","commit_id":"9ffe585ca5d1a2c93a3afe52ea50a4abcdae451f"}]}
