)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":27,"context_line":"fragments to the appropriate primary until it is remounted or"},{"line_number":28,"context_line":"rebalanced.  After a rebalance of EC rings (potentially removing"},{"line_number":29,"context_line":"unmounted/failed devices), it\u0027s most IO efficient to run in"},{"line_number":30,"context_line":"handoffs_only mode to avoid unnecessary rebuilds."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Closes-Bug: #1510342"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_bd20414b","line":30,"updated":"2019-02-06 16:02:15.000000000","message":"This has always been the case, but maybe it\u0027s even more important now since you\u0027ll actually have some rebuilt frags ready to revert!","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":11,"context_line":"REPLICATE request."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each primary node in a EC ring will sync with exactly three primary"},{"line_number":14,"context_line":"peers, in addition to the left \u0026 right nodes we now select a third node"},{"line_number":15,"context_line":"from the far side of the ring.  If any of these partners respond"},{"line_number":16,"context_line":"unmounted the reconstructor will rebuild it\u0027s fragments to a handoff"},{"line_number":17,"context_line":"node with the appropriate index."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9fdfeff1_66c53c3c","line":15,"range":{"start_line":14,"start_character":7,"end_line":15,"end_character":29},"updated":"2019-02-08 20:59:10.000000000","message":"This is just bonus, yeah? To make it more likely that we\u0027ll notice failures quickly and do the reconstruction, we make more nodes responsible for syncing.... but we should have something similar to the three-replica case even without this, right?","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"}],"etc/object-server.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":353,"context_line":"# handoffs_only \u003d False"},{"line_number":354,"context_line":"#"},{"line_number":355,"context_line":"# The default strategy for unmounted drives will stage rebuilt data on handoff"},{"line_number":356,"context_line":"# nodes until an updated rings are deployed."},{"line_number":357,"context_line":"# rebuild_unmounted_drives_to_handoffs \u003d True"},{"line_number":358,"context_line":"#"},{"line_number":359,"context_line":"# You can set scheduling priority of processes. Niceness values range from -20"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"9fdfeff1_dd6f4590","line":356,"updated":"2019-02-06 16:02:15.000000000","message":"s/an/a/ updated ring...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":358,"context_line":"# will search for EC frags we restrict how many nodes we\u0027ll try.  Setting to 0"},{"line_number":359,"context_line":"# will disable rebuilds to handoffs and only rebuild fragments for unmounted"},{"line_number":360,"context_line":"# devices to mounted primaries after a ring change."},{"line_number":361,"context_line":"# Setting to -1 means \"no limit\"."},{"line_number":362,"context_line":"# rebuild_handoff_node_count \u003d 2"},{"line_number":363,"context_line":"#"},{"line_number":364,"context_line":"# You can set scheduling priority of processes. Niceness values range from -20"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"9fdfeff1_462ef8fa","line":361,"range":{"start_line":361,"start_character":2,"end_line":361,"end_character":33},"updated":"2019-02-08 20:59:10.000000000","message":"+1, I like having this option.","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":359,"context_line":"# will disable rebuilds to handoffs and only rebuild fragments for unmounted"},{"line_number":360,"context_line":"# devices to mounted primaries after a ring change."},{"line_number":361,"context_line":"# Setting to -1 means \"no limit\"."},{"line_number":362,"context_line":"# rebuild_handoff_node_count \u003d 2"},{"line_number":363,"context_line":"#"},{"line_number":364,"context_line":"# You can set scheduling priority of processes. Niceness values range from -20"},{"line_number":365,"context_line":"# (most favorable to the process) to 19 (least favorable to the process)."}],"source_content_type":"application/octet-stream","patch_set":9,"id":"9fdfeff1_e9cb3da2","line":362,"updated":"2019-02-08 20:59:10.000000000","message":"I wonder if the replicator should maybe grow a similar option... if our cluster isn\u0027t super-healthy, we\u0027ve got an unmounted primary (or two), and a slew of handoffs are unmounted too... does it really make sense for us to rsync data to the 15th handoff in a three-replica policy instead of waiting and hoping things go better the on next cycle?","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"}],"swift/common/ring/ring.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                self._num_devs +\u003d 1"},{"line_number":266,"context_line":"        self._num_regions \u003d len(regions)"},{"line_number":267,"context_line":"        self._num_zones \u003d len(zones)"},{"line_number":268,"context_line":"        self._num_ips \u003d len(ips)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    @property"},{"line_number":271,"context_line":"    def next_part_power(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_3da0d1a5","line":268,"updated":"2019-02-06 16:02:15.000000000","message":"this method extraction was in support of some ring-like over in test.unit","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":503,"context_line":"                    dev_id \u003d part2dev_id[handoff_part]"},{"line_number":504,"context_line":"                    if dev_id not in used:"},{"line_number":505,"context_line":"                        dev \u003d self._devs[dev_id]"},{"line_number":506,"context_line":"                        yield dict(dev, handoff_index\u003dnext(index))"},{"line_number":507,"context_line":"                        used.add(dev_id)"},{"line_number":508,"context_line":"                        if len(used) \u003d\u003d self._num_devs:"},{"line_number":509,"context_line":"                            hit_all_devs \u003d True"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_7d765941","line":506,"updated":"2019-02-06 16:02:15.000000000","message":"The interface change here has two effects:\n\n1) we hand out copies of items in _devs, callers that mutate them won\u0027t poison the ring\n2) handoffs are numbered (so callers can observe how far down they rabbit hole they\u0027ve gone)","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self._next_part_power \u003d ring_data.next_part_power"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def _update_bookkeeping(self):"},{"line_number":244,"context_line":"        # Do this now, when we know the data has changed, rather than"},{"line_number":245,"context_line":"        # doing it on every call to get_more_nodes()."},{"line_number":246,"context_line":"        #"},{"line_number":247,"context_line":"        # Since this is to speed up the finding of handoffs, we only"},{"line_number":248,"context_line":"        # consider devices with at least one partition assigned. This"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_e60dac90","line":245,"range":{"start_line":244,"start_character":1,"end_line":245,"end_character":53},"updated":"2019-02-08 20:59:10.000000000","message":"I guess this was just a breaking up the _reload() method and giving this chunk of code a reasonable name, but... I wonder if this part of the comment should stay up in _reload() -- \u0027cause, like, when\u0027s \"now\" if this *didn\u0027t* get called there? Do we *know* the data changed in that case? Why?","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d566e14b18d037dd5abbca0da914f3bbb69c7fb2","unresolved":false,"context_lines":[{"line_number":826,"context_line":"                job[\u0027policy\u0027].object_ring.get_part_nodes(job[\u0027partition\u0027])"},{"line_number":827,"context_line":"                if n[\u0027id\u0027] !\u003d job[\u0027local_dev\u0027][\u0027id\u0027] and"},{"line_number":828,"context_line":"                n[\u0027id\u0027] not in (m[\u0027id\u0027] for m in job[\u0027sync_to\u0027])"},{"line_number":829,"context_line":"            ],  # N.B. this is very very wrong."},{"line_number":830,"context_line":"        )"},{"line_number":831,"context_line":"        syncd_with \u003d 0"},{"line_number":832,"context_line":"        for node in dest_nodes:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_8b2e4941","line":829,"updated":"2019-01-14 23:18:20.000000000","message":"So this code was already bad, but I do think adding fail-in-place support makes it slightly worse - we don\u0027t need every primary node trying to rebuild an unmounted disks fragments onto the same handoff.","commit_id":"10dac65c971d740f6b55b7a3ce27ad564e2fd28e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":829,"context_line":"                continue"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":832,"context_line":"                node[\u0027index\u0027])"},{"line_number":833,"context_line":"            # ssync any out-of-sync suffixes with the remote node"},{"line_number":834,"context_line":"            success, _ \u003d ssync_sender("},{"line_number":835,"context_line":"                self, node, job, suffixes)()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_1deb8db0","side":"PARENT","line":832,"updated":"2019-02-06 16:02:15.000000000","message":"this was moved into the iter","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param node_index: the primary index"},{"line_number":59,"context_line":"    :param part_nodes: a list of primary nodes"},{"line_number":60,"context_line":"    :returns: [\u003cnode-to-left\u003e, \u003cnode-to-right\u003e, \u003cnode-opposite\u003e]"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    num_nodes \u003d len(part_nodes)"},{"line_number":63,"context_line":"    return ["}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_372d4a46","line":60,"range":{"start_line":60,"start_character":49,"end_line":60,"end_character":62},"updated":"2019-02-06 20:32:13.000000000","message":"There\u0027s a definite advantage to this if ec_duplication_factor \u003d 2 (or really, any even number)... do we take advantage of that and short-circuit the rebuild?","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param node_index: the primary index"},{"line_number":59,"context_line":"    :param part_nodes: a list of primary nodes"},{"line_number":60,"context_line":"    :returns: [\u003cnode-to-left\u003e, \u003cnode-to-right\u003e, \u003cnode-opposite\u003e]"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    num_nodes \u003d len(part_nodes)"},{"line_number":63,"context_line":"    return ["}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_328eb827","line":60,"range":{"start_line":60,"start_character":49,"end_line":60,"end_character":62},"in_reply_to":"9fdfeff1_372d4a46","updated":"2019-02-07 15:32:31.000000000","message":"agreed... no","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        part_nodes[(node_index - 1) % num_nodes],"},{"line_number":65,"context_line":"        part_nodes[(node_index + 1) % num_nodes],"},{"line_number":66,"context_line":"        part_nodes[("},{"line_number":67,"context_line":"            node_index + int(0.5 * num_nodes)"},{"line_number":68,"context_line":"        ) % num_nodes],"},{"line_number":69,"context_line":"    ]"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_776c329c","line":67,"range":{"start_line":67,"start_character":25,"end_line":67,"end_character":45},"updated":"2019-02-06 20:32:13.000000000","message":"Why not\n\n num_nodes // 2\n\n?","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        part_nodes[(node_index - 1) % num_nodes],"},{"line_number":65,"context_line":"        part_nodes[(node_index + 1) % num_nodes],"},{"line_number":66,"context_line":"        part_nodes[("},{"line_number":67,"context_line":"            node_index + int(0.5 * num_nodes)"},{"line_number":68,"context_line":"        ) % num_nodes],"},{"line_number":69,"context_line":"    ]"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_72d9a020","line":67,"range":{"start_line":67,"start_character":25,"end_line":67,"end_character":45},"in_reply_to":"9fdfeff1_776c329c","updated":"2019-02-07 15:32:31.000000000","message":"seems equivalent?  Does the integer division read better to you?","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            self.logger.warning(\u0027Ignored handoffs_first option in favor \u0027"},{"line_number":208,"context_line":"                                \u0027of handoffs_only.\u0027)"},{"line_number":209,"context_line":"        self.rebuild_unmounted_drives_to_handoffs \u003d config_true_value("},{"line_number":210,"context_line":"            conf.get(\u0027rebuild_unmounted_drives_to_handoffs\u0027, \u0027true\u0027))"},{"line_number":211,"context_line":"        self._df_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":212,"context_line":"        self.all_local_devices \u003d self.get_local_devices()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_971756ee","line":210,"range":{"start_line":210,"start_character":62,"end_line":210,"end_character":66},"updated":"2019-02-06 20:32:13.000000000","message":"+1, good default","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        First we try the handoff that\u0027s offset from the primaries at a distance"},{"line_number":683,"context_line":"        equal to the primary frag index, then we\u0027ll continue through other"},{"line_number":684,"context_line":"        handoffs up to ec_n_unique_fragments."},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        Nodes returned from this iterator will have \u0027backend_index\u0027 set."},{"line_number":687,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_17afe694","line":684,"updated":"2019-02-06 20:32:13.000000000","message":"After that, we give up, yeah? We won\u0027t be willing to hit every disk in the cluster.","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        First we try the handoff that\u0027s offset from the primaries at a distance"},{"line_number":683,"context_line":"        equal to the primary frag index, then we\u0027ll continue through other"},{"line_number":684,"context_line":"        handoffs up to ec_n_unique_fragments."},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        Nodes returned from this iterator will have \u0027backend_index\u0027 set."},{"line_number":687,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_520a5c8a","line":684,"in_reply_to":"9fdfeff1_17afe694","updated":"2019-02-07 15:32:31.000000000","message":"yup, i mean... that\u0027s what I implemented \u003cshrug\u003e","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":684,"context_line":"        handoffs up to ec_n_unique_fragments."},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        Nodes returned from this iterator will have \u0027backend_index\u0027 set."},{"line_number":687,"context_line":"        \"\"\""},{"line_number":688,"context_line":"        node[\u0027backend_index\u0027] \u003d policy.get_backend_index(node[\u0027index\u0027])"},{"line_number":689,"context_line":"        yield node"},{"line_number":690,"context_line":"        if not self.rebuild_unmounted_drives_to_handoffs:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_5d7d95e5","line":687,"updated":"2019-02-06 16:02:15.000000000","message":"this could use a targeted unittest to provide examples of behavior","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                handoff_node \u003d next(more_nodes)"},{"line_number":697,"context_line":"            except StopIteration:"},{"line_number":698,"context_line":"                break"},{"line_number":699,"context_line":"            backend_index \u003d policy.get_backend_index(handoff_index)"},{"line_number":700,"context_line":"            if backend_index \u003d\u003d node[\u0027backend_index\u0027]:"},{"line_number":701,"context_line":"                handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]"},{"line_number":702,"context_line":"                yield handoff_node"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_bdca814c","line":699,"updated":"2019-02-06 16:02:15.000000000","message":"so this is kinda interesting... I don\u0027t use the handoff_index from the ring...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":703,"context_line":"            else:"},{"line_number":704,"context_line":"                unused_handoffs.append(handoff_node)"},{"line_number":705,"context_line":"        # rotate handoffs around offset in replica count"},{"line_number":706,"context_line":"        unused_handoffs \u003d (unused_handoffs[node[\u0027index\u0027]:] +"},{"line_number":707,"context_line":"                           unused_handoffs[:node[\u0027index\u0027]])"},{"line_number":708,"context_line":"        for handoff_node in unused_handoffs:"},{"line_number":709,"context_line":"            handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_37130abb","line":706,"range":{"start_line":706,"start_character":49,"end_line":706,"end_character":54},"updated":"2019-02-06 20:32:13.000000000","message":"index, or backend_index?","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":703,"context_line":"            else:"},{"line_number":704,"context_line":"                unused_handoffs.append(handoff_node)"},{"line_number":705,"context_line":"        # rotate handoffs around offset in replica count"},{"line_number":706,"context_line":"        unused_handoffs \u003d (unused_handoffs[node[\u0027index\u0027]:] +"},{"line_number":707,"context_line":"                           unused_handoffs[:node[\u0027index\u0027]])"},{"line_number":708,"context_line":"        for handoff_node in unused_handoffs:"},{"line_number":709,"context_line":"            handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_1204d47a","line":706,"range":{"start_line":706,"start_character":49,"end_line":706,"end_character":54},"in_reply_to":"9fdfeff1_37130abb","updated":"2019-02-07 15:32:31.000000000","message":"Yeah I don\u0027t think this is tested...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":707,"context_line":"                           unused_handoffs[:node[\u0027index\u0027]])"},{"line_number":708,"context_line":"        for handoff_node in unused_handoffs:"},{"line_number":709,"context_line":"            handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]"},{"line_number":710,"context_line":"            yield handoff_node"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"    def _get_suffixes_to_sync(self, job, node):"},{"line_number":713,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_570a4e8a","line":710,"updated":"2019-02-06 20:32:13.000000000","message":"I think the handoff logic is equivalent to\n\n handoffs \u003d list(itertools.islice(more_nodes, policy.ec_n_unique_fragments))\n # rotate handoffs around offset in replica count\n handoffs \u003d handoffs[node[\u0027index\u0027]:] + handoffs[:node[\u0027index\u0027]]\n for handoff_node in handoffs:\n     handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]\n     yield handoff_node\n\n...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":707,"context_line":"                           unused_handoffs[:node[\u0027index\u0027]])"},{"line_number":708,"context_line":"        for handoff_node in unused_handoffs:"},{"line_number":709,"context_line":"            handoff_node[\u0027backend_index\u0027] \u003d node[\u0027backend_index\u0027]"},{"line_number":710,"context_line":"            yield handoff_node"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":"    def _get_suffixes_to_sync(self, job, node):"},{"line_number":713,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_52181cd2","line":710,"in_reply_to":"9fdfeff1_570a4e8a","updated":"2019-02-07 15:32:31.000000000","message":"yeah!\n\nbut honestly I don\u0027t know if that\u0027s great...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"17c483e50730e824da20f12ec63333ceb675ea1d","unresolved":false,"context_lines":[{"line_number":976,"context_line":"                    suffixes \u003d data_fi_to_suffixes.pop(frag_index)"},{"line_number":977,"context_line":"                except KeyError:"},{"line_number":978,"context_line":"                    # N.B. If this function ever returns an empty list of jobs"},{"line_number":979,"context_line":"                    # the entire partition will be deleted."},{"line_number":980,"context_line":"                    suffixes \u003d []"},{"line_number":981,"context_line":"                sync_job \u003d build_job("},{"line_number":982,"context_line":"                    job_type\u003dSYNC,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_b76b7a1d","line":979,"updated":"2019-02-06 20:32:13.000000000","message":"We already have this comment up in the docstring... what does it add here?","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":976,"context_line":"                    suffixes \u003d data_fi_to_suffixes.pop(frag_index)"},{"line_number":977,"context_line":"                except KeyError:"},{"line_number":978,"context_line":"                    # N.B. If this function ever returns an empty list of jobs"},{"line_number":979,"context_line":"                    # the entire partition will be deleted."},{"line_number":980,"context_line":"                    suffixes \u003d []"},{"line_number":981,"context_line":"                sync_job \u003d build_job("},{"line_number":982,"context_line":"                    job_type\u003dSYNC,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_d2516c64","line":979,"in_reply_to":"9fdfeff1_b76b7a1d","updated":"2019-02-07 15:32:31.000000000","message":"well, maybe nothing... OTOH, while working on this patch I found a failing unittest and ended up reading this code and thought returning a job with empty suffixes was stupid, so I let the \"part with no suffixes to sync\" break out of the loop here and didn\u0027t notice I\u0027d ruined everything until probetests hit the race.\n\nI added this comment hoping it doesn\u0027t hurt anything and I might save future me an hour or so next time I\u0027m working in here.\n\nIdeally we could come up with some better interface that doesn\u0027t have this annoying side effect.","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e9d07efec9c720eb101d51eaabc96382fe8d648","unresolved":false,"context_lines":[{"line_number":694,"context_line":"                handoff_node[\u0027handoff_index\u0027])"},{"line_number":695,"context_line":"            if handoff_backend_index \u003d\u003d node[\u0027backend_index\u0027]:"},{"line_number":696,"context_line":"                handoff_node[\u0027backend_index\u0027] \u003d handoff_backend_index"},{"line_number":697,"context_line":"                yield handoff_node"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"    def _get_suffixes_to_sync(self, job, node):"},{"line_number":700,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_5cb7c187","line":697,"updated":"2019-02-07 15:38:21.000000000","message":"What do you think?  This is different.  Simpler to explain maybe.  Better?  It\u0027ll consume more disks but make conflicts even LESS likely [1]?  I think we should probably put a cap on how deep we\u0027ll go... another tunable?  Can we overload \"rebuild_unmounted_drives_to_handoffs\"?  I think 2 is plenty... 1 seems not unreasonable and better than master - 0 would mean off?  Is that crazy?!\n\n1. the proxy still places handoffs willy nilly - but that could theoretically change some day?","commit_id":"7d569444f79a416b163d92e7874725e03f643816"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":798,"context_line":"        \"\"\""},{"line_number":799,"context_line":"        self.logger.increment("},{"line_number":800,"context_line":"            \u0027partition.update.count.%s\u0027 % (job[\u0027local_dev\u0027][\u0027device\u0027],))"},{"line_number":801,"context_line":"        # after our left and right partners, if there\u0027s some sort of"},{"line_number":802,"context_line":"        # failure we\u0027ll continue onto the remaining primary nodes and"},{"line_number":803,"context_line":"        # make sure they\u0027re in sync - or potentially rebuild missing"},{"line_number":804,"context_line":"        # fragments we find"},{"line_number":805,"context_line":"        dest_nodes \u003d itertools.chain("}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_c98f592c","side":"PARENT","line":802,"range":{"start_line":801,"start_character":45,"end_line":802,"end_character":65},"updated":"2019-02-08 20:59:10.000000000","message":"Oh yeah, here\u0027s the other thing that changed about which primaries we look at... so the extra primary we add is in part to be willing to sync to every primary given enough failures...","commit_id":"6c6bb80e40313733b28dae920acc28889016a114"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3240841477ebc4ccbb12334dfd1954417a3c831c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        part_nodes[("},{"line_number":67,"context_line":"            node_index + (num_nodes // 2)"},{"line_number":68,"context_line":"        ) % num_nodes],"},{"line_number":69,"context_line":"    ]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def _full_path(node, part, relative_path, policy):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_cc71a7e0","line":69,"updated":"2019-02-08 22:45:04.000000000","message":"Should maybe do some de-duping, just to minimize work with some degenerate EC schemes (like 2+1 or 1+2), but it\u0027s not a great idea to run such schemes anyway (even if we *do* technically allow it).","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3240841477ebc4ccbb12334dfd1954417a3c831c","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                    resp.full_path, frag_index)"},{"line_number":423,"context_line":"                continue"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"            if fi_to_rebuild \u003d\u003d resp_frag_index:"},{"line_number":426,"context_line":"                # TODO: With duplicated EC frags it\u0027s not unreasonable to find"},{"line_number":427,"context_line":"                # the very fragment we\u0027re trying to rebuild exists on another"},{"line_number":428,"context_line":"                # primary node.  In this case we should stream it directly from"},{"line_number":429,"context_line":"                # the remote node to our target instead of rebuild.  But"},{"line_number":430,"context_line":"                # instead we ignore it."},{"line_number":431,"context_line":"                self.logger.debug("},{"line_number":432,"context_line":"                    \u0027Found existing frag #%s at %s while rebuilding to %s\u0027,"},{"line_number":433,"context_line":"                    fi_to_rebuild, resp.full_path,"},{"line_number":434,"context_line":"                    _full_path("},{"line_number":435,"context_line":"                        node, job[\u0027partition\u0027], datafile_metadata[\u0027name\u0027],"},{"line_number":436,"context_line":"                        job[\u0027policy\u0027]))"},{"line_number":437,"context_line":"                continue"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"            timestamp \u003d resp.headers.get(\u0027X-Backend-Timestamp\u0027)"},{"line_number":440,"context_line":"            if not timestamp:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_cc9207a0","line":437,"range":{"start_line":425,"start_character":12,"end_line":437,"end_character":24},"updated":"2019-02-08 22:45:04.000000000","message":"Right... here\u0027s where we could add that EC-duplication-factor/sync-to-opposite optimization ...\n\nThough we might want to prioritize talking to ourselves...","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":691,"context_line":"        for handoff_node in policy.object_ring.get_more_nodes(partition):"},{"line_number":692,"context_line":"            handoff_backend_index \u003d policy.get_backend_index("},{"line_number":693,"context_line":"                handoff_node[\u0027handoff_index\u0027])"},{"line_number":694,"context_line":"            if handoff_backend_index \u003d\u003d node[\u0027backend_index\u0027]:"},{"line_number":695,"context_line":"                if (self.rebuild_handoff_node_count \u003e\u003d 0 and"},{"line_number":696,"context_line":"                        count \u003e\u003d self.rebuild_handoff_node_count):"},{"line_number":697,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_09a801d9","line":694,"updated":"2019-02-08 20:59:10.000000000","message":"Could use something like\n\n itertools.islice(get_more_nodes, node[\u0027backend_index\u0027], None, ec_n_unique_fragments)\n\nMeh -- maybe this is more clear.","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            handoff_backend_index \u003d policy.get_backend_index("},{"line_number":693,"context_line":"                handoff_node[\u0027handoff_index\u0027])"},{"line_number":694,"context_line":"            if handoff_backend_index \u003d\u003d node[\u0027backend_index\u0027]:"},{"line_number":695,"context_line":"                if (self.rebuild_handoff_node_count \u003e\u003d 0 and"},{"line_number":696,"context_line":"                        count \u003e\u003d self.rebuild_handoff_node_count):"},{"line_number":697,"context_line":"                    break"},{"line_number":698,"context_line":"                handoff_node[\u0027backend_index\u0027] \u003d handoff_backend_index"},{"line_number":699,"context_line":"                yield handoff_node"},{"line_number":700,"context_line":"                count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_66921cf9","line":697,"range":{"start_line":695,"start_character":16,"end_line":697,"end_character":25},"updated":"2019-02-08 20:59:10.000000000","message":"nit: could move this to just after incrementing count, keep us from needing to find the next N handoffs","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":695,"context_line":"                if (self.rebuild_handoff_node_count \u003e\u003d 0 and"},{"line_number":696,"context_line":"                        count \u003e\u003d self.rebuild_handoff_node_count):"},{"line_number":697,"context_line":"                    break"},{"line_number":698,"context_line":"                handoff_node[\u0027backend_index\u0027] \u003d handoff_backend_index"},{"line_number":699,"context_line":"                yield handoff_node"},{"line_number":700,"context_line":"                count +\u003d 1"},{"line_number":701,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_c992f99f","line":698,"range":{"start_line":698,"start_character":48,"end_line":698,"end_character":69},"updated":"2019-02-08 20:59:10.000000000","message":"nit: I might go with node[\u0027backend_index\u0027] to be explicit that we care about the node we were trying to sync to, not the particular handoff. Just in case we ever change our handoff-selection algo.","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a824b9089038af660aeb3baea16536a149ab533","unresolved":false,"context_lines":[{"line_number":730,"context_line":"                        node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":731,"context_line":"                        node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":732,"context_line":"                        \u0027\u0027, headers\u003dheaders).getresponse()"},{"line_number":733,"context_line":"                if resp.status \u003d\u003d HTTP_INSUFFICIENT_STORAGE:"},{"line_number":734,"context_line":"                    self.logger.error("},{"line_number":735,"context_line":"                        _(\u0027%s responded as unmounted\u0027),"},{"line_number":736,"context_line":"                        _full_path(node, job[\u0027partition\u0027], \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_89687187","line":733,"updated":"2019-02-08 20:59:10.000000000","message":"I wonder if we should also offer another attempt if we get connection_refused (i.e., server\u0027s not even running)...","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3240841477ebc4ccbb12334dfd1954417a3c831c","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        Process a REVERT job."},{"line_number":862,"context_line":"        \"\"\""},{"line_number":863,"context_line":"        self.logger.increment("},{"line_number":864,"context_line":"            \u0027partition.delete.count.%s\u0027 % (job[\u0027local_dev\u0027][\u0027device\u0027],))"},{"line_number":865,"context_line":"        syncd_with \u003d 0"},{"line_number":866,"context_line":"        reverted_objs \u003d {}"},{"line_number":867,"context_line":"        for node in job[\u0027sync_to\u0027]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_89ee31b2","line":864,"range":{"start_line":864,"start_character":23,"end_line":864,"end_character":29},"updated":"2019-02-08 22:45:04.000000000","message":"Off-topic: Hey! We won\u0027t *necessarily* delete!","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3240841477ebc4ccbb12334dfd1954417a3c831c","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        syncd_with \u003d 0"},{"line_number":866,"context_line":"        reverted_objs \u003d {}"},{"line_number":867,"context_line":"        for node in job[\u0027sync_to\u0027]:"},{"line_number":868,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":869,"context_line":"                node[\u0027index\u0027])"},{"line_number":870,"context_line":"            success, in_sync_objs \u003d ssync_sender("},{"line_number":871,"context_line":"                self, node, job, job[\u0027suffixes\u0027])()"},{"line_number":872,"context_line":"            if success:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_692e6da6","line":869,"range":{"start_line":868,"start_character":12,"end_line":869,"end_character":30},"updated":"2019-02-08 22:45:04.000000000","message":"It feels weird that we stopped assigning backend_index in _sync, but we still do it in _revert...\n\nI suppose it\u0027s because we call _iter_nodes_for_frag as part of a sync, but not a revert... but maybe we *should* do it as part of a revert? Like, suppose I\u0027m a handoff for some frag and there\u0027s a rebalance -- it didn\u0027t change where *this* frag is assigned, but say it kicked me *way* out in the handoff list.\n\nWhy *wouldn\u0027t* I want to get this to one of the earlier handoffs where the proxy might actually see it? Hell, the neighbors may have already rebuilt to that new handoff -- why should I keep hanging on to this data?","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9a0fea3c5af029cae87add2aef0bd8e1bfe1d60c","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        syncd_with \u003d 0"},{"line_number":866,"context_line":"        reverted_objs \u003d {}"},{"line_number":867,"context_line":"        for node in job[\u0027sync_to\u0027]:"},{"line_number":868,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":869,"context_line":"                node[\u0027index\u0027])"},{"line_number":870,"context_line":"            success, in_sync_objs \u003d ssync_sender("},{"line_number":871,"context_line":"                self, node, job, job[\u0027suffixes\u0027])()"},{"line_number":872,"context_line":"            if success:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_6f0dfb3c","line":869,"range":{"start_line":868,"start_character":12,"end_line":869,"end_character":30},"in_reply_to":"9fdfeff1_692e6da6","updated":"2019-02-11 15:34:50.000000000","message":"I\u0027m open to different ideas about how to organize the backend_index keys... but as far as reverting to handoffs - we stopped doing that on purpose as part of work to make EC rebalance tenable.\n\nrevert to handoff ended up being a useless spend of i/o budget - in most cases the proxy will find plenty of frags to rebuild on primaries.\n\nImagine a 8+4 scheme - only 1 frag moves per rebalance.  If we can\u0027t put the frag where it goes (because that disk is busy loading up with frags from other nodes) - it\u0027s better to wait our turn than to bounce things around the cluster.","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"        self.resp \u003d self.final_resp \u003d resp"},{"line_number":1614,"context_line":"        self.path \u003d path"},{"line_number":1615,"context_line":"        self.connect_duration \u003d connect_duration"},{"line_number":1616,"context_line":"        # XXX for handoff nodes node_index is None"},{"line_number":1617,"context_line":"        self.node_index \u003d node.get(\u0027index\u0027)"},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"        self.failed \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_ddcc2563","line":1616,"updated":"2019-02-06 16:02:15.000000000","message":"I should revert this","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"}],"test/unit/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        for p in range(2 ** self.part_power):"},{"line_number":377,"context_line":"            for r in range(self.replicas):"},{"line_number":378,"context_line":"                self._replica2part2dev_id[r][p] \u003d next(dev_ids)"},{"line_number":379,"context_line":"        self._update_bookkeeping()"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"class FakeMemcache(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_5dc03551","line":379,"updated":"2019-02-06 16:02:15.000000000","message":"I\u0027m not 100% if this was required in the final unittest revisions... but it\u0027s correct regardless and the method extraction probably useful purely from a maintenance perspective - I hope.","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979980bd58b684cbbe3693aaeb389980b710c347","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        for p in range(2 ** self.part_power):"},{"line_number":377,"context_line":"            for r in range(self.replicas):"},{"line_number":378,"context_line":"                self._replica2part2dev_id[r][p] \u003d next(dev_ids)"},{"line_number":379,"context_line":"        self._update_bookkeeping()"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"class FakeMemcache(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_3c50bd5e","line":379,"in_reply_to":"9fdfeff1_5dc03551","updated":"2019-02-07 15:32:31.000000000","message":"ok it is still needed for something in the reconstructor tests...","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3240841477ebc4ccbb12334dfd1954417a3c831c","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                   \u0027zone\u0027: x % 3,"},{"line_number":285,"context_line":"                   \u0027region\u0027: x % 2,"},{"line_number":286,"context_line":"                   \u0027id\u0027: x,"},{"line_number":287,"context_line":"                   \u0027handoff_index\u0027: next(index_counter)}"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"def write_fake_ring(path, *devs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_ac5f833f","line":287,"range":{"start_line":287,"start_character":36,"end_line":287,"end_character":55},"updated":"2019-02-08 22:45:04.000000000","message":"Or, y\u0027know,\n\n x - self.replicas\n\n*shrug*","commit_id":"ea8e545a27f06868323ff91c1584d18ab9ac6cda"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        skip_if_no_xattrs()"},{"line_number":153,"context_line":"        self.testdir \u003d tempfile.mkdtemp()"},{"line_number":154,"context_line":"        POLICIES[0].object_ring \u003d FabricatedRing(3)"},{"line_number":155,"context_line":"        POLICIES[1].object_ring \u003d FabricatedRing(5)"},{"line_number":156,"context_line":"        utils.HASH_PATH_SUFFIX \u003d b\u0027endcap\u0027"},{"line_number":157,"context_line":"        utils.HASH_PATH_PREFIX \u003d b\u0027\u0027"},{"line_number":158,"context_line":"        self.devices \u003d os.path.join(self.testdir, \u0027node\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_1d04ed7a","line":155,"updated":"2019-02-06 16:02:15.000000000","message":"Most of the test churn was related to this change - but MAN a FabricatedRing is a lot easier to reason about than the weird empty stubs we setup with not-enough-replicas","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                        1: \u00270e6e8d48d801dc89fd31904ae3b31229\u0027,"},{"line_number":564,"context_line":"                    },"},{"line_number":565,"context_line":"                },"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"            }]"},{"line_number":568,"context_line":"        )"},{"line_number":569,"context_line":"        # part num 2"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_bd260116","line":566,"updated":"2019-02-06 16:02:15.000000000","message":"in addition to slightly different parts assigned to the devices because of the ring change - you also see sync jobs having the 3 sync_to nodes instead of 2","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2e4d4ce33ebd3ad594a3a2cd4243a8505f33c4b0","unresolved":false,"context_lines":[{"line_number":928,"context_line":"            (3, [0, 1, 2, 3, 4, 5], [2, 4, 0]),"},{"line_number":929,"context_line":"            (4, [0, 1, 2, 3, 4, 5], [3, 5, 1]),"},{"line_number":930,"context_line":"            (5, [0, 1, 2, 3, 4, 5], [4, 0, 2]),"},{"line_number":931,"context_line":"            (5, [1, 4, 0, 2, 3, 5], [3, 1, 0]),"},{"line_number":932,"context_line":"        )"},{"line_number":933,"context_line":"        failures \u003d []"},{"line_number":934,"context_line":"        for frag_index, part_nodes, partners in expected:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_7d2099f8","line":931,"updated":"2019-02-06 16:02:15.000000000","message":"I hope this clearly demonstrates the get_partners, we could add more examples","commit_id":"d07b48dc66597462ac716526f57e2c4636feacb6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5edddc9ebe2ed6feaba43cf9de6c1012e7ef8e5d","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"    def test_process_job_all_insufficient_storage(self):"},{"line_number":1356,"context_line":"        self.reconstructor._reset_stats()"},{"line_number":1357,"context_line":"        with mock_ssync_sender():"},{"line_number":1358,"context_line":"            with mocked_http_conn(*[507] * 29):"},{"line_number":1359,"context_line":"                found_jobs \u003d []"},{"line_number":1360,"context_line":"                for part_info in self.reconstructor.collect_parts():"},{"line_number":1361,"context_line":"                    jobs \u003d self.reconstructor.build_reconstruction_jobs("}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_463b6fc7","line":1358,"updated":"2019-02-07 17:08:26.000000000","message":"this should be like 15 i guess, but i\u0027m still thinking about changing if/how we limit handoff depth","commit_id":"7d569444f79a416b163d92e7874725e03f643816"}]}
