)]}'
{"doc/source/overview_erasure_code.rst":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":291,"context_line":"(\u0027ec_num_data_fragments\u0027 + \u0027ec_num_parity_fragments\u0027) *"},{"line_number":292,"context_line":"\u0027ec_duplication_factor\u0027). This *can* allow for a failure domain to rebuild"},{"line_number":293,"context_line":"an object to full durability even when *more* than 14 fragments are"},{"line_number":294,"context_line":"unavailable."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"--------------"},{"line_number":297,"context_line":"Under the Hood"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a461143_2fdce845","line":294,"updated":"2017-02-02 03:25:12.000000000","message":"This and a whole bunch *more* needs to go into *detail* about why a ring with two regions and ec_duplication_factor does *not* give you global-ec","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"etc/swift.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":87,"context_line":"#"},{"line_number":88,"context_line":"# Duplicated EC fragments is proof-of-concept experimental support to enable"},{"line_number":89,"context_line":"# Global Erasure Coding policies with multiple regions acting as independent"},{"line_number":90,"context_line":"# failure domains.  Do not change the default except in development/testing."},{"line_number":91,"context_line":"#ec_duplication_factor \u003d 1"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"# The swift-constraints section sets the basic constraints on data"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a461143_efd10031","line":90,"updated":"2017-02-02 03:25:12.000000000","message":"I think *this* and probably not much more is appropriate for the example configs.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e697e84e76b170b27ef9d2869dc1af939d2802eb","unresolved":false,"context_lines":[{"line_number":87,"context_line":"#"},{"line_number":88,"context_line":"# Duplicated EC fragments is proof-of-concept experimental support to enable"},{"line_number":89,"context_line":"# Global Erasure Coding policies with multiple regions acting as independent"},{"line_number":90,"context_line":"# failure domains.  Do not change the default except in development/testing."},{"line_number":91,"context_line":"#ec_duplication_factor \u003d 1"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"# The swift-constraints section sets the basic constraints on data"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"1a430d35_c0a7c24d","line":90,"in_reply_to":"3a461143_efd10031","updated":"2017-02-03 10:43:57.000000000","message":"Ok, it looks good to notify users.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"swift/common/storage_policy.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":634,"context_line":"                    \u0027exactly %d replicas. Got %d.\u0027 % ("},{"line_number":635,"context_line":"                        self.name, required_fragment_count,"},{"line_number":636,"context_line":"                        configured_fragment_count))"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        self.object_ring \u003d Ring("},{"line_number":639,"context_line":"            swift_dir, ring_name\u003dself.ring_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_6fe6f017","line":636,"updated":"2017-02-02 03:25:12.000000000","message":"I spelt it configured_replicas and required_replicas on my first go - but saw Kota had already suggested _fragment_count\n\nthis should just get squashed.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e697e84e76b170b27ef9d2869dc1af939d2802eb","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":634,"context_line":"                    \u0027exactly %d replicas. Got %d.\u0027 % ("},{"line_number":635,"context_line":"                        self.name, required_fragment_count,"},{"line_number":636,"context_line":"                        configured_fragment_count))"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        self.object_ring \u003d Ring("},{"line_number":639,"context_line":"            swift_dir, ring_name\u003dself.ring_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_a081d691","line":636,"in_reply_to":"3a461143_6fe6f017","updated":"2017-02-03 10:43:57.000000000","message":"k, let\u0027s squash this into the parent.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        responses \u003d []"},{"line_number":263,"context_line":"        etag \u003d None"},{"line_number":264,"context_line":"        buckets \u003d defaultdict(dict)"},{"line_number":265,"context_line":"        etag_buckets \u003d {}"},{"line_number":266,"context_line":"        for resp in pile:"},{"line_number":267,"context_line":"            if not resp:"},{"line_number":268,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_2fb3080c","line":265,"updated":"2017-02-02 03:25:12.000000000","message":"I think this bucketing is a poor mans form of what\u0027s in the proxy - we should split out leaving that work and making this more robust as a dependency to ec_duplication\n\nThere\u0027s no point trying to put a skyscraper on-top of a foundation of sand [1]\n\n1. http://www.popularmechanics.com/technology/infrastructure/a23521/san-francisco-skyscraper-is-leaningand-sinking/","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e697e84e76b170b27ef9d2869dc1af939d2802eb","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                # primary node.  In this case we should stream it directly from"},{"line_number":290,"context_line":"                # the remote node to our target instead of rebuild.  But"},{"line_number":291,"context_line":"                # instead we ignore it."},{"line_number":292,"context_line":"                self.logger.info("},{"line_number":293,"context_line":"                    \u0027Found existing frag #%s while rebuilding #%s from %s\u0027,"},{"line_number":294,"context_line":"                    unique_index, fi_to_rebuild, self._full_path("},{"line_number":295,"context_line":"                        node, job[\u0027partition\u0027], datafile_metadata[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_a006361e","line":292,"range":{"start_line":292,"start_character":28,"end_line":292,"end_character":32},"updated":"2017-02-03 10:43:57.000000000","message":"it should be debug, otherwise probably a bunch of info message will appear if the fi_to_rebuild is in a latter subset.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"56a180e7dfe4df3492bcb8e633b35b18a26f0b38","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            if responses:"},{"line_number":335,"context_line":"                break"},{"line_number":336,"context_line":"        else:"},{"line_number":337,"context_line":"            for timestamp, resp in sorted(buckets.items()):"},{"line_number":338,"context_line":"                etag \u003d etag_buckets[timestamp]"},{"line_number":339,"context_line":"                self.logger.error("},{"line_number":340,"context_line":"                    \u0027Unable to get enough responses (%s/%s) \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_7765eedf","line":337,"updated":"2017-02-03 12:54:56.000000000","message":"Since this change, if the resp is None (e.g. error response like HTTP_NOT_FOUND), we can not log the path as not enough responses here.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"            range_specs \u003d self._convert_range(req, policy)"},{"line_number":2180,"context_line":""},{"line_number":2181,"context_line":"        # sorting primaries according to sorting key"},{"line_number":2182,"context_line":"        node_iter.primary_nodes.sort(key\u003dpolicy.sort_key)"},{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"        safe_iter \u003d GreenthreadSafeIterator(node_iter)"},{"line_number":2185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_6f943044","side":"PARENT","line":2182,"updated":"2017-02-02 03:25:12.000000000","message":"oh policy.sort_key - the bane of my evening.","commit_id":"647c96a163eb54fa1df6817e452a8c5536d95069"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        \"\"\""},{"line_number":542,"context_line":"        obj_ring \u003d policy.object_ring"},{"line_number":543,"context_line":"        node_iter \u003d GreenthreadSafeIterator("},{"line_number":544,"context_line":"            self.iter_nodes_local_first(obj_ring, partition))"},{"line_number":545,"context_line":"        pile \u003d GreenPile(len(nodes))"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        for nheaders in outgoing_headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_2faa2886","line":544,"updated":"2017-02-02 03:25:12.000000000","message":"I think i just saw some delta lines that weren\u0027t supposed to be in the parent change and this makes them go away.\n\nthis should be squashed","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":2857,"context_line":"            fixed_body \u003d \u0027\u0027.join(df.reader())"},{"line_number":2858,"context_line":"            self.assertEqual(len(fixed_body), len(broken_body))"},{"line_number":2859,"context_line":"            self.assertEqual(md5(fixed_body).hexdigest(),"},{"line_number":2860,"context_line":"                             md5(broken_body).hexdigest())"},{"line_number":2861,"context_line":""},{"line_number":2862,"context_line":"    def test_reconstruct_fa_finds_itself_does_not_fail(self):"},{"line_number":2863,"context_line":"        job \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_8fca3c6d","line":2860,"updated":"2017-02-02 03:25:12.000000000","message":"I wasn\u0027t even *trying* to fix this - it just feel out from refactoring based on experience dealing with frag-prefs in the proxy","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e697e84e76b170b27ef9d2869dc1af939d2802eb","unresolved":false,"context_lines":[{"line_number":2857,"context_line":"            fixed_body \u003d \u0027\u0027.join(df.reader())"},{"line_number":2858,"context_line":"            self.assertEqual(len(fixed_body), len(broken_body))"},{"line_number":2859,"context_line":"            self.assertEqual(md5(fixed_body).hexdigest(),"},{"line_number":2860,"context_line":"                             md5(broken_body).hexdigest())"},{"line_number":2861,"context_line":""},{"line_number":2862,"context_line":"    def test_reconstruct_fa_finds_itself_does_not_fail(self):"},{"line_number":2863,"context_line":"        job \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_c3b6ec3c","line":2860,"in_reply_to":"3a461143_8fca3c6d","updated":"2017-02-03 10:43:57.000000000","message":"Hah, that\u0027s what i\u0027m feeling, the change is over to the ec_duplication. IMO, I like that change if it doesn\u0027t block anything for reviewers.","commit_id":"129157fa108db5ffef778304f0109c0ede16e2d4"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2fb3a82d9ce899edf4f15593ee9171eb7ca6acbb","unresolved":false,"context_lines":[{"line_number":5547,"context_line":""},{"line_number":5548,"context_line":""},{"line_number":5549,"context_line":"@patch_policies([StoragePolicy(0, \u0027zero\u0027, True,"},{"line_number":5550,"context_line":"                               object_ring\u003dFakeRing(base_port\u003d3000))])"},{"line_number":5551,"context_line":"class TestObjectControllerECDuplication(ECTestMixin, unittest.TestCase):"},{"line_number":5552,"context_line":"    ec_policy_index \u003d 4"},{"line_number":5553,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_8f915c55","side":"PARENT","line":5550,"updated":"2017-02-02 03:25:12.000000000","message":"it was just un-needed\n\nthis module is such a %^\u0026*#ing mess","commit_id":"647c96a163eb54fa1df6817e452a8c5536d95069"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"56a180e7dfe4df3492bcb8e633b35b18a26f0b38","unresolved":false,"context_lines":[{"line_number":5547,"context_line":""},{"line_number":5548,"context_line":""},{"line_number":5549,"context_line":"@patch_policies([StoragePolicy(0, \u0027zero\u0027, True,"},{"line_number":5550,"context_line":"                               object_ring\u003dFakeRing(base_port\u003d3000))])"},{"line_number":5551,"context_line":"class TestObjectControllerECDuplication(ECTestMixin, unittest.TestCase):"},{"line_number":5552,"context_line":"    ec_policy_index \u003d 4"},{"line_number":5553,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_12dd9842","side":"PARENT","line":5550,"in_reply_to":"3a461143_8f915c55","updated":"2017-02-03 12:54:56.000000000","message":"I\u0027m still wondering why you don\u0027t need this. In my environment the removal of this causes a lot of errors/failures and it looks like TestObjectController get same patch_policies with this.\n\nExactly, some of tests will unpatch_policies so I\u0027m feeling that I\u0027m missing something on this.","commit_id":"647c96a163eb54fa1df6817e452a8c5536d95069"}]}
