)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bba5c772de29eb9477c8a4945ad55e56f1a25116","unresolved":false,"context_lines":[{"line_number":2125,"context_line":"        \"\"\""},{"line_number":2126,"context_line":"        self.policy \u003d policy"},{"line_number":2127,"context_line":"        self.buckets \u003d {}"},{"line_number":2128,"context_line":"        self.bad_buckets \u003d {0: ECGetResponseBucket(self.policy, None)}"},{"line_number":2129,"context_line":"        self.node_iter_count \u003d 0"},{"line_number":2130,"context_line":""},{"line_number":2131,"context_line":"    def _get_bucket(self, timestamp):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f65232a_c523fd04","line":2128,"updated":"2020-10-21 17:54:46.000000000","message":"i forget what this default is used for exactly, 500/503 might be better if None doesn\u0027t work - we need to get a failing py3 test together","commit_id":"c993b8090513424d50ce59d14d2dc01100f90cfe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2d9d8851d9a2cc5ff3b7a19f87b78e187f46a59b","unresolved":true,"context_lines":[{"line_number":2128,"context_line":"        # there is an initial \u0027dummy\u0027 bad bucket which is never populated with"},{"line_number":2129,"context_line":"        # responses and will therefore always have maximum shortfall; this is"},{"line_number":2130,"context_line":"        # for convenience so that least_bad_bucket will always return a bucket"},{"line_number":2131,"context_line":"        self.bad_buckets \u003d {0: ECGetResponseBucket(self.policy, None)}"},{"line_number":2132,"context_line":"        self.node_iter_count \u003d 0"},{"line_number":2133,"context_line":""},{"line_number":2134,"context_line":"    def _get_bucket(self, timestamp):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6ec50559_b085f910","line":2131,"updated":"2020-12-17 23:47:55.000000000","message":"Now you\u0027ve got me wondering if we should initialize this to an empty dict and do something like\n\n        if all(status \u003d\u003d 404 for status in self.bad_buckets):\n            # Make up an empty bucket\n            return ECGetResponseBucket(self.policy, None)\n\nfirst thing in least_bad_bucket...","commit_id":"c73606c7315bc200fdeeac04aba8c25f07296710"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ba80473a9426a9bfe71d75c21a3dddcebe621c7b","unresolved":false,"context_lines":[{"line_number":2128,"context_line":"        # there is an initial \u0027dummy\u0027 bad bucket which is never populated with"},{"line_number":2129,"context_line":"        # responses and will therefore always have maximum shortfall; this is"},{"line_number":2130,"context_line":"        # for convenience so that least_bad_bucket will always return a bucket"},{"line_number":2131,"context_line":"        self.bad_buckets \u003d {0: ECGetResponseBucket(self.policy, None)}"},{"line_number":2132,"context_line":"        self.node_iter_count \u003d 0"},{"line_number":2133,"context_line":""},{"line_number":2134,"context_line":"    def _get_bucket(self, timestamp):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a372f44_507ccddc","line":2131,"in_reply_to":"6a2f4f6e_3f9273ac","updated":"2021-01-09 00:57:42.000000000","message":"Done","commit_id":"c73606c7315bc200fdeeac04aba8c25f07296710"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ed5ab4695c891cb2a6a98340863f8eda248e88ba","unresolved":true,"context_lines":[{"line_number":2128,"context_line":"        # there is an initial \u0027dummy\u0027 bad bucket which is never populated with"},{"line_number":2129,"context_line":"        # responses and will therefore always have maximum shortfall; this is"},{"line_number":2130,"context_line":"        # for convenience so that least_bad_bucket will always return a bucket"},{"line_number":2131,"context_line":"        self.bad_buckets \u003d {0: ECGetResponseBucket(self.policy, None)}"},{"line_number":2132,"context_line":"        self.node_iter_count \u003d 0"},{"line_number":2133,"context_line":""},{"line_number":2134,"context_line":"    def _get_bucket(self, timestamp):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6a2f4f6e_3f9273ac","line":2131,"in_reply_to":"6ec50559_b085f910","updated":"2020-12-18 09:14:29.000000000","message":"I might add a default_bad_bucket attribute to return in this case rather than constructing a new one every time least_bad_bucket is called. But, yes, it does seem like the distraction in the bad_buckets init could be avoided","commit_id":"c73606c7315bc200fdeeac04aba8c25f07296710"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a6bda5b544facd120ab22842efe584c87a3b089a","unresolved":true,"context_lines":[{"line_number":2125,"context_line":"        \"\"\""},{"line_number":2126,"context_line":"        self.policy \u003d policy"},{"line_number":2127,"context_line":"        self.buckets \u003d {}"},{"line_number":2128,"context_line":"        self.bad_buckets \u003d {None: ECGetResponseBucket(self.policy, None)}"},{"line_number":2129,"context_line":"        self.node_iter_count \u003d 0"},{"line_number":2130,"context_line":""},{"line_number":2131,"context_line":"    def _get_bucket(self, timestamp):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f3963b6d_7e61fd33","side":"PARENT","line":2128,"updated":"2021-01-11 16:38:39.000000000","message":"yeah i guess it was kinda janking letting min order this with the ints","commit_id":"127bf9707c383ac737fce9f243bcc8f6655910df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a6bda5b544facd120ab22842efe584c87a3b089a","unresolved":true,"context_lines":[{"line_number":2256,"context_line":"        Return the bad_bucket with the smallest shortfall"},{"line_number":2257,"context_line":"        \"\"\""},{"line_number":2258,"context_line":"        if all(status \u003d\u003d 404 for status in self.bad_buckets):"},{"line_number":2259,"context_line":"            # NB: also covers an empty self.bad_buckets"},{"line_number":2260,"context_line":"            return self.default_bad_bucket"},{"line_number":2261,"context_line":"        # we want \"enough\" 416s to prevent \"extra\" requests - but we keep"},{"line_number":2262,"context_line":"        # digging on 404s"}],"source_content_type":"text/x-python","patch_set":3,"id":"8c6114fd_0a9cb43d","line":2259,"updated":"2021-01-11 16:38:39.000000000","message":"helpful comment!\n\n\t\u003e\u003e\u003e all([])\n\tTrue","commit_id":"a5fa3cfcafbc6a441139b6e9bccc06bf38042d64"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a6bda5b544facd120ab22842efe584c87a3b089a","unresolved":true,"context_lines":[{"line_number":4028,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":4029,"context_line":""},{"line_number":4030,"context_line":"        self.assertEqual(resp.status_int, 412)"},{"line_number":4031,"context_line":"        self.assertEqual(len(log), 2 * 8)"},{"line_number":4032,"context_line":""},{"line_number":4033,"context_line":"    def test_GET_with_success_and_507_will_503(self):"},{"line_number":4034,"context_line":"        responses \u003d [  # only 9 good nodes"}],"source_content_type":"text/x-python","patch_set":3,"id":"466f1c61_796f6d67","line":4031,"updated":"2021-01-11 16:38:39.000000000","message":"FAIL: test_GET_ndata_equals_nparity_with_missing_and_errors (test.unit.proxy.controllers.test_obj.TestECObjController)\n\t----------------------------------------------------------------------\n\tTraceback (most recent call last):\n\t  File \"/home/vagrant/swift/test/unit/__init__.py\", line 199, in mywrapper\n\t    return f(*args, **kwargs)\n\t  File \"/home/vagrant/swift/test/unit/proxy/controllers/test_obj.py\", line 4030, in test_GET_ndata_equals_nparity_with_missing_and_errors\n\t    self.assertEqual(resp.status_int, 412)\n\tAssertionError: 500 !\u003d 412\n\t-------------------- \u003e\u003e begin captured stdout \u003c\u003c ---------------------\n\tproxy-server DEBUG: Loaded override config for (default): ProxyOverrideOptions({}, {\u0027sorting_method\u0027: \u0027shuffle\u0027, \u0027read_affinity\u0027: \u0027\u0027, \u0027write_affinity\u0027: \u0027\u0027, \u0027write_affinity_node_count\u0027: \u00272 * replicas\u0027, \u0027write_affinity_handoff_delete_count\u0027: None, \u0027rebalance_missing_suppression_count\u0027: 1, \u0027concurrent_gets\u0027: False, \u0027concurrency_timeout\u0027: 1.0, \u0027concurrent_ec_extra_requests\u0027: 0}, app) (txn: txn1) (client_ip: 127.0.0.2)\n\tproxy-server ERROR: ERROR Unhandled exception in request: \n\tTraceback (most recent call last):\n\t  File \"/home/vagrant/swift/swift/proxy/server.py\", line 586, in handle_request\n\t    return handler(req)\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/base.py\", line 292, in wrapped\n\t    return func(*a, **kw)\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/obj.py\", line 268, in GET\n\t    return self.GETorHEAD(req)\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/obj.py\", line 256, in GETorHEAD\n\t    resp \u003d self._get_or_head_response(req, node_iter, partition, policy)\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/obj.py\", line 2953, in _get_or_head_response\n\t    best_bucket \u003d buckets.best_bucket\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/obj.py\", line 2241, in best_bucket\n\t    return self.least_bad_bucket\n\t  File \"/home/vagrant/swift/swift/proxy/controllers/obj.py\", line 2259, in least_bad_bucket\n\t    short, status \u003d min((bucket.shortfall, status)\n\tTypeError: \u0027\u003c\u0027 not supported between instances of \u0027int\u0027 and \u0027NoneType\u0027 (txn: txc848e30fc2eb4120a4da5-005ffc7e83)\n\nNOCIE!","commit_id":"a5fa3cfcafbc6a441139b6e9bccc06bf38042d64"}]}
