)]}'
{"swift/proxy/controllers/account.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        req.params \u003d params"},{"line_number":72,"context_line":"        resp \u003d self.GETorHEAD_base("},{"line_number":73,"context_line":"            req, _(\u0027Account\u0027), node_iter, partition,"},{"line_number":74,"context_line":"            req.swift_entity_path.rstrip(\u0027/\u0027), concurrency)"},{"line_number":75,"context_line":"        if resp.status_int \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":76,"context_line":"            if resp.headers.get(\u0027X-Account-Status\u0027, \u0027\u0027).lower() \u003d\u003d \u0027deleted\u0027:"},{"line_number":77,"context_line":"                resp.status \u003d HTTP_GONE"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_23eb0ab1","side":"PARENT","line":74,"updated":"2020-02-22 21:12:04.000000000","message":"we calculate concurrency and it to node_iter above - which is already context that we\u0027re plumbing through to ResummingGetter","commit_id":"f75f5341dd436d71448d7b70a3deeed30eac475a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        partition \u003d self.app.account_ring.get_part(self.account_name)"},{"line_number":66,"context_line":"        concurrency \u003d self.app.account_ring.replica_count \\"},{"line_number":67,"context_line":"            if self.app.concurrent_gets else 1"},{"line_number":68,"context_line":"        node_iter \u003d self.app.iter_nodes(self.app.account_ring, partition,"},{"line_number":69,"context_line":"                                        concurrency\u003dconcurrency)"},{"line_number":70,"context_line":"        params \u003d req.params"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_03e60eea","line":67,"updated":"2020-02-22 21:12:04.000000000","message":"part of the reason it seemed reasonable to move the concurrency onto the node_iter instead of passing it through directly was because this diff is pretty clear.","commit_id":"0297ecfe1e271dab374c5cda7ae813fcb4c2828f"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":1368,"context_line":"        for node in self.node_iter:"},{"line_number":1369,"context_line":"            pile.spawn(self._make_node_request, node, node_timeout,"},{"line_number":1370,"context_line":"                       self.app.logger.thread_locals)"},{"line_number":1371,"context_line":"            if pile.waitfirst(self.node_iter.get_timeout()):"},{"line_number":1372,"context_line":"                break"},{"line_number":1373,"context_line":"        else:"},{"line_number":1374,"context_line":"            # ran out of nodes, see if any stragglers will finish"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_c3ca364e","line":1371,"updated":"2020-02-22 21:12:04.000000000","message":"this is the primary logic for concurrent gets - wait up to my timeout for this request to come back successfully before spawning another request\n\nBut the limit of \"inflight \u003c concurrency\" blocks us from spawning into handoffs until at least one primary comes back (maybe with an error or timeout?)\n\nTo do this in EC we\u0027ll have to count \"inflight\" requests over in other \"frag lanes\" all of which have their whole own GreenAsyncPile and ResummingGetter","commit_id":"0297ecfe1e271dab374c5cda7ae813fcb4c2828f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":1559,"context_line":"    def get_timeout(self):"},{"line_number":1560,"context_line":"        inflight \u003d sum(p.inflight for p in self.piles)"},{"line_number":1561,"context_line":"        return self.app.concurrency_timeout \\"},{"line_number":1562,"context_line":"            if inflight \u003c self.concurrency else None"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    def _node_gen(self):"},{"line_number":1565,"context_line":"        for node in self.primary_nodes:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_43dc0618","line":1562,"updated":"2020-02-22 21:12:04.000000000","message":"part of the reason it seemed reasonable to extend the context of concurrency in ResummingGetter to the NodeIter was that the NodeIter already lived in this same module.","commit_id":"0297ecfe1e271dab374c5cda7ae813fcb4c2828f"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":2302,"context_line":"            # one object server because all fragments hold all metadata"},{"line_number":2303,"context_line":"            # information about the object."},{"line_number":2304,"context_line":"            node_iter.concurrency \u003d policy.ec_ndata \\"},{"line_number":2305,"context_line":"                if self.app.concurrent_gets else 1"},{"line_number":2306,"context_line":"            resp \u003d self.GETorHEAD_base("},{"line_number":2307,"context_line":"                req, _(\u0027Object\u0027), node_iter, partition,"},{"line_number":2308,"context_line":"                req.swift_entity_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_c3cf9655","line":2305,"updated":"2020-02-22 21:12:04.000000000","message":"this is a little gross - we\u0027re re-writing the rules of node_iter\n\nThe truth is in the comment, EC HEAD is NOT like EC GET\n\nProbably _get_or_head_response should not *take* a node_iter but rather *create* one based off the method","commit_id":"0297ecfe1e271dab374c5cda7ae813fcb4c2828f"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            return conn"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        with mock.patch(\u0027swift.proxy.server.Application.iter_nodes\u0027,"},{"line_number":1067,"context_line":"                        fake_iter_nodes):"},{"line_number":1068,"context_line":"            with mock.patch(\u0027swift.common.bufferedhttp.http_connect_raw\u0027,"},{"line_number":1069,"context_line":"                            myfake_http_connect_raw):"},{"line_number":1070,"context_line":"                app_conf \u003d {\u0027concurrent_gets\u0027: \u0027on\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_83d99e23","side":"PARENT","line":1067,"updated":"2020-02-22 21:12:04.000000000","message":"mostly this was just a de-dent because I removed this mock.patch and just monkey-patch iter_nodes on the created instance of the baseapp","commit_id":"f75f5341dd436d71448d7b70a3deeed30eac475a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"50a59aeb39b7b3d2935c7132e8220761e1d0ef3a","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"            def fake_iter_nodes(ring, partition, node_iter\u003dNone, policy\u003dNone,"},{"line_number":1074,"context_line":"                                concurrency\u003d1):"},{"line_number":1075,"context_line":"                node_iter \u003d iter(nodes)"},{"line_number":1076,"context_line":"                baseapp.sort_nodes \u003d lambda nodes, **kwargs: nodes"},{"line_number":1077,"context_line":"                return NodeIter(baseapp, ring, partition, node_iter\u003dnode_iter,"},{"line_number":1078,"context_line":"                                policy\u003dpolicy, concurrency\u003dconcurrency)"},{"line_number":1079,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1fa4df85_e3cc1263","line":1076,"updated":"2020-02-22 21:12:04.000000000","message":"I spent a good amount of time debugging the re-sorting that happens in NodeIter based on timing","commit_id":"0297ecfe1e271dab374c5cda7ae813fcb4c2828f"}]}
