)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b86c312918086dd77b55c5706b971de5930b3f7e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":"If operators have enabled the bulk or slo middlewares and would like to"},{"line_number":24,"context_line":"preserve the prior (single-threaded) DELETE behavior, they must add the"},{"line_number":25,"context_line":"following line to their filter config sections:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   delete_concurrency \u003d 1"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bab6814e_c5ba5871","line":25,"updated":"2016-05-24 01:01:39.000000000","message":"It\u0027d be nice to say *which* filter config sections. Just something like \"[filter:slo] and [filter:bulk]\" is good enough.","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":"If operators have enabled the bulk or slo middlewares and would like to"},{"line_number":24,"context_line":"preserve the prior (single-threaded) DELETE behavior, they must add the"},{"line_number":25,"context_line":"following line to their filter config sections:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   delete_concurrency \u003d 1"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bab6814e_22451017","line":25,"in_reply_to":"bab6814e_c5ba5871","updated":"2016-05-24 04:41:36.000000000","message":"Done","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"c1618b054c10d95a0b19d40ed979541d4aeaa96a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"preserve the prior (single-threaded) DELETE behavior, they must add the"},{"line_number":25,"context_line":"following line to their filter config sections:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   delete_concurrency \u003d 1"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"This may be done prior to upgrading Swift."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bab6814e_b9614314","line":27,"updated":"2016-05-23 21:57:23.000000000","message":"should the default change now or should we default it to 1 and later bump it?","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":24,"context_line":"preserve the prior (single-threaded) DELETE behavior, they must add the"},{"line_number":25,"context_line":"following line to their filter config sections:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   delete_concurrency \u003d 1"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"This may be done prior to upgrading Swift."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bab6814e_225cf0ec","line":27,"in_reply_to":"bab6814e_b9614314","updated":"2016-05-24 04:41:36.000000000","message":"I had it default to 1 originally. Sam persuaded me that the danger in using 2 is minimal, and you\u0027ll still get a decent performance boost.","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"e613ef4577d31e6e66726e893ebdf22f12c2a864","unresolved":false,"context_lines":[{"line_number":638,"context_line":"#"},{"line_number":639,"context_line":"# To speed up the bulk delete process, multiple deletes may be executed in"},{"line_number":640,"context_line":"# parallel. Use caution when changing this from the default, as it gives"},{"line_number":641,"context_line":"# clients a force multiplier which may be used in DoS attacks."},{"line_number":642,"context_line":"# delete_concurrency \u003d 1"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"# Note: Put after auth and staticweb in the pipeline."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"1a122d0e_943fd986","line":641,"updated":"2016-05-03 00:23:51.000000000","message":"Well that just sounds scary as hell. IMO, just caution against turning it up too high. I don\u0027t think you\u0027re gonna kill your cluster by setting this to 2 or 3.\n\nThis is getting into the realm of pure opinion, though.","commit_id":"bd87cdc89e72b1bc3a02c4dd20d7d0f54659b5c9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d1c47dfe1e73d0fc816781619e8ed1365ad4590","unresolved":false,"context_lines":[{"line_number":638,"context_line":"#"},{"line_number":639,"context_line":"# To speed up the bulk delete process, multiple deletes may be executed in"},{"line_number":640,"context_line":"# parallel. Use caution when changing this from the default, as it gives"},{"line_number":641,"context_line":"# clients a force multiplier which may be used in DoS attacks."},{"line_number":642,"context_line":"# delete_concurrency \u003d 1"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"# Note: Put after auth and staticweb in the pipeline."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"1a122d0e_eee45aad","line":641,"in_reply_to":"1a122d0e_943fd986","updated":"2016-05-03 20:55:55.000000000","message":"Done","commit_id":"bd87cdc89e72b1bc3a02c4dd20d7d0f54659b5c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"c1618b054c10d95a0b19d40ed979541d4aeaa96a","unresolved":false,"context_lines":[{"line_number":659,"context_line":"# To speed up the bulk delete process, multiple deletes may be executed in"},{"line_number":660,"context_line":"# parallel. Avoid setting this too high, as it gives clients a force multiplier"},{"line_number":661,"context_line":"# which may be used in DoS attacks. The suggested range is between 2 and 10."},{"line_number":662,"context_line":"# delete_concurrency \u003d 2"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"# Note: Put after auth and staticweb in the pipeline."},{"line_number":665,"context_line":"# If you don\u0027t put it in the pipeline, it will be inserted for you."}],"source_content_type":"application/octet-stream","patch_set":8,"id":"bab6814e_19220f02","line":662,"updated":"2016-05-23 21:57:23.000000000","message":"twice? maybe move to the DEFAULT section?\n\nhmmm...no. Instead of moving it to the default section, the comment on this one should probably be more specific to the actual SLO delete functionality instead of \"the bulk delete process\"","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":659,"context_line":"# To speed up the bulk delete process, multiple deletes may be executed in"},{"line_number":660,"context_line":"# parallel. Avoid setting this too high, as it gives clients a force multiplier"},{"line_number":661,"context_line":"# which may be used in DoS attacks. The suggested range is between 2 and 10."},{"line_number":662,"context_line":"# delete_concurrency \u003d 2"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"# Note: Put after auth and staticweb in the pipeline."},{"line_number":665,"context_line":"# If you don\u0027t put it in the pipeline, it will be inserted for you."}],"source_content_type":"application/octet-stream","patch_set":8,"id":"bab6814e_fc3e0ed9","line":662,"in_reply_to":"bab6814e_19220f02","updated":"2016-05-24 04:41:36.000000000","message":"Done","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"}],"swift/common/middleware/bulk.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"5cd08c280a9c1998ea88e4c633f251a3848bbab9","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                            last_yield \u003d time()"},{"line_number":454,"context_line":"                            yield \u0027 \u0027"},{"line_number":455,"context_line":"                        if len(failed_files) \u003e\u003d self.max_failed_deletes:"},{"line_number":456,"context_line":"                            for resp, obj_name, retry in pile:"},{"line_number":457,"context_line":"                                if last_yield + self.yield_frequency \u003c time():"},{"line_number":458,"context_line":"                                    separator \u003d \u0027\\r\\n\\r\\n\u0027"},{"line_number":459,"context_line":"                                    last_yield \u003d time()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_d707671a","line":456,"updated":"2016-05-09 04:03:45.000000000","message":"If you look at the effect this for loop has on test_bulk_delete_max_failures, the length of the resulting \u0027Errors\u0027 is one larger than the \u0027max_failed_deletes\u0027.  That test does not assert the size of \u0027Errors\u0027, but if my thinking is correct, the test should assert that the size is equal to the \u0027max_failed_deletes\u0027, and this for loop would be removed.  Was there a need to run through this logic after the max number had been exceeded?","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6f36c6ed78384e56aa8258d4549fc73916992882","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                            last_yield \u003d time()"},{"line_number":454,"context_line":"                            yield \u0027 \u0027"},{"line_number":455,"context_line":"                        if len(failed_files) \u003e\u003d self.max_failed_deletes:"},{"line_number":456,"context_line":"                            for resp, obj_name, retry in pile:"},{"line_number":457,"context_line":"                                if last_yield + self.yield_frequency \u003c time():"},{"line_number":458,"context_line":"                                    separator \u003d \u0027\\r\\n\\r\\n\u0027"},{"line_number":459,"context_line":"                                    last_yield \u003d time()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_fb469f4d","line":456,"in_reply_to":"dab17558_d707671a","updated":"2016-05-10 07:51:59.000000000","message":"This loop is actually waiting for whatever requests are still running in the pile to complete and be processed.\n\nSo I don\u0027t think there is a strict limit on there being only max_failed_deletes in Errors, only that it triggers an end to the bulk delete i.e no more are processed but let those that are already running complete (and are not aloud to retry).","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ea01dce0fd9d9e5c55d894a5a4bcb116eac5fcfe","unresolved":false,"context_lines":[{"line_number":453,"context_line":"                            last_yield \u003d time()"},{"line_number":454,"context_line":"                            yield \u0027 \u0027"},{"line_number":455,"context_line":"                        if len(failed_files) \u003e\u003d self.max_failed_deletes:"},{"line_number":456,"context_line":"                            for resp, obj_name, retry in pile:"},{"line_number":457,"context_line":"                                if last_yield + self.yield_frequency \u003c time():"},{"line_number":458,"context_line":"                                    separator \u003d \u0027\\r\\n\\r\\n\u0027"},{"line_number":459,"context_line":"                                    last_yield \u003d time()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_0a8af81a","line":456,"in_reply_to":"dab17558_fb469f4d","updated":"2016-05-11 03:59:58.000000000","message":"Like Matt said, this is just to clean up in-progress requests, whose states are unknown. Added a comment to that effect.\n\nThis discussion made me realize I could tighten the code up slightly, so that having delete_concurrency\u003d\u003d1 will imply len(Errors)\u003d\u003dmax_failed_deletes; that\u0027ll also be in the next patchset.","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"c1618b054c10d95a0b19d40ed979541d4aeaa96a","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        return None"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"class Bulk(object):"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def __init__(self, app, conf, max_containers_per_extraction\u003d10000,"},{"line_number":277,"context_line":"                 max_failed_extractions\u003d1000, max_deletes_per_request\u003d10000,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_2a08532d","line":274,"updated":"2016-05-23 21:57:23.000000000","message":"Since this is used both by bulk and slo, should this get extracted out of this middleware at some point?","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b86c312918086dd77b55c5706b971de5930b3f7e","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        return None"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"class Bulk(object):"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def __init__(self, app, conf, max_containers_per_extraction\u003d10000,"},{"line_number":277,"context_line":"                 max_failed_extractions\u003d1000, max_deletes_per_request\u003d10000,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_cdc55e0b","line":274,"in_reply_to":"bab6814e_2a08532d","updated":"2016-05-24 01:01:39.000000000","message":"There\u0027s some argument to split it up into the middleware piece (with the __call__ method) and some shared helpers, but IMO that can be left to a future commit.","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"3d5513ad94368e39b3d7f17c688b162345978783","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            failed_file_response \u003d {\u0027type\u0027: HTTPBadRequest}"},{"line_number":402,"context_line":"            req.environ[\u0027eventlet.minimum_write_chunk_size\u0027] \u003d 0"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"            def delete_filter(predicate, objs_to_delete):"},{"line_number":405,"context_line":"                for obj_to_delete in objs_to_delete:"},{"line_number":406,"context_line":"                    obj_name \u003d obj_to_delete[\u0027name\u0027]"},{"line_number":407,"context_line":"                    if not obj_name:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_ed01426c","line":404,"updated":"2016-05-23 23:56:17.000000000","message":"delete_filter() and delete_filters() as nested functions are really hard to unit test.","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            failed_file_response \u003d {\u0027type\u0027: HTTPBadRequest}"},{"line_number":402,"context_line":"            req.environ[\u0027eventlet.minimum_write_chunk_size\u0027] \u003d 0"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"            def delete_filter(predicate, objs_to_delete):"},{"line_number":405,"context_line":"                for obj_to_delete in objs_to_delete:"},{"line_number":406,"context_line":"                    obj_name \u003d obj_to_delete[\u0027name\u0027]"},{"line_number":407,"context_line":"                    if not obj_name:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_421f745b","line":404,"in_reply_to":"bab6814e_ed01426c","updated":"2016-05-24 04:41:36.000000000","message":"But without the benefit of the closure, we get\n- a lot of extra baggage being carried around (resp_dict, failed_files, vrs, account) and\n- an even uglier diff to try to verify that nothing fundamentally changed.\n\nI tried making them class methods; the first one killed it for me.","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"c1618b054c10d95a0b19d40ed979541d4aeaa96a","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                        continue"},{"line_number":425,"context_line":"                    yield (obj_name, delete_path)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"            def delete_filters(objs_to_delete):"},{"line_number":428,"context_line":"                # process all objects first"},{"line_number":429,"context_line":"                yield delete_filter(lambda name: \u0027/\u0027 in name.strip(\u0027/\u0027),"},{"line_number":430,"context_line":"                                    objs_to_delete)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_84c7b663","line":427,"updated":"2016-05-23 21:57:23.000000000","message":"oh, this one ends in an \"s\". totally different","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b86c312918086dd77b55c5706b971de5930b3f7e","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                        continue"},{"line_number":425,"context_line":"                    yield (obj_name, delete_path)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"            def delete_filters(objs_to_delete):"},{"line_number":428,"context_line":"                # process all objects first"},{"line_number":429,"context_line":"                yield delete_filter(lambda name: \u0027/\u0027 in name.strip(\u0027/\u0027),"},{"line_number":430,"context_line":"                                    objs_to_delete)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_fa70d6de","line":427,"in_reply_to":"bab6814e_84c7b663","updated":"2016-05-24 01:01:39.000000000","message":"at least it\u0027s not delete_filter\u0027s","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                        continue"},{"line_number":425,"context_line":"                    yield (obj_name, delete_path)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"            def delete_filters(objs_to_delete):"},{"line_number":428,"context_line":"                # process all objects first"},{"line_number":429,"context_line":"                yield delete_filter(lambda name: \u0027/\u0027 in name.strip(\u0027/\u0027),"},{"line_number":430,"context_line":"                                    objs_to_delete)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_024c4c75","line":427,"in_reply_to":"bab6814e_fa70d6de","updated":"2016-05-24 04:41:36.000000000","message":"Done","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"409280744acc0799b23509f925252d2f6a934594","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                        continue"},{"line_number":425,"context_line":"                    yield (obj_name, delete_path)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"            def objs_then_containers(objs_to_delete):"},{"line_number":428,"context_line":"                # process all objects first"},{"line_number":429,"context_line":"                yield delete_filter(lambda name: \u0027/\u0027 in name.strip(\u0027/\u0027),"},{"line_number":430,"context_line":"                                    objs_to_delete)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_ddd5cf1b","line":427,"updated":"2016-05-24 23:25:21.000000000","message":"nice :-)","commit_id":"e09c4ee7800e82aa09ca2f6ae375420b766182a4"}],"swift/common/utils.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"e613ef4577d31e6e66726e893ebdf22f12c2a864","unresolved":false,"context_lines":[{"line_number":2603,"context_line":"            yield result"},{"line_number":2604,"context_line":""},{"line_number":2605,"context_line":"    def __enter__(self):"},{"line_number":2606,"context_line":"        return self"},{"line_number":2607,"context_line":""},{"line_number":2608,"context_line":"    def __exit__(self, type, value, traceback):"},{"line_number":2609,"context_line":"        self.pool.__exit__(type, value, traceback)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_54cee1b7","line":2606,"updated":"2016-05-03 00:23:51.000000000","message":"For the sake of future-us, we should have a call to self.pool.__enter__() in here. I know it doesn\u0027t currently do anything, but having an __exit__ without an __enter__ seems like a bug waiting to happen.","commit_id":"bd87cdc89e72b1bc3a02c4dd20d7d0f54659b5c9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d1c47dfe1e73d0fc816781619e8ed1365ad4590","unresolved":false,"context_lines":[{"line_number":2603,"context_line":"            yield result"},{"line_number":2604,"context_line":""},{"line_number":2605,"context_line":"    def __enter__(self):"},{"line_number":2606,"context_line":"        return self"},{"line_number":2607,"context_line":""},{"line_number":2608,"context_line":"    def __exit__(self, type, value, traceback):"},{"line_number":2609,"context_line":"        self.pool.__exit__(type, value, traceback)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_f3f1e396","line":2606,"in_reply_to":"1a122d0e_54cee1b7","updated":"2016-05-03 20:55:55.000000000","message":"Good call. Done.","commit_id":"bd87cdc89e72b1bc3a02c4dd20d7d0f54659b5c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"c1618b054c10d95a0b19d40ed979541d4aeaa96a","unresolved":false,"context_lines":[{"line_number":2603,"context_line":"    __next__ \u003d next"},{"line_number":2604,"context_line":""},{"line_number":2605,"context_line":""},{"line_number":2606,"context_line":"class StreamingPile(GreenAsyncPile):"},{"line_number":2607,"context_line":"    def __init__(self, size):"},{"line_number":2608,"context_line":"        self.pool \u003d ContextPool(size)"},{"line_number":2609,"context_line":"        super(StreamingPile, self).__init__(self.pool)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_aa660327","line":2606,"updated":"2016-05-23 21:57:23.000000000","message":"some docstrings for the class and for asyncstarmap would be good","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3b6557bcf087b861055d6ce0b0e7aca5c250d94","unresolved":false,"context_lines":[{"line_number":2603,"context_line":"    __next__ \u003d next"},{"line_number":2604,"context_line":""},{"line_number":2605,"context_line":""},{"line_number":2606,"context_line":"class StreamingPile(GreenAsyncPile):"},{"line_number":2607,"context_line":"    def __init__(self, size):"},{"line_number":2608,"context_line":"        self.pool \u003d ContextPool(size)"},{"line_number":2609,"context_line":"        super(StreamingPile, self).__init__(self.pool)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab6814e_02cf2cb4","line":2606,"in_reply_to":"bab6814e_aa660327","updated":"2016-05-24 04:41:36.000000000","message":"Done","commit_id":"701e8a8010653c2d92224aa3b6fa0daacc35c3da"}],"test/unit/common/middleware/test_bulk.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ea01dce0fd9d9e5c55d894a5a4bcb116eac5fcfe","unresolved":false,"context_lines":[{"line_number":612,"context_line":""},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"class TestDelete(unittest.TestCase):"},{"line_number":615,"context_line":"    conf \u003d {}"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"    def setUp(self):"},{"line_number":618,"context_line":"        self.app \u003d FakeApp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_99d3e3d4","line":615,"updated":"2016-05-11 03:59:58.000000000","message":"I also realized that I lost my serial tests when I changed the default delete_concurrency to 2. Will fix here.","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"5cd08c280a9c1998ea88e4c633f251a3848bbab9","unresolved":false,"context_lines":[{"line_number":901,"context_line":"            self.assertEqual(resp_data[\u0027Response Body\u0027],"},{"line_number":902,"context_line":"                             \u0027Max delete failures exceeded\u0027)"},{"line_number":903,"context_line":"            self.assertIn([\u0027/c/f1\u0027, \u0027401 Unauthorized\u0027], resp_data[\u0027Errors\u0027])"},{"line_number":904,"context_line":"            self.assertIn([\u0027/c/f2\u0027, \u0027401 Unauthorized\u0027], resp_data[\u0027Errors\u0027])"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"class TestConcurrentDelete(TestDelete):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_373b52d3","line":904,"updated":"2016-05-09 04:03:45.000000000","message":"Should the length of \u0027Errors\u0027 be asserted here as self.assertEqual(len(resp_data[\u0027Errors\u0027]), 2)?  This related to the comment in bulk.py","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ea01dce0fd9d9e5c55d894a5a4bcb116eac5fcfe","unresolved":false,"context_lines":[{"line_number":901,"context_line":"            self.assertEqual(resp_data[\u0027Response Body\u0027],"},{"line_number":902,"context_line":"                             \u0027Max delete failures exceeded\u0027)"},{"line_number":903,"context_line":"            self.assertIn([\u0027/c/f1\u0027, \u0027401 Unauthorized\u0027], resp_data[\u0027Errors\u0027])"},{"line_number":904,"context_line":"            self.assertIn([\u0027/c/f2\u0027, \u0027401 Unauthorized\u0027], resp_data[\u0027Errors\u0027])"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"class TestConcurrentDelete(TestDelete):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_c38e1b78","line":904,"in_reply_to":"dab17558_373b52d3","updated":"2016-05-11 03:59:58.000000000","message":"With the concurrency, we can\u0027t be certain it\u0027ll be two. In TestConcurrentDelete, we\u0027ll still have two outstanding requests that should be counted, and they may have succeeded or failed.\n\nSince we know *all* of the requests will fail in this test, we could check that we have *exactly* `max_failed_deletes + delete_concurrency - 1` Errors, but I think I prefer the ambiguity of the assertGreater/assertLess. Will add a comment about that though.","commit_id":"0267098c9f05d710253dc1ba5611a8c3282d4546"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"409280744acc0799b23509f925252d2f6a934594","unresolved":false,"context_lines":[{"line_number":964,"context_line":"        filter_app \u003d bulk.filter_factory(conf)(FakeApp())"},{"line_number":965,"context_line":"        self.assertEqual(1000, filter_app.delete_concurrency)"},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"        # ...unless it\u0027s extra-stupid-high, in which case we cap it"},{"line_number":968,"context_line":"        conf \u003d {\u0027delete_concurrency\u0027: \u00271001\u0027}"},{"line_number":969,"context_line":"        filter_app \u003d bulk.filter_factory(conf)(FakeApp())"},{"line_number":970,"context_line":"        self.assertEqual(1000, filter_app.delete_concurrency)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_7de78312","line":967,"updated":"2016-05-24 23:25:21.000000000","message":"lol","commit_id":"e09c4ee7800e82aa09ca2f6ae375420b766182a4"}]}
