)]}'
{"swift/common/direct_client.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":500,"context_line":"def direct_get_suffix_hashes(node, part, suffixes, conn_timeout\u003d5,"},{"line_number":501,"context_line":"                             response_timeout\u003d15, headers\u003dNone):"},{"line_number":502,"context_line":"    \"\"\""},{"line_number":503,"context_line":"    Get suffix hashes directly from the object server."},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    :param node: node dictionary from the ring"},{"line_number":506,"context_line":"    :param part: partition the container is on"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_c8a4ecba","line":503,"updated":"2016-02-26 22:53:27.000000000","message":"wow this is even more helpful that I through - I don\u0027t think i\u0027ll ever craft another REPLCIATE verb with curl [1]!\n\nMaybe a wishlist for a new swift-get-hashes tool?\n\n1. I used to pipe to a pickle loader -\u003e https://gist.github.com/clayg/f7158e9a15c8f1b6793a","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":509,"context_line":"    :param headers: dict to be passed into HTTPConnection headers"},{"line_number":510,"context_line":"    :returns: dict of suffix hashes"},{"line_number":511,"context_line":"    :raises ClientException: HTTP REPLICATE request failed"},{"line_number":512,"context_line":"    \"\"\""},{"line_number":513,"context_line":"    if headers is None:"},{"line_number":514,"context_line":"        headers \u003d {}"},{"line_number":515,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_3ed2f300","line":512,"updated":"2016-02-26 22:53:27.000000000","message":"this seems like a solid interface - but if I\u0027m correct it\u0027s only used in probetests currently.  There\u0027s a number of call sites in replicator/reconstructor that could probably adapt to it and clean up and simplify a few things.  Maybe when we merge this we could file a wish list.","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":522,"context_line":"    if not is_success(resp.status):"},{"line_number":523,"context_line":"        raise DirectClientException(\u0027Object\u0027, \u0027REPLICATE\u0027,"},{"line_number":524,"context_line":"                                    node, part, path, resp)"},{"line_number":525,"context_line":"    return pickle.loads(resp.read())"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"def retry(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_3ea4b3a4","line":525,"updated":"2016-02-26 22:53:27.000000000","message":"this can also timeout - but probably less likely since all the work is done on the object-server side before starting the response","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"}],"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":694,"context_line":"        for hsh in path_contents:"},{"line_number":695,"context_line":"            hsh_path \u003d join(path, hsh)"},{"line_number":696,"context_line":"            try:"},{"line_number":697,"context_line":"                files \u003d self.hash_cleanup_listdir(hsh_path, reclaim_age)"},{"line_number":698,"context_line":"            except OSError as err:"},{"line_number":699,"context_line":"                if err.errno \u003d\u003d errno.ENOTDIR:"},{"line_number":700,"context_line":"                    partition_path \u003d dirname(path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_7ee63bb5","side":"PARENT","line":697,"updated":"2016-02-26 22:53:27.000000000","message":"yeah, worst name evar!  Probably want a wishlist to just find *all* the call sites and convert them to accepting the richer dataformat (the beast is the tests!)","commit_id":"ebe61381c27607adc212402fc64c3b7ae4fef27d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":2563,"context_line":"            info \u003d self.parse_on_disk_filename(filename)"},{"line_number":2564,"context_line":"            fi \u003d info[\u0027frag_index\u0027]"},{"line_number":2565,"context_line":"            if fi is None:"},{"line_number":2566,"context_line":"                return None, filename"},{"line_number":2567,"context_line":"            else:"},{"line_number":2568,"context_line":"                return fi, info[\u0027timestamp\u0027].internal"},{"line_number":2569,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_cb98661e","side":"PARENT","line":2566,"updated":"2016-02-26 22:53:27.000000000","message":"for tombstones, durables \u0026 meta we use the whole filename","commit_id":"ebe61381c27607adc212402fc64c3b7ae4fef27d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":2565,"context_line":"            if fi is None:"},{"line_number":2566,"context_line":"                return None, filename"},{"line_number":2567,"context_line":"            else:"},{"line_number":2568,"context_line":"                return fi, info[\u0027timestamp\u0027].internal"},{"line_number":2569,"context_line":""},{"line_number":2570,"context_line":"        hash_per_fi \u003d self._hash_suffix_dir(path, mapper, reclaim_age)"},{"line_number":2571,"context_line":"        return dict((fi, md5.hexdigest()) for fi, md5 in hash_per_fi.items())"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_8bf81e4b","side":"PARENT","line":2568,"updated":"2016-02-26 22:53:27.000000000","message":"for frags, we use only the timestamp - no ext.","commit_id":"ebe61381c27607adc212402fc64c3b7ae4fef27d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        :param ondisk_info: a dict describing the state of ondisk files, as"},{"line_number":688,"context_line":"                            returned by get_ondisk_files"},{"line_number":689,"context_line":"        \"\"\""},{"line_number":690,"context_line":"        raise NotImplementedError"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    def _hash_suffix_dir(self, path, reclaim_age):"},{"line_number":693,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_5e4a57ad","line":690,"updated":"2016-02-26 22:53:27.000000000","message":"wow, i like this extraction a lot - so much better than the mapper injection.","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            for key in (k for k in (\u0027meta_info\u0027, \u0027ts_info\u0027)"},{"line_number":738,"context_line":"                        if k in ondisk_info):"},{"line_number":739,"context_line":"                info \u003d ondisk_info[key]"},{"line_number":740,"context_line":"                hashes[None].update(info[\u0027timestamp\u0027].internal + info[\u0027ext\u0027])"},{"line_number":741,"context_line":""},{"line_number":742,"context_line":"            # delegate to subclass for data file related updates..."},{"line_number":743,"context_line":"            self._update_suffix_hashes(hashes, ondisk_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_12d563b8","line":740,"updated":"2016-02-26 22:53:27.000000000","message":"ok, so the metadata and tombstone info metadata updating is consistent to both implementations and applied before adding in the implementation specific datafile/frag_index/durable handling.\n\nI didn\u0027t think that EC was using the extension for .meta and .durable?\n\nbut across old and new code the suffix hashing seems to be consistent!?","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":2604,"context_line":"                fi \u003d file_info[\u0027frag_index\u0027]"},{"line_number":2605,"context_line":"                hashes[fi].update(file_info[\u0027timestamp\u0027].internal)"},{"line_number":2606,"context_line":"        if \u0027durable_frag_set\u0027 in ondisk_info:"},{"line_number":2607,"context_line":"            file_info \u003d ondisk_info[\u0027durable_frag_set\u0027][0]"},{"line_number":2608,"context_line":"            hashes[None].update(file_info[\u0027timestamp\u0027].internal + \u0027.durable\u0027)"},{"line_number":2609,"context_line":""},{"line_number":2610,"context_line":"    def _hash_suffix(self, path, reclaim_age):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_b24ab7c3","line":2607,"updated":"2016-02-26 22:53:27.000000000","message":"looks similar to durable_timestamp","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":2605,"context_line":"                hashes[fi].update(file_info[\u0027timestamp\u0027].internal)"},{"line_number":2606,"context_line":"        if \u0027durable_frag_set\u0027 in ondisk_info:"},{"line_number":2607,"context_line":"            file_info \u003d ondisk_info[\u0027durable_frag_set\u0027][0]"},{"line_number":2608,"context_line":"            hashes[None].update(file_info[\u0027timestamp\u0027].internal + \u0027.durable\u0027)"},{"line_number":2609,"context_line":""},{"line_number":2610,"context_line":"    def _hash_suffix(self, path, reclaim_age):"},{"line_number":2611,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_320a2722","line":2608,"updated":"2016-02-26 22:53:27.000000000","message":"it wasn\u0027t obvious to me at first that EC was using the extension for fi\u0027s with None - but after validating the new hashing are consistent with old code functionally I was able to see it.","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4052f8da41f480826dfe3a8c7f607c71176ff0","unresolved":false,"context_lines":[{"line_number":4597,"context_line":"                    # fi is None here because we have a tombstone"},{"line_number":4598,"context_line":"                    None: tombstone_hash}},"},{"line_number":4599,"context_line":"            }[policy.policy_type]"},{"line_number":4600,"context_line":"            self.assertEqual(hashes, expected)"},{"line_number":4601,"context_line":""},{"line_number":4602,"context_line":"    def test_hash_suffix_one_reclaim_tombstone(self):"},{"line_number":4603,"context_line":"        for policy in self.iter_policies():"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_d5ec852b","line":4600,"updated":"2016-02-26 22:53:27.000000000","message":"ZOMGBBQ!!!1 GREAT TEST!\n\nWhere\u0027s the one that handles the crazy ssync drift when there\u0027s a .ctype + .meta on one node and a - oh... nm... that\u0027s in the fast-POST patch\n\n... still I bet it\u0027s great","commit_id":"2d55960a221c9934680053873bf1355c4690bb19"}]}
