)]}'
{"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                                     logging information."},{"line_number":263,"context_line":"        :param container_path: optional path in the form `\u003caccount/container\u003e`"},{"line_number":264,"context_line":"            to which the update should be sent. If given this path will be used"},{"line_number":265,"context_line":"            instead of the constructing a path from the the ``account`` and"},{"line_number":266,"context_line":"            ``container`` params."},{"line_number":267,"context_line":"        \"\"\""},{"line_number":268,"context_line":"        if logger_thread_locals:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_89904b50","line":265,"range":{"start_line":265,"start_character":23,"end_line":265,"end_character":26},"updated":"2017-09-26 18:28:38.000000000","message":"s/the //","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                split_path(\u0027/\u0027 + contpath, minsegs\u003d2, maxsegs\u003d2)"},{"line_number":351,"context_line":"            except ValueError:"},{"line_number":352,"context_line":"                self.logger.error("},{"line_number":353,"context_line":"                    \"ERROR Invalid X-Backend-Container-Path, should be of the \""},{"line_number":354,"context_line":"                    \"form \u0027account/container\u0027 but got %r.\" % contpath)"},{"line_number":355,"context_line":"                # fall back to updating root container"},{"line_number":356,"context_line":"                contpath \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_29def710","line":353,"range":{"start_line":353,"start_character":21,"end_line":353,"end_character":26},"updated":"2017-09-26 18:28:38.000000000","message":"Should be redundant, since we\u0027re using logger.error","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"}],"swift/obj/updater.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"617a8e2ee62ac13189a9085d60a4ced6c45ed55e","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            headers_out \u003d HeaderKeyDict(update[\u0027headers\u0027].copy())"},{"line_number":242,"context_line":"            container_path \u003d update.get(\u0027container_path\u0027)"},{"line_number":243,"context_line":"            if container_path:"},{"line_number":244,"context_line":"                acct, cont \u003d split_path(\u0027/\u0027 + container_path, minsegs\u003d2)"},{"line_number":245,"context_line":"            else:"},{"line_number":246,"context_line":"                acct, cont \u003d update[\u0027account\u0027], update[\u0027container\u0027]"},{"line_number":247,"context_line":"            part, nodes \u003d self.get_container_ring().get_nodes("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_fc556351","line":244,"range":{"start_line":244,"start_character":16,"end_line":244,"end_character":72},"updated":"2017-09-25 20:12:26.000000000","message":"we need a way to break out of endlessly rettrying  shard path tha may be non-existent and revert to the root for an authoritative path","commit_id":"f83c4905d7aaa2bc52e7131d2f7ddf58fb2f8f35"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6a5cd6663308380f113a2f101a8ed9e8b8b89654","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            headers_out \u003d HeaderKeyDict(update[\u0027headers\u0027].copy())"},{"line_number":242,"context_line":"            container_path \u003d update.get(\u0027container_path\u0027)"},{"line_number":243,"context_line":"            if container_path:"},{"line_number":244,"context_line":"                acct, cont \u003d split_path(\u0027/\u0027 + container_path, minsegs\u003d2)"},{"line_number":245,"context_line":"            else:"},{"line_number":246,"context_line":"                acct, cont \u003d update[\u0027account\u0027], update[\u0027container\u0027]"},{"line_number":247,"context_line":"            part, nodes \u003d self.get_container_ring().get_nodes("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_06457617","line":244,"range":{"start_line":244,"start_character":16,"end_line":244,"end_character":72},"in_reply_to":"7f515b1d_fc556351","updated":"2017-09-26 09:52:45.000000000","message":"The updater does have access to the container ring, we could look at actually asking the root container where it needs to go.. or maybe give it 2 attempts an on a third go send the update to the root container\u0027s object holding table to be redirect via misplaced objects?","commit_id":"f83c4905d7aaa2bc52e7131d2f7ddf58fb2f8f35"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"617a8e2ee62ac13189a9085d60a4ced6c45ed55e","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                # used"},{"line_number":268,"context_line":"                redirect \u003d max(redirects, key\u003dlambda x: x[-1])"},{"line_number":269,"context_line":"                update[\u0027container_path\u0027] \u003d redirect[0]"},{"line_number":270,"context_line":"                rewrite_pickle \u003d True"},{"line_number":271,"context_line":"                if attempts_remaining \u003e 0:"},{"line_number":272,"context_line":"                    self.logger.increment(\"redirects\")"},{"line_number":273,"context_line":"                    self.logger.debug(\u0027Update sent for %(obj)s %(path)s \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_fc6c4337","line":270,"range":{"start_line":270,"start_character":16,"end_line":270,"end_character":37},"updated":"2017-09-25 20:12:26.000000000","message":"without this we would always revert to original container path when retrying from same pickled update on next cycle :(\nground hog day...","commit_id":"f83c4905d7aaa2bc52e7131d2f7ddf58fb2f8f35"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":5325,"context_line":"            self.assertEqual(expected_data, data)"},{"line_number":5326,"context_line":""},{"line_number":5327,"context_line":"        do_test(\u0027a_shard/c_shard\u0027, \u0027a_shard/c_shard\u0027, \u0027a_shard/c_shard\u0027)"},{"line_number":5328,"context_line":"        do_test(\u0027\u0027, \u0027a/c\u0027, \u0027\u0027)"},{"line_number":5329,"context_line":"        do_test(None, \u0027a/c\u0027, None)"},{"line_number":5330,"context_line":"        # TODO: should these cases trigger a 400 response rather than"},{"line_number":5331,"context_line":"        # defaulting to root path?"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_b4cfdeae","line":5328,"range":{"start_line":5328,"start_character":27,"end_line":5328,"end_character":29},"updated":"2017-09-26 18:28:38.000000000","message":"This makes it seem like there\u0027s a difference between expected_container_path\u003d\u0027\u0027 and expected_container_path\u003dNone -- but there isn\u0027t :-/","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"}],"test/unit/obj/test_updater.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":632,"context_line":"                   \u0027X-Redirect-Timestamp\u0027: ts_redirect_1.internal}),"},{"line_number":633,"context_line":"            # second round of update attempts"},{"line_number":634,"context_line":"            (200, {}),"},{"line_number":635,"context_line":"            (200, {}),"},{"line_number":636,"context_line":"        ]"},{"line_number":637,"context_line":"        fake_status_codes, fake_headers \u003d zip(*fake_responses)"},{"line_number":638,"context_line":"        with mocked_http_conn(*fake_status_codes, give_connect\u003dcapture,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_4fdb731a","line":635,"updated":"2017-09-26 18:28:38.000000000","message":"Interesting... so as long as we deliver three (well, # container replicas) times, we\u0027re happy? I\u0027m torn about whether or not to clear successes on a redirect...","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            (301, {\u0027Location\u0027: \u0027/.sharded_a/c_shard_new/o\u0027,"},{"line_number":687,"context_line":"                   \u0027X-Redirect-Timestamp\u0027: ts_redirect_2.internal}),"},{"line_number":688,"context_line":"            (301, {\u0027Location\u0027: \u0027/.sharded_a/c_shard_old/o\u0027,"},{"line_number":689,"context_line":"                   \u0027X-Redirect-Timestamp\u0027: ts_redirect_1.internal}),"},{"line_number":690,"context_line":"            # 2nd round of redirects"},{"line_number":691,"context_line":"            (301, {\u0027Location\u0027: \u0027/.sharded_a/c_shard_newer/o\u0027,"},{"line_number":692,"context_line":"                   \u0027X-Redirect-Timestamp\u0027: ts_redirect_3.internal}),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_7a0eef32","line":689,"updated":"2017-09-26 18:28:38.000000000","message":"Personal TODO: verify that shards that are splitting/merging really do start redirecting to the destination shard rather than back to the root container.","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd9b0f0bb8bd97c92b8eecf799c2215b68b6b765","unresolved":false,"context_lines":[{"line_number":702,"context_line":"                daemon.run_once()"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        self._check_update_requests(request_log, ts_obj, policies[0])"},{"line_number":705,"context_line":"        # TODO: Note only *one* redirected request is attempted"},{"line_number":706,"context_line":"        self.assertEqual([\u0027/sda1/0/.sharded_a/c_shard_older/o\u0027] * 3 +"},{"line_number":707,"context_line":"                         [\u0027/sda1/0/.sharded_a/c_shard_new/o\u0027] * 3,"},{"line_number":708,"context_line":"                         [args[0][3] for args in request_log])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_da572302","line":705,"updated":"2017-09-26 18:28:38.000000000","message":"Huh? Then what\u0027s the `* 3` for below? I\u0027m a bit confused...","commit_id":"81bc006f2de9231d1e352d4aca7c7798a1a4aa92"}]}
