)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":551,"context_line":"                           for filename in accepted_files.get(\u0027fragments\u0027, [])"},{"line_number":552,"context_line":"                           if filename !\u003d accepted_files[\u0027.data\u0027]]"},{"line_number":553,"context_line":"            extra_frags.sort()"},{"line_number":554,"context_line":"            result[\u0027extra_frags\u0027] \u003d extra_frags"},{"line_number":555,"context_line":"        return result"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def cleanup_ondisk_files(self, hsh_path, reclaim_age\u003dONE_WEEK, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_69c35539","line":554,"updated":"2015-07-31 09:09:43.000000000","message":"nit: maybe rename extra_frags -\u003e alt_frags throughout to be consistent with the name of the DiskfFile property","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"a7f24778ca1aac6318dece3075634da692428c61","unresolved":false,"context_lines":[{"line_number":551,"context_line":"                           for filename in accepted_files.get(\u0027fragments\u0027, [])"},{"line_number":552,"context_line":"                           if filename !\u003d accepted_files[\u0027.data\u0027]]"},{"line_number":553,"context_line":"            extra_frags.sort()"},{"line_number":554,"context_line":"            result[\u0027extra_frags\u0027] \u003d extra_frags"},{"line_number":555,"context_line":"        return result"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def cleanup_ondisk_files(self, hsh_path, reclaim_age\u003dONE_WEEK, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_97fca140","line":554,"in_reply_to":"3a50d1a3_69c35539","updated":"2015-08-03 19:04:32.000000000","message":"Done","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ee843e24f976628e6bdf06783187e29b0ba8d57e","unresolved":false,"context_lines":[{"line_number":1494,"context_line":"        ondisk_file_info \u003d self._get_ondisk_file()"},{"line_number":1495,"context_line":"        data_file, meta_file, ts_file \u003d \\"},{"line_number":1496,"context_line":"            itemgetter(\u0027data_file\u0027, \u0027meta_file\u0027,"},{"line_number":1497,"context_line":"                       \u0027ts_file\u0027)(ondisk_file_info)"},{"line_number":1498,"context_line":"        if not data_file:"},{"line_number":1499,"context_line":"            raise self._construct_exception_from_ts_file(ts_file)"},{"line_number":1500,"context_line":"        self._alt_frags \u003d ondisk_file_info.get(\u0027extra_frags\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_592196b3","line":1497,"updated":"2015-07-31 01:29:52.000000000","message":"I didn\u0027t know about this form of itemgetter!\n\n    After g \u003d itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ee843e24f976628e6bdf06783187e29b0ba8d57e","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"          object is considered deleted"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        * data_file is not None, ts_file is None"},{"line_number":1569,"context_line":""},{"line_number":1570,"context_line":"          object exists, and optionally has fast-POST metadata"},{"line_number":1571,"context_line":"        \"\"\""},{"line_number":1572,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_1c30dce7","line":1569,"updated":"2015-07-31 01:29:52.000000000","message":"I think make this docstring is overly descriptive for the abstract implementation, maybe just:\n\n    :returns: a dictionary that maps types of files to names\n\nYou could elaborate if some keys are required to be in the dict and possibly None.","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"          object is considered deleted"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        * data_file is not None, ts_file is None"},{"line_number":1569,"context_line":""},{"line_number":1570,"context_line":"          object exists, and optionally has fast-POST metadata"},{"line_number":1571,"context_line":"        \"\"\""},{"line_number":1572,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_2e30f306","line":1569,"in_reply_to":"3a50d1a3_1c30dce7","updated":"2015-07-31 09:09:43.000000000","message":"Agree. thats my bad from the refactor patch. Could be same as BaseDiskFileManager get_ondisk_files() i.e.:\n\n          :returns: dict of files to use having keys \u0027data_file\u0027, \u0027ts_file\u0027,                   \n                        \u0027meta_file\u0027 and optionally \u0027extra_frags\u0027","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"a7f24778ca1aac6318dece3075634da692428c61","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"          object is considered deleted"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        * data_file is not None, ts_file is None"},{"line_number":1569,"context_line":""},{"line_number":1570,"context_line":"          object exists, and optionally has fast-POST metadata"},{"line_number":1571,"context_line":"        \"\"\""},{"line_number":1572,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_b7b43d82","line":1569,"in_reply_to":"3a50d1a3_2e30f306","updated":"2015-08-03 19:04:32.000000000","message":"Done","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":2141,"context_line":"    def _get_ondisk_file(self):"},{"line_number":2142,"context_line":"        \"\"\""},{"line_number":2143,"context_line":"        The only difference between this method and the replication policy"},{"line_number":2144,"context_line":"        DiskFile method is passing in the frag_index kwarg to our manager\u0027s"},{"line_number":2145,"context_line":"        get_ondisk_files method."},{"line_number":2146,"context_line":"        \"\"\""},{"line_number":2147,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_e90d25e9","line":2144,"updated":"2015-07-31 09:09:43.000000000","message":"huh. so how come the guy who did the refactoring patch didn\u0027t figure a way to move this into the base class :P","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":2161,"context_line":"                    \"Error listing directory %s: %s\" % (self._datadir, err))"},{"line_number":2162,"context_line":"            # The data directory does not exist, so the object cannot exist."},{"line_number":2163,"context_line":"            fileset \u003d dict(data_file\u003dNone, meta_file\u003dNone,"},{"line_number":2164,"context_line":"                           ts_file\u003dNone)"},{"line_number":2165,"context_line":"        else:"},{"line_number":2166,"context_line":"            fileset \u003d self.manager.get_ondisk_files("},{"line_number":2167,"context_line":"                files, self._datadir, frag_index\u003dself._frag_index)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_2936adb4","line":2164,"updated":"2015-07-31 09:09:43.000000000","message":"nit: the line wrap isn\u0027t necessary and is inconsistent with line 1935","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"a7f24778ca1aac6318dece3075634da692428c61","unresolved":false,"context_lines":[{"line_number":2161,"context_line":"                    \"Error listing directory %s: %s\" % (self._datadir, err))"},{"line_number":2162,"context_line":"            # The data directory does not exist, so the object cannot exist."},{"line_number":2163,"context_line":"            fileset \u003d dict(data_file\u003dNone, meta_file\u003dNone,"},{"line_number":2164,"context_line":"                           ts_file\u003dNone)"},{"line_number":2165,"context_line":"        else:"},{"line_number":2166,"context_line":"            fileset \u003d self.manager.get_ondisk_files("},{"line_number":2167,"context_line":"                files, self._datadir, frag_index\u003dself._frag_index)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_f24bb35d","line":2164,"in_reply_to":"3a50d1a3_2936adb4","updated":"2015-08-03 19:04:32.000000000","message":"Done","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        response.headers[key] \u003d value"},{"line_number":718,"context_line":"                response.etag \u003d metadata[\u0027ETag\u0027]"},{"line_number":719,"context_line":"                # diskfile tells us about additional FI\u0027s that are avaiable"},{"line_number":720,"context_line":"                # upcon request, communicate those back via response header"},{"line_number":721,"context_line":"                if disk_file.alt_frags:"},{"line_number":722,"context_line":"                    response.headers[\u0027X-Backend-Obj-Alt-Frag-Index\u0027] \u003d \\"},{"line_number":723,"context_line":"                        \u0027,\u0027.join(\u0027%d\u0027 % x for x in disk_file.alt_frags)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_29878d13","line":720,"updated":"2015-07-31 09:09:43.000000000","message":"nit: couple of typos: \u0027avaiable\u0027 and \u0027upcon\u0027","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"a7f24778ca1aac6318dece3075634da692428c61","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        response.headers[key] \u003d value"},{"line_number":718,"context_line":"                response.etag \u003d metadata[\u0027ETag\u0027]"},{"line_number":719,"context_line":"                # diskfile tells us about additional FI\u0027s that are avaiable"},{"line_number":720,"context_line":"                # upcon request, communicate those back via response header"},{"line_number":721,"context_line":"                if disk_file.alt_frags:"},{"line_number":722,"context_line":"                    response.headers[\u0027X-Backend-Obj-Alt-Frag-Index\u0027] \u003d \\"},{"line_number":723,"context_line":"                        \u0027,\u0027.join(\u0027%d\u0027 % x for x in disk_file.alt_frags)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_32611bd4","line":720,"in_reply_to":"3a50d1a3_29878d13","updated":"2015-08-03 19:04:32.000000000","message":"Done","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0ee7a6c5be671e1ee74deb65c121c67250b470c2","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                # diskfile tells us about additional FI\u0027s that are avaiable"},{"line_number":720,"context_line":"                # upcon request, communicate those back via response header"},{"line_number":721,"context_line":"                if disk_file.alt_frags:"},{"line_number":722,"context_line":"                    response.headers[\u0027X-Backend-Obj-Alt-Frag-Index\u0027] \u003d \\"},{"line_number":723,"context_line":"                        \u0027,\u0027.join(\u0027%d\u0027 % x for x in disk_file.alt_frags)"},{"line_number":724,"context_line":"                response.last_modified \u003d math.ceil(float(file_x_ts))"},{"line_number":725,"context_line":"                response.content_length \u003d obj_size"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_e9a9a591","line":722,"updated":"2015-07-31 09:09:43.000000000","message":"just copying comment from old review: could drop the -Obj- from header name to make itmore symmetric wrt X-Backend-Preferred-Frag-Index","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"a7f24778ca1aac6318dece3075634da692428c61","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                # diskfile tells us about additional FI\u0027s that are avaiable"},{"line_number":720,"context_line":"                # upcon request, communicate those back via response header"},{"line_number":721,"context_line":"                if disk_file.alt_frags:"},{"line_number":722,"context_line":"                    response.headers[\u0027X-Backend-Obj-Alt-Frag-Index\u0027] \u003d \\"},{"line_number":723,"context_line":"                        \u0027,\u0027.join(\u0027%d\u0027 % x for x in disk_file.alt_frags)"},{"line_number":724,"context_line":"                response.last_modified \u003d math.ceil(float(file_x_ts))"},{"line_number":725,"context_line":"                response.content_length \u003d obj_size"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_b2b20b05","line":722,"in_reply_to":"3a50d1a3_e9a9a591","updated":"2015-08-03 19:04:32.000000000","message":"Done","commit_id":"5d3454c437096d207e8a2394144319ea7869f449"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":1976,"context_line":"            for get, parts_iter in gets:"},{"line_number":1977,"context_line":"                if is_success(get.last_status):"},{"line_number":1978,"context_line":"                    fi \u003d HeaderKeyDict("},{"line_number":1979,"context_line":"                        get.last_headers)[\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027]"},{"line_number":1980,"context_line":"                    etag \u003d HeaderKeyDict("},{"line_number":1981,"context_line":"                        get.last_headers)[\u0027X-Object-Sysmeta-Ec-Etag\u0027]"},{"line_number":1982,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_20896d26","line":1979,"updated":"2015-08-12 20:04:06.000000000","message":"nit: HeaderKeyDict(\tget.last_headers) hapens 3 times in the method, maybe assign to a var once?\n\n  headers \u003d HeaderKeyDict(get.last_headers)","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":1980,"context_line":"                    etag \u003d HeaderKeyDict("},{"line_number":1981,"context_line":"                        get.last_headers)[\u0027X-Object-Sysmeta-Ec-Etag\u0027]"},{"line_number":1982,"context_line":""},{"line_number":1983,"context_line":"                    # we should always get an FI back in a resonse"},{"line_number":1984,"context_line":"                    # but if not call it bad and move on"},{"line_number":1985,"context_line":"                    if fi is None:"},{"line_number":1986,"context_line":"                        state[\u0027bad_gets\u0027].append((get, parts_iter))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_e095c531","line":1983,"updated":"2015-08-12 20:04:06.000000000","message":"nit: s/resonse/response/","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":1995,"context_line":"                    # don\u0027t \u0027double count\u0027 if we\u0027re on subsequent passes"},{"line_number":1996,"context_line":"                    # to actually fetch alternates"},{"line_number":1997,"context_line":"                    if state[\u0027first_pass\u0027]:"},{"line_number":1998,"context_line":"                        afi \u003d \u0027X-Backend-Alt-Frag-Index\u0027"},{"line_number":1999,"context_line":"                        alts \u003d {}"},{"line_number":2000,"context_line":"                        alternates \u003d HeaderKeyDict(get.last_headers)[afi]"},{"line_number":2001,"context_line":"                        if alternates:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_2013adb9","line":1998,"updated":"2015-08-12 20:04:06.000000000","message":"if you had something like\n\n  headers \u003d HeaderKeyDict(get.last_headers)\n\nabove then you may not need the afi trick to avoid line wraps","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":1999,"context_line":"                        alts \u003d {}"},{"line_number":2000,"context_line":"                        alternates \u003d HeaderKeyDict(get.last_headers)[afi]"},{"line_number":2001,"context_line":"                        if alternates:"},{"line_number":2002,"context_line":"                            alternates \u003d alternates.strip(\u0027[]\u0027)"},{"line_number":2003,"context_line":"                            if len(alternates) \u003e 0:"},{"line_number":2004,"context_line":"                                alts[get.node[\u0027id\u0027]] \u003d (alternates, get.node)"},{"line_number":2005,"context_line":"                                state[\u0027etag_buckets\u0027][etag].append(alts)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_e056255d","line":2002,"updated":"2015-08-12 20:04:06.000000000","message":"don\u0027t think this is necessary, backend sends a comma separated list","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":2000,"context_line":"                        alternates \u003d HeaderKeyDict(get.last_headers)[afi]"},{"line_number":2001,"context_line":"                        if alternates:"},{"line_number":2002,"context_line":"                            alternates \u003d alternates.strip(\u0027[]\u0027)"},{"line_number":2003,"context_line":"                            if len(alternates) \u003e 0:"},{"line_number":2004,"context_line":"                                alts[get.node[\u0027id\u0027]] \u003d (alternates, get.node)"},{"line_number":2005,"context_line":"                                state[\u0027etag_buckets\u0027][etag].append(alts)"},{"line_number":2006,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_a0781dc5","line":2003,"updated":"2015-08-12 20:04:06.000000000","message":"which would mean this if is also unnecessary","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":2031,"context_line":"            for etag in state[\u0027etag_buckets\u0027]:"},{"line_number":2032,"context_line":"                for alts in state[\u0027etag_buckets\u0027][etag]:"},{"line_number":2033,"context_line":"                    # etag_buckets has dicts for both FI and alts, we"},{"line_number":2034,"context_line":"                    # are interested in the alterates here"},{"line_number":2035,"context_line":"                    if \u0027fi\u0027 not in alts:"},{"line_number":2036,"context_line":"                        index_list \u003d alts.values()[0][0].split(\u0027,\u0027)"},{"line_number":2037,"context_line":"                        for index in index_list:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_0d3d8adc","line":2034,"updated":"2015-08-12 20:04:06.000000000","message":"nit: s/alterates/alternates/","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcd1e712a9f2e52a5e1aa2573a36d84d4d1a2744","unresolved":false,"context_lines":[{"line_number":2149,"context_line":"                for d in state[\u0027etag_buckets\u0027][etag_to_use]:"},{"line_number":2150,"context_line":"                    for k, v in d.items():"},{"line_number":2151,"context_line":"                        if k \u003d\u003d \u0027parts_iter\u0027:"},{"line_number":2152,"context_line":"                            parts_iters.append(v)"},{"line_number":2153,"context_line":"                app_iter \u003d ECAppIter("},{"line_number":2154,"context_line":"                    req.swift_entity_path,"},{"line_number":2155,"context_line":"                    policy,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_4dcdd22f","line":2152,"updated":"2015-08-12 20:04:06.000000000","message":"why not \n\n  if \u0027parts_iter\u0027 in d:\n      parts_iter.append(d[\u0027parts_iter\u0027])","commit_id":"31dc15a444836c81aea568b53cc457189b261d71"}]}
