)]}'
{"swift/cli/ringbuilder.py":[{"author":{"_account_id":18015,"name":"Peter Lisák","email":"peter.lisak@gmail.com","username":"peter.lisak"},"change_message_id":"09675a66593755089226fd01c6f71dcdf51558fc","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                  \u0027weight partitions balance flags meta\u0027)"},{"line_number":455,"context_line":"            for dev in builder.devs:"},{"line_number":456,"context_line":"                if dev is None:"},{"line_number":457,"context_line":"                    continue"},{"line_number":458,"context_line":"                flags \u003d \u0027DEL\u0027 if dev in builder._remove_devs else \u0027\u0027"},{"line_number":459,"context_line":"                print(\u0027         %5d %7d %5d %15s %5d %15s %17d %9s %6.02f \u0027"},{"line_number":460,"context_line":"                      \u0027%10s %7.02f %5s %s\u0027 %"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2e0a75d3","line":457,"updated":"2015-11-10 12:37:36.000000000","message":"for dev in builder._iter_devs(): ?","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                  \u0027weight partitions balance flags meta\u0027)"},{"line_number":455,"context_line":"            for dev in builder.devs:"},{"line_number":456,"context_line":"                if dev is None:"},{"line_number":457,"context_line":"                    continue"},{"line_number":458,"context_line":"                flags \u003d \u0027DEL\u0027 if dev in builder._remove_devs else \u0027\u0027"},{"line_number":459,"context_line":"                print(\u0027         %5d %7d %5d %15s %5d %15s %17d %9s %6.02f \u0027"},{"line_number":460,"context_line":"                      \u0027%10s %7.02f %5s %s\u0027 %"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_0f4294ae","line":457,"in_reply_to":"da85f559_2e0a75d3","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"}],"swift/common/ring/builder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4055bc3efafa5a8edd8cce0f2a3a02a68fab52dd","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            self._initial_balance()"},{"line_number":426,"context_line":"            self.devs_changed \u003d False"},{"line_number":427,"context_line":"            self._build_dispersion_graph()"},{"line_number":428,"context_line":"            return self.parts, self.get_balance(), 0"},{"line_number":429,"context_line":"        changed_parts \u003d 0"},{"line_number":430,"context_line":"        self._update_last_part_moves()"},{"line_number":431,"context_line":"        last_balance \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_4980b346","side":"PARENT","line":428,"updated":"2015-11-05 18:06:10.000000000","message":"see here we just lied about about how many part-replicas were rebalanced.","commit_id":"7242c4a006c39f6f5a3e53607dc5e2998328b3c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cf2282d8704518c5f363ea3bb12eaa9a0438ac7d","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            if not sum(d[\u0027parts_wanted\u0027] \u003c 0 for d in"},{"line_number":462,"context_line":"                       self._iter_devs()):"},{"line_number":463,"context_line":"                finish_status \u003d \u0027Finished\u0027"},{"line_number":464,"context_line":"                break"},{"line_number":465,"context_line":"        else:"},{"line_number":466,"context_line":"            finish_status \u003d \u0027Unable to finish\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_e14a0283","line":463,"updated":"2015-11-05 01:20:33.000000000","message":"I think this exit status can be loosened up a little bit, looking at balance isn\u0027t going to help us anymore because it won\u0027t respect the replica_plan - but counting up mis-placed parts and breaking out if it didn\u0027t improve by at least 1% is probably sufficient.","commit_id":"159cf2549a5ec5800978b47dc0e5e4486f44897f"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# import bisect"},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import errno"},{"line_number":19,"context_line":"import itertools"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_a03a04e6","line":16,"updated":"2015-11-09 20:44:53.000000000","message":"nit: commented-out code","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# import bisect"},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import errno"},{"line_number":19,"context_line":"import itertools"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4f0adc7a","line":16,"in_reply_to":"da85f559_a03a04e6","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        # the number of hours since a given partition was last moved."},{"line_number":107,"context_line":"        # This is used to guarantee we don\u0027t move a partition twice"},{"line_number":108,"context_line":"        # within a given number of hours (24 is my usual test). Removing"},{"line_number":109,"context_line":"        # a device overrides this behavior as it\u0027s assumed thats only"},{"line_number":110,"context_line":"        # done because of device failure."},{"line_number":111,"context_line":"        self._last_part_moves \u003d None"},{"line_number":112,"context_line":"        # _last_part_moves_epoch indicates the time the offsets in"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_6025fcc0","line":109,"updated":"2015-11-09 20:44:53.000000000","message":"nit: that\u0027s","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        # the number of hours since a given partition was last moved."},{"line_number":107,"context_line":"        # This is used to guarantee we don\u0027t move a partition twice"},{"line_number":108,"context_line":"        # within a given number of hours (24 is my usual test). Removing"},{"line_number":109,"context_line":"        # a device overrides this behavior as it\u0027s assumed thats only"},{"line_number":110,"context_line":"        # done because of device failure."},{"line_number":111,"context_line":"        self._last_part_moves \u003d None"},{"line_number":112,"context_line":"        # _last_part_moves_epoch indicates the time the offsets in"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2f267815","line":109,"in_reply_to":"da85f559_6025fcc0","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":659,"context_line":"    def _build_balance_per_dev(self):"},{"line_number":660,"context_line":"        \"\"\""},{"line_number":661,"context_line":"        Build a map of \u003cdevice_id\u003e \u003d\u003e \u003cbalance\u003e where \u003cbalance\u003e is a"},{"line_number":662,"context_line":"        float representing the percentage off the desired amount of"},{"line_number":663,"context_line":"        partitions a given device wants."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        N.B. this method only considers a devices\u0027 weight and the parts"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_6b4b9d2c","line":662,"updated":"2015-11-09 20:44:53.000000000","message":"nit: of","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":659,"context_line":"    def _build_balance_per_dev(self):"},{"line_number":660,"context_line":"        \"\"\""},{"line_number":661,"context_line":"        Build a map of \u003cdevice_id\u003e \u003d\u003e \u003cbalance\u003e where \u003cbalance\u003e is a"},{"line_number":662,"context_line":"        float representing the percentage off the desired amount of"},{"line_number":663,"context_line":"        partitions a given device wants."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        N.B. this method only considers a devices\u0027 weight and the parts"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2f543851","line":662,"in_reply_to":"da85f559_6b4b9d2c","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":662,"context_line":"        float representing the percentage off the desired amount of"},{"line_number":663,"context_line":"        partitions a given device wants."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        N.B. this method only considers a devices\u0027 weight and the parts"},{"line_number":666,"context_line":"        assigned, not the parts wanted according to the replica plan."},{"line_number":667,"context_line":"        \"\"\""},{"line_number":668,"context_line":"        weight_of_one_part \u003d self.weight_of_one_part()"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_8b48412f","line":665,"updated":"2015-11-09 20:44:53.000000000","message":"nit: device\u0027s","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":662,"context_line":"        float representing the percentage off the desired amount of"},{"line_number":663,"context_line":"        partitions a given device wants."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        N.B. this method only considers a devices\u0027 weight and the parts"},{"line_number":666,"context_line":"        assigned, not the parts wanted according to the replica plan."},{"line_number":667,"context_line":"        \"\"\""},{"line_number":668,"context_line":"        weight_of_one_part \u003d self.weight_of_one_part()"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_cf4c8cca","line":665,"in_reply_to":"da85f559_8b48412f","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":702,"context_line":"        dispersed."},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        The required overload is the largest percentage change of any single"},{"line_number":705,"context_line":"        device from it\u0027s weighted replicanth to it\u0027s wanted replicanth (note"},{"line_number":706,"context_line":"        under weighted devices have a negative precentage change) to archive"},{"line_number":707,"context_line":"        dispersion - that is to say a single device that must be overloaded by"},{"line_number":708,"context_line":"        5% is worse than 5 devices in a single tier overloaded by 1%."}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_551637a8","line":705,"updated":"2015-11-09 20:44:53.000000000","message":"nit: its (both times)","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":702,"context_line":"        dispersed."},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        The required overload is the largest percentage change of any single"},{"line_number":705,"context_line":"        device from it\u0027s weighted replicanth to it\u0027s wanted replicanth (note"},{"line_number":706,"context_line":"        under weighted devices have a negative precentage change) to archive"},{"line_number":707,"context_line":"        dispersion - that is to say a single device that must be overloaded by"},{"line_number":708,"context_line":"        5% is worse than 5 devices in a single tier overloaded by 1%."}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4fcf3c29","line":705,"in_reply_to":"da85f559_551637a8","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        The required overload is the largest percentage change of any single"},{"line_number":705,"context_line":"        device from it\u0027s weighted replicanth to it\u0027s wanted replicanth (note"},{"line_number":706,"context_line":"        under weighted devices have a negative precentage change) to archive"},{"line_number":707,"context_line":"        dispersion - that is to say a single device that must be overloaded by"},{"line_number":708,"context_line":"        5% is worse than 5 devices in a single tier overloaded by 1%."},{"line_number":709,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_eb5d4ded","line":706,"updated":"2015-11-09 20:44:53.000000000","message":"nit: percentage","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        The required overload is the largest percentage change of any single"},{"line_number":705,"context_line":"        device from it\u0027s weighted replicanth to it\u0027s wanted replicanth (note"},{"line_number":706,"context_line":"        under weighted devices have a negative precentage change) to archive"},{"line_number":707,"context_line":"        dispersion - that is to say a single device that must be overloaded by"},{"line_number":708,"context_line":"        5% is worse than 5 devices in a single tier overloaded by 1%."},{"line_number":709,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_0fde14dd","line":706,"in_reply_to":"da85f559_eb5d4ded","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def _build_tier2children(self):"},{"line_number":765,"context_line":"        \"\"\""},{"line_number":766,"context_line":"        Wrap helper buld_tier_tree so exclude zero-weight devices."},{"line_number":767,"context_line":"        \"\"\""},{"line_number":768,"context_line":"        return build_tier_tree(d for d in self._iter_devs() if d[\u0027weight\u0027])"},{"line_number":769,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_3561333a","line":766,"updated":"2015-11-09 20:44:53.000000000","message":"nit: build_tier_tree","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def _build_tier2children(self):"},{"line_number":765,"context_line":"        \"\"\""},{"line_number":766,"context_line":"        Wrap helper buld_tier_tree so exclude zero-weight devices."},{"line_number":767,"context_line":"        \"\"\""},{"line_number":768,"context_line":"        return build_tier_tree(d for d in self._iter_devs() if d[\u0027weight\u0027])"},{"line_number":769,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_cfe32ca3","line":766,"in_reply_to":"da85f559_3561333a","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":964,"context_line":"                    continue"},{"line_number":965,"context_line":"                dev \u003d self.devs[dev_id]"},{"line_number":966,"context_line":"                # when it comes to multiple part replicas on the same dev no"},{"line_number":967,"context_line":"                # time is too soon to fix it!"},{"line_number":968,"context_line":"                if (self._last_part_moves[part] \u003c self.min_part_hours and"},{"line_number":969,"context_line":"                        not replicas_at_tier[dev[\u0027tiers\u0027][-1]] \u003e 1):"},{"line_number":970,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_a86946c0","line":967,"updated":"2015-11-09 20:44:53.000000000","message":"might want a note here that this only happens with rings built by previous versions of the ring builder since this one can\u0027t place things this way","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":964,"context_line":"                    continue"},{"line_number":965,"context_line":"                dev \u003d self.devs[dev_id]"},{"line_number":966,"context_line":"                # when it comes to multiple part replicas on the same dev no"},{"line_number":967,"context_line":"                # time is too soon to fix it!"},{"line_number":968,"context_line":"                if (self._last_part_moves[part] \u003c self.min_part_hours and"},{"line_number":969,"context_line":"                        not replicas_at_tier[dev[\u0027tiers\u0027][-1]] \u003e 1):"},{"line_number":970,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_ef8e30cf","line":967,"in_reply_to":"da85f559_a86946c0","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"        overweight drives where the replicas can be better dispersed to"},{"line_number":1001,"context_line":"        another failure domain."},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"},{"line_number":1004,"context_line":"        :param start: offset into self.parts to begin search"},{"line_number":1005,"context_line":"        :param replica_plan: replicanth targets for tiers"},{"line_number":1006,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_289c76bf","line":1003,"updated":"2015-11-09 20:44:53.000000000","message":"nit: partition","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"        overweight drives where the replicas can be better dispersed to"},{"line_number":1001,"context_line":"        another failure domain."},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"},{"line_number":1004,"context_line":"        :param start: offset into self.parts to begin search"},{"line_number":1005,"context_line":"        :param replica_plan: replicanth targets for tiers"},{"line_number":1006,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4fb41c81","line":1003,"in_reply_to":"da85f559_289c76bf","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        device from which they are gathered."},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        This method allows devices to flop around enough to unlock replicas"},{"line_number":1085,"context_line":"        that would have other wise potentially been locked because of"},{"line_number":1086,"context_line":"        dispersion - it should be used as a last resort."},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_a8cf067e","line":1085,"updated":"2015-11-09 20:44:53.000000000","message":"nit: otherwise","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        device from which they are gathered."},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        This method allows devices to flop around enough to unlock replicas"},{"line_number":1085,"context_line":"        that would have other wise potentially been locked because of"},{"line_number":1086,"context_line":"        dispersion - it should be used as a last resort."},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_cfa80c23","line":1085,"in_reply_to":"da85f559_a8cf067e","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"        that would have other wise potentially been locked because of"},{"line_number":1086,"context_line":"        dispersion - it should be used as a last resort."},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"},{"line_number":1089,"context_line":"        :param start: offset into self.parts to begin search"},{"line_number":1090,"context_line":"        \"\"\""},{"line_number":1091,"context_line":"        for offset in range(self.parts):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2889d626","line":1088,"updated":"2015-11-09 20:44:53.000000000","message":"nit: partition","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"        that would have other wise potentially been locked because of"},{"line_number":1086,"context_line":"        dispersion - it should be used as a last resort."},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        :param assign_parts: the map of partion \u003d\u003e [replica] to update"},{"line_number":1089,"context_line":"        :param start: offset into self.parts to begin search"},{"line_number":1090,"context_line":"        \"\"\""},{"line_number":1091,"context_line":"        for offset in range(self.parts):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_efa5d046","line":1088,"in_reply_to":"da85f559_2889d626","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"    def _build_replica_plan(self):"},{"line_number":1520,"context_line":"        \"\"\""},{"line_number":1521,"context_line":"        Wraps return value of _build_target_replicas_by-tier to include"},{"line_number":1522,"context_line":"        pre-calculated min and max values for each tier."},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"        :returns: a dict, mapping \u003ctier\u003e \u003d\u003e \u003creplica_plan\u003e, where"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_08bad26e","line":1521,"updated":"2015-11-09 20:44:53.000000000","message":"nit: by_tier","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"    def _build_replica_plan(self):"},{"line_number":1520,"context_line":"        \"\"\""},{"line_number":1521,"context_line":"        Wraps return value of _build_target_replicas_by-tier to include"},{"line_number":1522,"context_line":"        pre-calculated min and max values for each tier."},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"        :returns: a dict, mapping \u003ctier\u003e \u003d\u003e \u003creplica_plan\u003e, where"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_8f65241f","line":1521,"in_reply_to":"da85f559_08bad26e","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":430,"context_line":"            self._last_part_moves \u003d array(\u0027B\u0027, itertools.repeat(0, self.parts))"},{"line_number":431,"context_line":"        self._update_last_part_moves()"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        replica_plan \u003d self._build_replica_plan()"},{"line_number":434,"context_line":"        self._set_parts_wanted(replica_plan)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        assign_parts \u003d defaultdict(list)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_02928557","line":433,"updated":"2015-12-07 11:41:34.000000000","message":"In the _build_replica_plan description, it looks to build a map \u003ctier\u003e-\u003e\u003creplica_plan\u003e so currently the code looks to be confusable what \"replica_plan\" means.","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        partitions the device wants based on its relative weight. This key is"},{"line_number":773,"context_line":"        used to sort the devices according to \"most wanted\" during rebalancing"},{"line_number":774,"context_line":"        to best distribute partitions. A negative parts_wanted indicates the"},{"line_number":775,"context_line":"        device is \"overweight\" and wishes to give partitions away if possible."},{"line_number":776,"context_line":"        \"\"\""},{"line_number":777,"context_line":"        tier2children \u003d self._build_tier2children()"},{"line_number":778,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_82ed1527","line":775,"updated":"2015-12-07 11:41:34.000000000","message":"I like to add a description for replica_plan in args, here. (it seems L1527...)","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79d09d32fd1de3b2088001612931e925f2de43ec","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        partitions the device wants based on its relative weight. This key is"},{"line_number":773,"context_line":"        used to sort the devices according to \"most wanted\" during rebalancing"},{"line_number":774,"context_line":"        to best distribute partitions. A negative parts_wanted indicates the"},{"line_number":775,"context_line":"        device is \"overweight\" and wishes to give partitions away if possible."},{"line_number":776,"context_line":"        \"\"\""},{"line_number":777,"context_line":"        tier2children \u003d self._build_tier2children()"},{"line_number":778,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_f6283435","line":775,"in_reply_to":"7a740942_82ed1527","updated":"2015-12-08 00:40:34.000000000","message":"Done","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"            if not dev[\u0027weight\u0027]:"},{"line_number":1331,"context_line":"                continue"},{"line_number":1332,"context_line":"            weighted_replicas \u003d ("},{"line_number":1333,"context_line":"                dev[\u0027weight\u0027] * weight_of_one_part / self.parts)"},{"line_number":1334,"context_line":"            if weighted_replicas \u003c 1:"},{"line_number":1335,"context_line":"                devices_with_room.append(dev[\u0027id\u0027])"},{"line_number":1336,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_2913e40e","line":1333,"updated":"2015-12-07 11:41:34.000000000","message":"memo) this means dev[\u0027weight\u0027]/sum(all dev[\u0027weight\u0027]) * self.replica so sum(weighted_replicas_for_dev should.values()) at L1341 should be \u003c\u003dself.replicas at first...","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"            if weighted_replicas \u003c 1:"},{"line_number":1335,"context_line":"                devices_with_room.append(dev[\u0027id\u0027])"},{"line_number":1336,"context_line":"            else:"},{"line_number":1337,"context_line":"                weighted_replicas \u003d 1"},{"line_number":1338,"context_line":"            weighted_replicas_for_dev[dev[\u0027id\u0027]] \u003d weighted_replicas"},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_783bfc9c","line":1337,"updated":"2015-12-07 11:41:34.000000000","message":"memo) weighted_replicas should be 1 at most because we want to set 1 replica for each device, right?","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79d09d32fd1de3b2088001612931e925f2de43ec","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"            if weighted_replicas \u003c 1:"},{"line_number":1335,"context_line":"                devices_with_room.append(dev[\u0027id\u0027])"},{"line_number":1336,"context_line":"            else:"},{"line_number":1337,"context_line":"                weighted_replicas \u003d 1"},{"line_number":1338,"context_line":"            weighted_replicas_for_dev[dev[\u0027id\u0027]] \u003d weighted_replicas"},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_91e9bae8","line":1337,"in_reply_to":"7a740942_783bfc9c","updated":"2015-12-08 00:40:34.000000000","message":"correct","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1342,"context_line":"            if remaining \u003c 1e-10:"},{"line_number":1343,"context_line":"                break"},{"line_number":1344,"context_line":"            devices_with_room \u003d [d for d in devices_with_room if"},{"line_number":1345,"context_line":"                                 weighted_replicas_for_dev[d] \u003c 1]"},{"line_number":1346,"context_line":"            rel_weight \u003d remaining / sum("},{"line_number":1347,"context_line":"                weighted_replicas_for_dev[d] for d in devices_with_room)"},{"line_number":1348,"context_line":"            for d in devices_with_room:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_73355df5","line":1345,"updated":"2015-12-07 11:41:34.000000000","message":"I thought we don\u0027t need this list comprehension because devices_with_room seems a list of devs whose weighted_replicas less than 1 (looking at 1335) but L1349 updates weighted_replicas_for_dev so it probably true we should update devicec_with_room here...\n\nHowever, if we could this below to L1348 for-loop, it might be more readable.","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1352,"context_line":"        weighted_replicas_by_tier \u003d defaultdict(float)"},{"line_number":1353,"context_line":"        for dev in self._iter_devs():"},{"line_number":1354,"context_line":"            if not dev[\u0027weight\u0027]:"},{"line_number":1355,"context_line":"                continue"},{"line_number":1356,"context_line":"            assigned_replicanths \u003d weighted_replicas_for_dev[dev[\u0027id\u0027]]"},{"line_number":1357,"context_line":"            dev_tier \u003d (dev[\u0027region\u0027], dev[\u0027zone\u0027], dev[\u0027ip\u0027], dev[\u0027id\u0027])"},{"line_number":1358,"context_line":"            for i in range(len(dev_tier) + 1):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_339d9559","line":1355,"updated":"2015-12-07 11:41:34.000000000","message":"nits) I like to add a sub method like \"_iter_available_devs\" to get a list of devs which has \u003e0 weight.","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79d09d32fd1de3b2088001612931e925f2de43ec","unresolved":false,"context_lines":[{"line_number":1352,"context_line":"        weighted_replicas_by_tier \u003d defaultdict(float)"},{"line_number":1353,"context_line":"        for dev in self._iter_devs():"},{"line_number":1354,"context_line":"            if not dev[\u0027weight\u0027]:"},{"line_number":1355,"context_line":"                continue"},{"line_number":1356,"context_line":"            assigned_replicanths \u003d weighted_replicas_for_dev[dev[\u0027id\u0027]]"},{"line_number":1357,"context_line":"            dev_tier \u003d (dev[\u0027region\u0027], dev[\u0027zone\u0027], dev[\u0027ip\u0027], dev[\u0027id\u0027])"},{"line_number":1358,"context_line":"            for i in range(len(dev_tier) + 1):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_b1e63613","line":1355,"in_reply_to":"7a740942_339d9559","updated":"2015-12-08 00:40:34.000000000","message":"that\u0027d be a good follow up (wishlist!?)","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1360,"context_line":"                weighted_replicas_by_tier[tier] +\u003d assigned_replicanths"},{"line_number":1361,"context_line":""},{"line_number":1362,"context_line":"        # belts \u0026 suspenders/paranoia -  at every level, the sum of"},{"line_number":1363,"context_line":"        # wanted_replicas should be very close to the total number of"},{"line_number":1364,"context_line":"        # replicas for the ring"},{"line_number":1365,"context_line":"        tiers \u003d [\u0027cluster\u0027, \u0027regions\u0027, \u0027zones\u0027, \u0027servers\u0027, \u0027devices\u0027]"},{"line_number":1366,"context_line":"        for i, tier_name in enumerate(tiers):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_09b148e1","line":1363,"updated":"2015-12-07 11:41:34.000000000","message":"nits) s/wanted_replicas/weighted_replicas/ ?","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79d09d32fd1de3b2088001612931e925f2de43ec","unresolved":false,"context_lines":[{"line_number":1360,"context_line":"                weighted_replicas_by_tier[tier] +\u003d assigned_replicanths"},{"line_number":1361,"context_line":""},{"line_number":1362,"context_line":"        # belts \u0026 suspenders/paranoia -  at every level, the sum of"},{"line_number":1363,"context_line":"        # wanted_replicas should be very close to the total number of"},{"line_number":1364,"context_line":"        # replicas for the ring"},{"line_number":1365,"context_line":"        tiers \u003d [\u0027cluster\u0027, \u0027regions\u0027, \u0027zones\u0027, \u0027servers\u0027, \u0027devices\u0027]"},{"line_number":1366,"context_line":"        for i, tier_name in enumerate(tiers):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_71ec4ef3","line":1363,"in_reply_to":"7a740942_09b148e1","updated":"2015-12-08 00:40:34.000000000","message":"Done","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"176fe94bef4992329b14857bee6ad3efd2f02c3d","unresolved":false,"context_lines":[{"line_number":1530,"context_line":"        \u003creplica_plan\u003e include at least the following keys:"},{"line_number":1531,"context_line":""},{"line_number":1532,"context_line":"            min - the minimum number of replicas at the tier"},{"line_number":1533,"context_line":"            target - the target replicanths at the tier"},{"line_number":1534,"context_line":"            max - the maximum number of replicas at the tier"},{"line_number":1535,"context_line":"        \"\"\""},{"line_number":1536,"context_line":"        # replica part-y planner!"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_a2ae1183","line":1533,"updated":"2015-12-07 11:41:34.000000000","message":"nits) replicanths -\u003e typo? sorry, i didn\u0027t catch the correct mean right now but... i found same phrase appeared in _build_weighted_replicas_by_tier...","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79d09d32fd1de3b2088001612931e925f2de43ec","unresolved":false,"context_lines":[{"line_number":1530,"context_line":"        \u003creplica_plan\u003e include at least the following keys:"},{"line_number":1531,"context_line":""},{"line_number":1532,"context_line":"            min - the minimum number of replicas at the tier"},{"line_number":1533,"context_line":"            target - the target replicanths at the tier"},{"line_number":1534,"context_line":"            max - the maximum number of replicas at the tier"},{"line_number":1535,"context_line":"        \"\"\""},{"line_number":1536,"context_line":"        # replica part-y planner!"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_5174b234","line":1533,"in_reply_to":"7a740942_a2ae1183","updated":"2015-12-08 00:40:34.000000000","message":"terms are in dependent change -\u003e https://review.openstack.org/#/c/244412/\n\nI put it \"after\" this one because in case it needed more collaboration/iteration and didn\u0027t want to introduce a bunch of rebase churn for reviewers here.","commit_id":"e8e6241df46fb5e8a9d7744de601dff90798fcea"}],"test/unit/common/ring/test_builder.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def assertApproximately(self, a, b, error\u003d1e-6):"},{"line_number":47,"context_line":"        self.assertTrue(abs(a - b) \u003c error,"},{"line_number":48,"context_line":"                        \"%f and %f differ by more than %f\" % (a, b, error))"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _partition_counts(self, builder, key\u003d\u0027id\u0027):"},{"line_number":51,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_0bf72cf6","line":48,"updated":"2015-11-09 20:44:53.000000000","message":"https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertAlmostEqual\n\n    self.assertAlmostEqual(a, b, delta\u003d1e-6)\n\nit\u0027s in python 2.7 and up","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def assertApproximately(self, a, b, error\u003d1e-6):"},{"line_number":47,"context_line":"        self.assertTrue(abs(a - b) \u003c error,"},{"line_number":48,"context_line":"                        \"%f and %f differ by more than %f\" % (a, b, error))"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _partition_counts(self, builder, key\u003d\u0027id\u0027):"},{"line_number":51,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4f109c59","line":48,"in_reply_to":"da85f559_0bf72cf6","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"6871955d416f7ca730b746adc9e543a56e43f110","unresolved":false,"context_lines":[{"line_number":2409,"context_line":"                          for (tier, weighted) in target_replicas.items()"},{"line_number":2410,"context_line":"                          if len(tier) \u003d\u003d 4})"},{"line_number":2411,"context_line":""},{"line_number":2412,"context_line":"    def test_three_devices_get_what_they_get_and_like_it(self):"},{"line_number":2413,"context_line":"        rb \u003d ring.RingBuilder(8, 3, 1)"},{"line_number":2414,"context_line":"        rb.add_dev({\u0027id\u0027: 0, \u0027region\u0027: 0, \u0027zone\u0027: 0, \u0027weight\u0027: 7.47,"},{"line_number":2415,"context_line":"                    \u0027ip\u0027: \u0027127.0.0.1\u0027, \u0027port\u0027: 10000, \u0027device\u0027: \u0027sda\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_0baf2c95","line":2412,"updated":"2015-11-09 20:44:53.000000000","message":"lol","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c943ccc3fd4c5b7524b7951bb869694a0432fe7","unresolved":false,"context_lines":[{"line_number":2409,"context_line":"                          for (tier, weighted) in target_replicas.items()"},{"line_number":2410,"context_line":"                          if len(tier) \u003d\u003d 4})"},{"line_number":2411,"context_line":""},{"line_number":2412,"context_line":"    def test_three_devices_get_what_they_get_and_like_it(self):"},{"line_number":2413,"context_line":"        rb \u003d ring.RingBuilder(8, 3, 1)"},{"line_number":2414,"context_line":"        rb.add_dev({\u0027id\u0027: 0, \u0027region\u0027: 0, \u0027zone\u0027: 0, \u0027weight\u0027: 7.47,"},{"line_number":2415,"context_line":"                    \u0027ip\u0027: \u0027127.0.0.1\u0027, \u0027port\u0027: 10000, \u0027device\u0027: \u0027sda\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_0f0ff437","line":2412,"in_reply_to":"da85f559_0baf2c95","updated":"2015-11-11 01:05:25.000000000","message":"Done","commit_id":"a3648f7a23efd962503d2b9c8eed3076e1fe6d9c"}]}
