)]}'
{"swift/common/middleware/ratelimit.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"09c47b228b51c8f3853be4d197d637443f50e144","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                                      container_name)"},{"line_number":119,"context_line":"            container_info \u003d self.memcache_client.get(memcache_key)"},{"line_number":120,"context_line":"            if isinstance(container_info, dict):"},{"line_number":121,"context_line":"                container_size \u003d container_info.get(\u0027count\u0027, 0)"},{"line_number":122,"context_line":"                container_rate \u003d self.get_container_maxrate(container_size)"},{"line_number":123,"context_line":"                if container_rate:"},{"line_number":124,"context_line":"                    keys.append((\"ratelimit/%s/%s\" % (account_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FeTA%3D","line":121,"updated":"2012-09-07 19:54:58.000000000","message":"Should this cache access also have a backwards-compatible check for a key named \"container_size\"?","commit_id":"43ad51ab91099919a5458576bcddd71daa7b1075"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"09c47b228b51c8f3853be4d197d637443f50e144","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        :param container: container name to look up"},{"line_number":269,"context_line":"        :returns: dict containing container partition, container nodes,"},{"line_number":270,"context_line":"                  container read acl, container write acl, container sync key."},{"line_number":271,"context_line":"                  Values are set to None if the container does not exist"},{"line_number":272,"context_line":"        \"\"\""},{"line_number":273,"context_line":"        part, nodes \u003d self.app.container_ring.get_nodes(account, container)"},{"line_number":274,"context_line":"        path \u003d \u0027/%s/%s\u0027 % (account, container)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FeSk%3D","line":271,"updated":"2012-09-07 19:54:58.000000000","message":"It\u0027s probably not a big deal, but it looks like the container HEAD status was in the cache, but not returned.  Now it\u0027s also returned.\n\nSeems like either the return value documentation should mention the \"status\" key or it should get stripped from the returned dict.","commit_id":"43ad51ab91099919a5458576bcddd71daa7b1075"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c662992f088c4a7dcd47da9d86af0cc998dbbed9","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            return container_info"},{"line_number":296,"context_line":"        attempts_left \u003d len(nodes)"},{"line_number":297,"context_line":"        headers \u003d {\u0027x-trans-id\u0027: self.trans_id, \u0027Connection\u0027: \u0027close\u0027}"},{"line_number":298,"context_line":"        for node in self.iter_nodes(part, nodes, self.app.container_ring):"},{"line_number":299,"context_line":"            if attempts_left \u003c\u003d 0:"},{"line_number":300,"context_line":"                break"},{"line_number":301,"context_line":"            attempts_left -\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FeLE%3D","line":298,"updated":"2012-09-07 21:05:07.000000000","message":"I think this change goofs up handoff logging.\n\nCheck out how iter_nodes does logging; when the iterator yields a handoff node, it increments handoff_count (line 371).\n\nChanging this to a for-loop-and-break means that, even in the case where you don\u0027t use any handoff nodes, you\u0027ll log one handoff_count stat because the for loop will pull a handoff node out of the iterator and then drop it on the floor.","commit_id":"f2e26b2a75fdd3cf7126a1243b38d7ca6067fc97"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"552e9ce6b6bfbe3e3a6e9946bff0da3ef7f8be31","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            return container_info"},{"line_number":296,"context_line":"        attempts_left \u003d len(nodes)"},{"line_number":297,"context_line":"        headers \u003d {\u0027x-trans-id\u0027: self.trans_id, \u0027Connection\u0027: \u0027close\u0027}"},{"line_number":298,"context_line":"        for node in self.iter_nodes(part, nodes, self.app.container_ring):"},{"line_number":299,"context_line":"            if attempts_left \u003c\u003d 0:"},{"line_number":300,"context_line":"                break"},{"line_number":301,"context_line":"            attempts_left -\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FeF8%3D","line":298,"in_reply_to":"AAAALH%2F%2FeIM%3D","updated":"2012-09-07 22:23:53.000000000","message":"Ah, right; I missed that.","commit_id":"f2e26b2a75fdd3cf7126a1243b38d7ca6067fc97"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7f57c1a8d19d3249e7b73c88487037f13341d0da","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            return container_info"},{"line_number":296,"context_line":"        attempts_left \u003d len(nodes)"},{"line_number":297,"context_line":"        headers \u003d {\u0027x-trans-id\u0027: self.trans_id, \u0027Connection\u0027: \u0027close\u0027}"},{"line_number":298,"context_line":"        for node in self.iter_nodes(part, nodes, self.app.container_ring):"},{"line_number":299,"context_line":"            if attempts_left \u003c\u003d 0:"},{"line_number":300,"context_line":"                break"},{"line_number":301,"context_line":"            attempts_left -\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FeIM%3D","line":298,"in_reply_to":"AAAALH%2F%2FeJY%3D","updated":"2012-09-07 21:50:37.000000000","message":"It\u0027s not so much a node iterator without handoffs as it is a node iterator that only returns a certain number of nodes. iter_nodes will return handoff nodes if any of the primaries are error limited. That could be accomplished with e.g. `itertools.islice(self.iter_nodes(...), 0, attempts_left)`.","commit_id":"f2e26b2a75fdd3cf7126a1243b38d7ca6067fc97"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"1e27000905bd2decabfeedd115a732c0aa1f48bd","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            return container_info"},{"line_number":296,"context_line":"        attempts_left \u003d len(nodes)"},{"line_number":297,"context_line":"        headers \u003d {\u0027x-trans-id\u0027: self.trans_id, \u0027Connection\u0027: \u0027close\u0027}"},{"line_number":298,"context_line":"        for node in self.iter_nodes(part, nodes, self.app.container_ring):"},{"line_number":299,"context_line":"            if attempts_left \u003c\u003d 0:"},{"line_number":300,"context_line":"                break"},{"line_number":301,"context_line":"            attempts_left -\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FeJY%3D","line":298,"in_reply_to":"AAAALH%2F%2FeLE%3D","updated":"2012-09-07 21:32:02.000000000","message":"Semantically, what\u0027s desired is a node iterator which doesn\u0027t try to hand-off.  What about a \"handoff\" kwarg to iter_nodes() which defaults to True.  If you want to iterate over nodes w/o handoff, you call iter_nodes() with handoff\u003dFalse.\n\nI think that could get rid of \"attempts_left\" stuff since that seems to just be there to stop iter_nodes() before it starts yielding hand-off locations.","commit_id":"f2e26b2a75fdd3cf7126a1243b38d7ca6067fc97"}],"test/unit/common/middleware/test_ratelimit.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"09c47b228b51c8f3853be4d197d637443f50e144","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        conf_dict \u003d {\u0027account_ratelimit\u0027: current_rate,"},{"line_number":184,"context_line":"                     \u0027container_ratelimit_3\u0027: 200}"},{"line_number":185,"context_line":"        fake_memcache \u003d FakeMemcache()"},{"line_number":186,"context_line":"        fake_memcache.store[get_container_memcache_key(\u0027a\u0027, \u0027c\u0027)] \u003d \\"},{"line_number":187,"context_line":"            {\u0027count\u0027: 5}"},{"line_number":188,"context_line":"        the_app \u003d ratelimit.RateLimitMiddleware(None, conf_dict,"},{"line_number":189,"context_line":"                                                logger\u003dFakeLogger())"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FeSU%3D","line":186,"updated":"2012-09-07 19:54:58.000000000","message":"Test that the new code can read an old key (\"container_size\")?","commit_id":"43ad51ab91099919a5458576bcddd71daa7b1075"}]}
