)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a7f6ff2a5de182bb968a3e3f03e0bb3a4dc87ce5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    1. who do you think index 0 is AND"},{"line_number":30,"context_line":"    2. what is your current ring version."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"This initial patch completes 2 preparations. Firstly plumbs the ringbuilder"},{"line_number":33,"context_line":"version into RingData and into the Ring. Bonus drive by, now when you rebuild"},{"line_number":34,"context_line":"the builder from a ring the version is maintained."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"And secondly, creates an ELECT verb in the continer server that will"},{"line_number":37,"context_line":"pull in the ring (when needed) and return a response with a json body"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7faddb67_18eb4713","line":34,"range":{"start_line":32,"start_character":0,"end_line":34,"end_character":50},"updated":"2019-07-12 23:11:32.000000000","message":"So I took this idea and ran with it a bit: https://review.opendev.org/#/c/670673/","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a7f6ff2a5de182bb968a3e3f03e0bb3a4dc87ce5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"version into RingData and into the Ring. Bonus drive by, now when you rebuild"},{"line_number":34,"context_line":"the builder from a ring the version is maintained."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"And secondly, creates an ELECT verb in the continer server that will"},{"line_number":37,"context_line":"pull in the ring (when needed) and return a response with a json body"},{"line_number":38,"context_line":"containing the node, partition and ring version that the sharder will"},{"line_number":39,"context_line":"need to make a decision."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7faddb67_58753f31","line":37,"range":{"start_line":36,"start_character":39,"end_line":37,"end_character":30},"updated":"2019-07-12 23:11:32.000000000","message":"So this got me thinking... would it make sense to have each node running some sort of ring-as-a-service process? And now I\u0027ve written https://review.opendev.org/#/c/670674/ :P","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"545ab175712c7f17fdac7a87c0b89a9c94e2c3a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c20dad46_b2368488","updated":"2024-03-20 06:24:24.000000000","message":"rebased and sqaushed the first 2 in the chain together.","commit_id":"84ffe70f9a8bb8ff8599d9775f9a502163ef4916"}],"swift/cli/ringbuilder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334e53e10d3015d6e64b6baf899dbcdd74c22c4e","unresolved":false,"context_lines":[{"line_number":471,"context_line":"            builder_id \u003d builder.id"},{"line_number":472,"context_line":"        except AttributeError:"},{"line_number":473,"context_line":"            builder_id \u003d \"(not assigned)\""},{"line_number":474,"context_line":"        print(\u0027%s, build version %d, id %s\u0027 %"},{"line_number":475,"context_line":"              (builder_file, builder.version, builder_id))"},{"line_number":476,"context_line":"        balance \u003d 0"},{"line_number":477,"context_line":"        ring_empty_error \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_40bcf268","line":474,"range":{"start_line":474,"start_character":33,"end_line":474,"end_character":35},"updated":"2019-07-03 23:56:56.000000000","message":"Hmm, yeah, that makes me nervous...","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334e53e10d3015d6e64b6baf899dbcdd74c22c4e","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"            \u0027parts\u0027: ring.partition_count,"},{"line_number":1168,"context_line":"            \u0027devs\u0027: ring.devs,"},{"line_number":1169,"context_line":"            \u0027devs_changed\u0027: False,"},{"line_number":1170,"context_line":"            \u0027version\u0027: ring.version,"},{"line_number":1171,"context_line":"            \u0027_replica2part2dev\u0027: ring._replica2part2dev_id,"},{"line_number":1172,"context_line":"            \u0027_last_part_moves_epoch\u0027: None,"},{"line_number":1173,"context_line":"            \u0027_last_part_moves\u0027: None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_20b77689","line":1170,"updated":"2019-07-03 23:56:56.000000000","message":"Is there any downside to this being None (instead of an int)? Should we maybe say\n\n ring.version or 0\n\n? Or maybe that should go in RingBuilder.from_dict()...","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"}],"swift/common/ring/builder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334e53e10d3015d6e64b6baf899dbcdd74c22c4e","unresolved":false,"context_lines":[{"line_number":254,"context_line":"            self.devs \u003d builder[\u0027devs\u0027]"},{"line_number":255,"context_line":"            self.devs_changed \u003d builder[\u0027devs_changed\u0027]"},{"line_number":256,"context_line":"            self.overload \u003d builder.get(\u0027overload\u0027, 0.0)"},{"line_number":257,"context_line":"            self.version \u003d builder[\u0027version\u0027]"},{"line_number":258,"context_line":"            self._replica2part2dev \u003d builder[\u0027_replica2part2dev\u0027]"},{"line_number":259,"context_line":"            self._last_part_moves_epoch \u003d builder[\u0027_last_part_moves_epoch\u0027]"},{"line_number":260,"context_line":"            if builder[\u0027_last_part_moves\u0027] is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_407152e0","line":257,"updated":"2019-07-03 23:56:56.000000000","message":"Yeah, we just take the version raw...","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334e53e10d3015d6e64b6baf899dbcdd74c22c4e","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                             \"is marked for removal\" % (dev_id,))"},{"line_number":451,"context_line":"        self.devs[dev_id][\u0027weight\u0027] \u003d weight"},{"line_number":452,"context_line":"        self.devs_changed \u003d True"},{"line_number":453,"context_line":"        self.version +\u003d 1"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def remove_dev(self, dev_id):"},{"line_number":456,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e075decd","line":453,"updated":"2019-07-03 23:56:56.000000000","message":"...so a None would *also* be bad here...","commit_id":"5204e5b8e75c5ce57ee61c6398181af568df19bb"}],"swift/container/server.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fd6056a930091b1c561882edc1fdc93a9265f51a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            self.logger)"},{"line_number":110,"context_line":"        # Note I don\u0027t really want in pull the container ring in by default. So"},{"line_number":111,"context_line":"        # We only are loading it in when we need it, see"},{"line_number":112,"context_line":"        # _get_shard_election_info."},{"line_number":113,"context_line":"        self.ring \u003d None"},{"line_number":114,"context_line":"        #: The list of hosts we\u0027re allowed to send syncs to. This can be"},{"line_number":115,"context_line":"        #: overridden by data in self.realms_conf"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_9722be00","line":112,"updated":"2019-06-24 07:20:32.000000000","message":"Lol, I need to update the comment, things have changed since I wrote that.","commit_id":"11f754519ef28c1afaec9ea3233390e3de032f14"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        self.node_timeout \u003d float(conf.get(\u0027node_timeout\u0027, 3))"},{"line_number":134,"context_line":"        self.conn_timeout \u003d float(conf.get(\u0027conn_timeout\u0027, 0.5))"},{"line_number":135,"context_line":"        self.swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"},{"line_number":136,"context_line":"        self.bind_ip \u003d conf.get(\u0027bind_ip\u0027, \u00270.0.0.0\u0027)"},{"line_number":137,"context_line":"        self.port \u003d int(conf.get(\u0027bind_port\u0027, 6201))"},{"line_number":138,"context_line":"        #: ContainerSyncCluster instance for validating sync-to values."},{"line_number":139,"context_line":"        self.realms_conf \u003d ContainerSyncRealms("},{"line_number":140,"context_line":"            os.path.join("}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_a03270a5","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":52},"updated":"2020-06-04 05:51:54.000000000","message":"It seems weird that we don\u0027t already have these available :-/","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            self.logger)"},{"line_number":144,"context_line":"        # Note I don\u0027t really want in pull the container ring in by default. So"},{"line_number":145,"context_line":"        # We only are loading it in when we need it, see"},{"line_number":146,"context_line":"        # _get_shard_election_info."},{"line_number":147,"context_line":"        self.ring \u003d None"},{"line_number":148,"context_line":"        #: The list of hosts we\u0027re allowed to send syncs to. This can be"},{"line_number":149,"context_line":"        #: overridden by data in self.realms_conf"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_40e8b4e0","line":146,"updated":"2020-06-04 05:51:54.000000000","message":"But once we load it we\u0027ll keep it loaded indefinitely, yeah -- we won\u0027t reload on new rings unless/until there\u0027s another ELECT request, but still I wonder whether this is a false economy...","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":831,"context_line":"        \"\"\""},{"line_number":832,"context_line":"        account, container \u003d split_and_validate_path(req, 2)"},{"line_number":833,"context_line":"        if not self.ring:"},{"line_number":834,"context_line":"            self.ring \u003d Ring(self.swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        ips \u003d whataremyips(bind_ip\u003dself.bind_ip)"},{"line_number":837,"context_line":"        part, nodes \u003d self.ring.get_nodes(account, container)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_40cd5464","line":834,"updated":"2020-06-04 05:51:54.000000000","message":"What happens if (for some reason) the ring isn\u0027t on disk? I suppose probably a 500 w/ traceback... which isn\u0027t so crazy, considering...","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        local_node \u003d [n for n in nodes"},{"line_number":840,"context_line":"                      if is_local_device(ips, self.port,"},{"line_number":841,"context_line":"                                         n[\u0027replication_ip\u0027],"},{"line_number":842,"context_line":"                                         n[\u0027replication_port\u0027])]"},{"line_number":843,"context_line":"        status \u003d NOTFOUND"},{"line_number":844,"context_line":"        if local_node:"},{"line_number":845,"context_line":"            broker \u003d self._get_container_broker(local_node[0][\u0027device\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_c0de840f","line":842,"updated":"2020-06-04 05:51:54.000000000","message":"...or should we be checking n[\u0027ip\u0027] and n[\u0027port\u0027]? This reminds me that I want to look at https://review.opendev.org/#/c/337861/ again...","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":842,"context_line":"                                         n[\u0027replication_port\u0027])]"},{"line_number":843,"context_line":"        status \u003d NOTFOUND"},{"line_number":844,"context_line":"        if local_node:"},{"line_number":845,"context_line":"            broker \u003d self._get_container_broker(local_node[0][\u0027device\u0027],"},{"line_number":846,"context_line":"                                                part, account, container)"},{"line_number":847,"context_line":"            status \u003d broker.get_db_state()"},{"line_number":848,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_a0a550b7","line":845,"range":{"start_line":845,"start_character":58,"end_line":845,"end_character":61},"updated":"2020-06-04 05:51:54.000000000","message":"NB: on very small clusters, there may be more than one. But taking the first ensures that we get index-zero if it\u0027s among them.","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":849,"context_line":"        body \u003d json.dumps("},{"line_number":850,"context_line":"            {\"node\": nodes[0],"},{"line_number":851,"context_line":"             \"part\": part,"},{"line_number":852,"context_line":"             \"status\": status,"},{"line_number":853,"context_line":"             \"version\": self.ring.version}).encode(\u0027ascii\u0027)"},{"line_number":854,"context_line":"        return Response(request\u003dreq, body\u003dbody)"},{"line_number":855,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_00e51cdc","line":852,"range":{"start_line":852,"start_character":14,"end_line":852,"end_character":20},"updated":"2020-06-04 05:51:54.000000000","message":"I wonder if this should maybe be db_state","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"}],"swift/container/sharder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fd6056a930091b1c561882edc1fdc93a9265f51a","unresolved":false,"context_lines":[{"line_number":1397,"context_line":"    def _elect_leader(self, broker, node, part):"},{"line_number":1398,"context_line":"        if node[\u0027index\u0027] \u003d\u003d 0:"},{"line_number":1399,"context_line":"            return True"},{"line_number":1400,"context_line":"        return False"},{"line_number":1401,"context_line":""},{"line_number":1402,"context_line":"    def _process_broker(self, broker, node, part):"},{"line_number":1403,"context_line":"        broker.get_info()  # make sure account/container are populated"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_571c46c0","line":1400,"updated":"2019-06-24 07:20:32.000000000","message":"Elect leader code will go here.","commit_id":"11f754519ef28c1afaec9ea3233390e3de032f14"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            conf.get(\u0027cleave_row_batch_size\u0027, 10000))"},{"line_number":386,"context_line":"        self.auto_shard \u003d config_true_value(conf.get(\u0027auto_shard\u0027, False))"},{"line_number":387,"context_line":"        q_size \u003d conf.get(\u0027auto_shard_quorum_size\u0027, DEFAULT_QUORUM_SIZE)"},{"line_number":388,"context_line":"        if q_size not in QUORUM_SIZE.keys():"},{"line_number":389,"context_line":"            self.logger.warning(\u0027Unknown auto_shard_quorum_size %s,\u0027"},{"line_number":390,"context_line":"                                \u0027defaulting to %s\u0027, q_size,"},{"line_number":391,"context_line":"                                DEFAULT_QUORUM_SIZE)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_8075ac34","line":388,"range":{"start_line":388,"start_character":25,"end_line":388,"end_character":43},"updated":"2020-06-04 05:51:54.000000000","message":"nit: Could just use QUORUM_SIZE.","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"55373b13f92d20f880983a5b0074eb6508da111e","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        if q_size not in QUORUM_SIZE.keys():"},{"line_number":389,"context_line":"            self.logger.warning(\u0027Unknown auto_shard_quorum_size %s,\u0027"},{"line_number":390,"context_line":"                                \u0027defaulting to %s\u0027, q_size,"},{"line_number":391,"context_line":"                                DEFAULT_QUORUM_SIZE)"},{"line_number":392,"context_line":"            q_size \u003d DEFAULT_QUORUM_SIZE"},{"line_number":393,"context_line":"        self.quorum_size \u003d QUORUM_SIZE[q_size]"},{"line_number":394,"context_line":"        self.sharding_candidates \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_407f1414","line":391,"updated":"2020-06-04 05:51:54.000000000","message":"I\u0027d be fine with raising a ValueError or similar FWIW.\n\nMight be worth logging a warning if they aren\u0027t using \u0027all\u0027 though.","commit_id":"a99faba07978e698ff6523bcb8f87088cdfb74c0"}]}
