)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2113df21ef3d3d12de0e68789960b25eb3666f40","unresolved":true,"context_lines":[{"line_number":18,"context_line":"the error log."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The error is only supressed for tombstones, and the relinker only"},{"line_number":21,"context_line":"looks back over the previous two partition powers."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: If9beb9efabdad64e81d92708f862146d5fafb16c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3757f8e1_3d16d39b","line":21,"updated":"2021-03-28 23:20:50.000000000","message":"So this might be a problem whenif we introduce jumping more then 1 part power?","commit_id":"6f712cd25892d5c834a881c8d32a6b274d4edf66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b68fc6bc0720073927e43a54006d21005cea7ebb","unresolved":true,"context_lines":[{"line_number":18,"context_line":"the error log."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The error is only supressed for tombstones, and the relinker only"},{"line_number":21,"context_line":"looks back over the previous two partition powers."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: If9beb9efabdad64e81d92708f862146d5fafb16c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"354d2918_b9d41695","line":21,"in_reply_to":"3757f8e1_3d16d39b","updated":"2021-03-29 16:06:45.000000000","message":"question is when to stop looking? I might need to make this configurable","commit_id":"6f712cd25892d5c834a881c8d32a6b274d4edf66"}],"swift/cli/relinker.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2113df21ef3d3d12de0e68789960b25eb3666f40","unresolved":true,"context_lines":[{"line_number":356,"context_line":"                        created_links +\u003d 1"},{"line_number":357,"context_line":"                        self.stats[\u0027linked\u0027] +\u003d 1"},{"line_number":358,"context_line":"                if link_exists:"},{"line_number":359,"context_line":"                    self.logger.debug("},{"line_number":360,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":361,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":362,"context_line":"                        old_file, new_file)"},{"line_number":363,"context_line":"                else:"},{"line_number":364,"context_line":"                    self.logger.warning("},{"line_number":365,"context_line":"                        \"Error relinking%s: failed to relink %s to %s: %s\","}],"source_content_type":"text/x-python","patch_set":1,"id":"70d0ee20_7e35072c","line":362,"range":{"start_line":359,"start_character":20,"end_line":362,"end_character":43},"updated":"2021-03-28 23:20:50.000000000","message":"so just want to confirm my understanding of the bug in question. At the time of required_links there wasn\u0027t a link becuase we know we needed to link the old loc file in the new location. But between then and now there must have been a race and a object from a different (oldler partpower increase part) has gone and made this link. So we\u0027re dealing with another race in essence?\n\nMy 2 questions are, and really to play devils advocate and just to clarify my thinking:\n\n 1. Do we know how this happens? why an old part power location isn\u0027t cleaned up, or is it just something that was missed. As you say it seemed to only be .ts files.\n\n 2. If something else is in the new location, cant we say it had to come from another relinker? I mean we\u0027re relnking to a file with a timestamp in the name right? So to get there between our get_ondisk_files and now means another relinker has already done the same check.. so if we get an EEXISTs here then it MUST be a copy of the file we\u0027re trying to link (right?)?\n\nJust saying link exists on errno.EEXIST might suffice and means no more checking and IO.\n\nHaving said all that, this isn\u0027t inline on all requests or relinks and only double checks in the case of a race. So I\u0027m fine when it\u0027s a better safe then sorry situation 😊","commit_id":"6f712cd25892d5c834a881c8d32a6b274d4edf66"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b68fc6bc0720073927e43a54006d21005cea7ebb","unresolved":true,"context_lines":[{"line_number":356,"context_line":"                        created_links +\u003d 1"},{"line_number":357,"context_line":"                        self.stats[\u0027linked\u0027] +\u003d 1"},{"line_number":358,"context_line":"                if link_exists:"},{"line_number":359,"context_line":"                    self.logger.debug("},{"line_number":360,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":361,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":362,"context_line":"                        old_file, new_file)"},{"line_number":363,"context_line":"                else:"},{"line_number":364,"context_line":"                    self.logger.warning("},{"line_number":365,"context_line":"                        \"Error relinking%s: failed to relink %s to %s: %s\","}],"source_content_type":"text/x-python","patch_set":1,"id":"861ea75c_c801bbe7","line":362,"range":{"start_line":359,"start_character":20,"end_line":362,"end_character":43},"in_reply_to":"70d0ee20_7e35072c","updated":"2021-03-29 16:06:45.000000000","message":"I wrote up the bug: https://bugs.launchpad.net/swift/+bug/1921718 , including why the old partition power location was not cleaned up.\n\nrequired_links does not imply they are missing, it just means \u0027these are the links that need to exist\u0027. The problem arose when the link exists but to a different inode, then we logged an error, rightly IMO because this is unexpected.\n\nWith this patch we now expect the previously unexpected and try to establish if it is at least reasonable, given the known historic bug.","commit_id":"6f712cd25892d5c834a881c8d32a6b274d4edf66"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":260,"context_line":"    def check_existing(self, new_hash_path, filename):"},{"line_number":261,"context_line":"        existing_link \u003d None"},{"line_number":262,"context_line":"        link_created \u003d False"},{"line_number":263,"context_line":"        for part_power_delta in range(1, 4):"},{"line_number":264,"context_line":"            # Try to create the link from each of 3 previous part power"},{"line_number":265,"context_line":"            # locations. If an attempt succeeds then either a link was made or"},{"line_number":266,"context_line":"            # an existing link with the same inode as the next part power"}],"source_content_type":"text/x-python","patch_set":2,"id":"fd872a48_e74a7022","line":263,"range":{"start_line":263,"start_character":38,"end_line":263,"end_character":39},"updated":"2021-04-01 05:32:15.000000000","message":"Is the first one necessary? Didn\u0027t we already try that one at L341?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":260,"context_line":"    def check_existing(self, new_hash_path, filename):"},{"line_number":261,"context_line":"        existing_link \u003d None"},{"line_number":262,"context_line":"        link_created \u003d False"},{"line_number":263,"context_line":"        for part_power_delta in range(1, 4):"},{"line_number":264,"context_line":"            # Try to create the link from each of 3 previous part power"},{"line_number":265,"context_line":"            # locations. If an attempt succeeds then either a link was made or"},{"line_number":266,"context_line":"            # an existing link with the same inode as the next part power"}],"source_content_type":"text/x-python","patch_set":2,"id":"65616aa0_4ef8e401","line":263,"range":{"start_line":263,"start_character":38,"end_line":263,"end_character":39},"in_reply_to":"fd872a48_e74a7022","updated":"2021-04-01 17:44:41.000000000","message":"this may be a tombstone in the older (previous) part power location, so the link that was previously attempted at l341 may not have been from part_power location to next_part_power location.\n\nas noted below, I\u0027m not too bothered about repeating the same link attempt in this uncommon case","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        existing_link \u003d None"},{"line_number":262,"context_line":"        link_created \u003d False"},{"line_number":263,"context_line":"        for part_power_delta in range(1, 4):"},{"line_number":264,"context_line":"            # Try to create the link from each of 3 previous part power"},{"line_number":265,"context_line":"            # locations. If an attempt succeeds then either a link was made or"},{"line_number":266,"context_line":"            # an existing link with the same inode as the next part power"},{"line_number":267,"context_line":"            # location was found: either is acceptable. The part power location"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69380a_ad5c3f0a","line":264,"range":{"start_line":264,"start_character":42,"end_line":264,"end_character":60},"updated":"2021-04-01 05:32:15.000000000","message":"Probably want that to be configurable.","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        existing_link \u003d None"},{"line_number":262,"context_line":"        link_created \u003d False"},{"line_number":263,"context_line":"        for part_power_delta in range(1, 4):"},{"line_number":264,"context_line":"            # Try to create the link from each of 3 previous part power"},{"line_number":265,"context_line":"            # locations. If an attempt succeeds then either a link was made or"},{"line_number":266,"context_line":"            # an existing link with the same inode as the next part power"},{"line_number":267,"context_line":"            # location was found: either is acceptable. The part power location"}],"source_content_type":"text/x-python","patch_set":2,"id":"f02981ec_156e000b","line":264,"range":{"start_line":264,"start_character":42,"end_line":264,"end_character":60},"in_reply_to":"fa69380a_ad5c3f0a","updated":"2021-04-01 17:44:41.000000000","message":"agree, i wanted to see if the idea would fly before investing in plumbing config","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":269,"context_line":"            # attempts here for simplicity."},{"line_number":270,"context_line":"            target_hash_path \u003d replace_partition_in_path("},{"line_number":271,"context_line":"                self.conf[\u0027devices\u0027], new_hash_path,"},{"line_number":272,"context_line":"                self.next_part_power - part_power_delta)"},{"line_number":273,"context_line":"            try:"},{"line_number":274,"context_line":"                target_file \u003d os.path.join(target_hash_path, filename)"},{"line_number":275,"context_line":"                new_file \u003d os.path.join(new_hash_path, filename)"}],"source_content_type":"text/x-python","patch_set":2,"id":"051cd335_d43f07c2","line":272,"updated":"2021-04-01 05:32:15.000000000","message":"I feel like we could base this off of prev_part_power (with a fallback, if that\u0027s not set, to part_power). If at some point we allow you to skip straight from 17 to 20 (say), there\u0027s no reason to check 18 \u0026 19 -- you want to spend that I/O checking 15 \u0026 16.","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":269,"context_line":"            # attempts here for simplicity."},{"line_number":270,"context_line":"            target_hash_path \u003d replace_partition_in_path("},{"line_number":271,"context_line":"                self.conf[\u0027devices\u0027], new_hash_path,"},{"line_number":272,"context_line":"                self.next_part_power - part_power_delta)"},{"line_number":273,"context_line":"            try:"},{"line_number":274,"context_line":"                target_file \u003d os.path.join(target_hash_path, filename)"},{"line_number":275,"context_line":"                new_file \u003d os.path.join(new_hash_path, filename)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7beada0f_0f3ca461","line":272,"in_reply_to":"051cd335_d43f07c2","updated":"2021-04-01 17:44:41.000000000","message":"we need to include part_power as well as previous part powers because this may be the misplaced tombstone blocked by the correctly placed tombstone: we saw both current linked to next and prev failing as well as prev linked to next and current failing.","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"23eae7ee8b7db24fbb06e7eaeaa7f150fdb70577","unresolved":true,"context_lines":[{"line_number":269,"context_line":"            # attempts here for simplicity."},{"line_number":270,"context_line":"            target_hash_path \u003d replace_partition_in_path("},{"line_number":271,"context_line":"                self.conf[\u0027devices\u0027], new_hash_path,"},{"line_number":272,"context_line":"                self.next_part_power - part_power_delta)"},{"line_number":273,"context_line":"            try:"},{"line_number":274,"context_line":"                target_file \u003d os.path.join(target_hash_path, filename)"},{"line_number":275,"context_line":"                new_file \u003d os.path.join(new_hash_path, filename)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b900c9bd_ff047418","line":272,"in_reply_to":"7beada0f_0f3ca461","updated":"2021-04-01 21:34:02.000000000","message":"Ah, right, right...","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                break"},{"line_number":280,"context_line":"            except OSError:"},{"line_number":281,"context_line":"                pass"},{"line_number":282,"context_line":"        return existing_link, link_created"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def process_location(self, hash_path, new_hash_path):"},{"line_number":285,"context_line":"        # Compare the contents of each hash dir with contents of same hash"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d6a1af1_00afdcca","line":282,"range":{"start_line":282,"start_character":30,"end_line":282,"end_character":42},"updated":"2021-04-01 05:32:15.000000000","message":"This should always be false, yeah? The idea coming in here is that we\u0027ve got a file at new_hash_path already -- is there are way that we\u0027d be creating a new link given that?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                break"},{"line_number":280,"context_line":"            except OSError:"},{"line_number":281,"context_line":"                pass"},{"line_number":282,"context_line":"        return existing_link, link_created"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def process_location(self, hash_path, new_hash_path):"},{"line_number":285,"context_line":"        # Compare the contents of each hash dir with contents of same hash"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb742f74_9117ff81","line":282,"range":{"start_line":282,"start_character":30,"end_line":282,"end_character":42},"in_reply_to":"6d6a1af1_00afdcca","updated":"2021-04-01 17:44:41.000000000","message":"certainly expected to be false, but might not be - things might have changed since we tried to make the link the first time e.g. new data has been PUT, existing tombstone has been deleted, so the link attempt here actually succeeds.","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":353,"context_line":"                    # power locations"},{"line_number":354,"context_line":"                    # (https://bugs.launchpad.net/swift/+bug/1921718)"},{"line_number":355,"context_line":"                    existing_link, link_created \u003d self.check_existing("},{"line_number":356,"context_line":"                        new_hash_path, filename)"},{"line_number":357,"context_line":"                if existing_link:"},{"line_number":358,"context_line":"                    self.logger.debug("},{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"a4e58849_b35b2a4e","line":356,"range":{"start_line":356,"start_character":24,"end_line":356,"end_character":47},"updated":"2021-04-01 05:32:15.000000000","message":"Could probably have this take new_file and drop the os.path.join\u0027ing in check_existing.","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":353,"context_line":"                    # power locations"},{"line_number":354,"context_line":"                    # (https://bugs.launchpad.net/swift/+bug/1921718)"},{"line_number":355,"context_line":"                    existing_link, link_created \u003d self.check_existing("},{"line_number":356,"context_line":"                        new_hash_path, filename)"},{"line_number":357,"context_line":"                if existing_link:"},{"line_number":358,"context_line":"                    self.logger.debug("},{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"d00c44a9_b8a753c8","line":356,"range":{"start_line":356,"start_character":24,"end_line":356,"end_character":47},"in_reply_to":"a4e58849_b35b2a4e","updated":"2021-04-01 17:44:41.000000000","message":"good point","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":358,"context_line":"                    self.logger.debug("},{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":360,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":361,"context_line":"                        old_file, new_file)"},{"line_number":362,"context_line":"                    if hash_path \u003d\u003d existing_link:"},{"line_number":363,"context_line":"                        # uncommon case: the retry succeeded in finding,"},{"line_number":364,"context_line":"                        # and possibly creating, a link to this location"}],"source_content_type":"text/x-python","patch_set":2,"id":"e087e98e_bceb95cb","line":361,"range":{"start_line":361,"start_character":24,"end_line":361,"end_character":42},"updated":"2021-04-01 05:32:15.000000000","message":"Nothing about existing_link?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                    self.logger.debug("},{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":360,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":361,"context_line":"                        old_file, new_file)"},{"line_number":362,"context_line":"                    if hash_path \u003d\u003d existing_link:"},{"line_number":363,"context_line":"                        # uncommon case: the retry succeeded in finding,"},{"line_number":364,"context_line":"                        # and possibly creating, a link to this location"}],"source_content_type":"text/x-python","patch_set":2,"id":"0e6cc207_9c3d1d5e","line":361,"range":{"start_line":361,"start_character":24,"end_line":361,"end_character":42},"in_reply_to":"e087e98e_bceb95cb","updated":"2021-04-01 17:44:41.000000000","message":"Done","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":360,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":361,"context_line":"                        old_file, new_file)"},{"line_number":362,"context_line":"                    if hash_path \u003d\u003d existing_link:"},{"line_number":363,"context_line":"                        # uncommon case: the retry succeeded in finding,"},{"line_number":364,"context_line":"                        # and possibly creating, a link to this location"},{"line_number":365,"context_line":"                        if link_created:"}],"source_content_type":"text/x-python","patch_set":2,"id":"c47d32ae_7ef9f04c","line":362,"range":{"start_line":362,"start_character":36,"end_line":362,"end_character":49},"updated":"2021-04-01 05:32:15.000000000","message":"So existing_link comes from target_file, which has the filename... while hash_path doesn\u0027t -- shouldn\u0027t this be comparing existing_link and old_file?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":359,"context_line":"                        \"Relinking%s: existing link is ok: %s to %s\","},{"line_number":360,"context_line":"                        \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027,"},{"line_number":361,"context_line":"                        old_file, new_file)"},{"line_number":362,"context_line":"                    if hash_path \u003d\u003d existing_link:"},{"line_number":363,"context_line":"                        # uncommon case: the retry succeeded in finding,"},{"line_number":364,"context_line":"                        # and possibly creating, a link to this location"},{"line_number":365,"context_line":"                        if link_created:"}],"source_content_type":"text/x-python","patch_set":2,"id":"905779a3_b32ced01","line":362,"range":{"start_line":362,"start_character":36,"end_line":362,"end_character":49},"in_reply_to":"c47d32ae_7ef9f04c","updated":"2021-04-01 17:44:41.000000000","message":"good catch","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":373,"context_line":"                        # this file is visited again it is possible that"},{"line_number":374,"context_line":"                        # the existing_link will have been cleaned up and"},{"line_number":375,"context_line":"                        # the check will fail, so clean it up now."},{"line_number":376,"context_line":"                        self.logger.debug("},{"line_number":377,"context_line":"                            \"Relinking%s: cleaning up unwanted file: %s\","},{"line_number":378,"context_line":"                            \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027, old_file)"},{"line_number":379,"context_line":"                        unwanted_files.append(old_file)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7cc9e628_4c40b113","line":376,"range":{"start_line":376,"start_character":36,"end_line":376,"end_character":41},"updated":"2021-04-01 05:32:15.000000000","message":"I wonder if this should be at least info -- even if it\u0027s something we can recover from, it\u0027s not entirely \"expected\", right? If we\u0027re not running with --debug (\u0027cause that\u0027s pretty noisy!) would it be worth making sure it still turns up in logs?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":373,"context_line":"                        # this file is visited again it is possible that"},{"line_number":374,"context_line":"                        # the existing_link will have been cleaned up and"},{"line_number":375,"context_line":"                        # the check will fail, so clean it up now."},{"line_number":376,"context_line":"                        self.logger.debug("},{"line_number":377,"context_line":"                            \"Relinking%s: cleaning up unwanted file: %s\","},{"line_number":378,"context_line":"                            \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027, old_file)"},{"line_number":379,"context_line":"                        unwanted_files.append(old_file)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa38809_5fbc2b44","line":376,"range":{"start_line":376,"start_character":36,"end_line":376,"end_character":41},"in_reply_to":"7cc9e628_4c40b113","updated":"2021-04-01 17:44:41.000000000","message":"Yes, I was thinking the same - I\u0027d like to see if this happens! I\u0027ll bump to info","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"400106ceaeae610f506f9a85b67c511dd4faa9b2","unresolved":true,"context_lines":[{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        if self.do_cleanup and not missing_links:"},{"line_number":391,"context_line":"            # use the sorted list to help unit testing"},{"line_number":392,"context_line":"            unwanted_files \u003d old_df_data[\u0027files\u0027]"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        # the new partition hash dir has the most up to date set of on"},{"line_number":395,"context_line":"        # disk files so it is safe to delete the old location..."}],"source_content_type":"text/x-python","patch_set":2,"id":"c7ecdda8_fa1cca4f","line":392,"updated":"2021-04-01 05:32:15.000000000","message":"Not\n\n unwanted_files.extend(old_df_data[\u0027files\u0027])\n\n?","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"08efb67d31fbd0cfa41efd0a5d102cf15323252d","unresolved":true,"context_lines":[{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        if self.do_cleanup and not missing_links:"},{"line_number":391,"context_line":"            # use the sorted list to help unit testing"},{"line_number":392,"context_line":"            unwanted_files \u003d old_df_data[\u0027files\u0027]"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        # the new partition hash dir has the most up to date set of on"},{"line_number":395,"context_line":"        # disk files so it is safe to delete the old location..."}],"source_content_type":"text/x-python","patch_set":2,"id":"62e39cba_9b132b9e","line":392,"in_reply_to":"c7ecdda8_fa1cca4f","updated":"2021-04-01 17:44:41.000000000","message":"old_df_data[\u0027files\u0027] is a superset of required_links","commit_id":"4b83ae24dcbb95f07be6ec9e8b11dde4faffa5fe"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"23eae7ee8b7db24fbb06e7eaeaa7f150fdb70577","unresolved":true,"context_lines":[{"line_number":263,"context_line":"        start \u003d self.next_part_power - 1"},{"line_number":264,"context_line":"        stop \u003d max(start - self.conf[\u0027link_check_limit\u0027], -1)"},{"line_number":265,"context_line":"        for check_part_power in range(start, stop, -1):"},{"line_number":266,"context_line":"            # Try to create the link from each of 3 previous part power"},{"line_number":267,"context_line":"            # locations. If an attempt succeeds then either a link was made or"},{"line_number":268,"context_line":"            # an existing link with the same inode as the next part power"},{"line_number":269,"context_line":"            # location was found: either is acceptable. The part power location"}],"source_content_type":"text/x-python","patch_set":3,"id":"5bdabb37_d033b24c","line":266,"range":{"start_line":266,"start_character":50,"end_line":266,"end_character":51},"updated":"2021-04-01 21:34:02.000000000","message":"s/3/several/","commit_id":"d3cfc5fca7e11824041e4a59ca7a0f38a65c41a7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"23eae7ee8b7db24fbb06e7eaeaa7f150fdb70577","unresolved":true,"context_lines":[{"line_number":372,"context_line":"                        self.logger.info("},{"line_number":373,"context_line":"                            \"Relinking%s: cleaning up unwanted file: %s\","},{"line_number":374,"context_line":"                            \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027, old_file)"},{"line_number":375,"context_line":"                        unwanted_files.append(filename)"},{"line_number":376,"context_line":"                else:"},{"line_number":377,"context_line":"                    self.logger.warning("},{"line_number":378,"context_line":"                        \"Error relinking%s: failed to relink %s to %s: %s\","}],"source_content_type":"text/x-python","patch_set":3,"id":"902b240a_4ad1137b","line":375,"range":{"start_line":375,"start_character":46,"end_line":375,"end_character":54},"updated":"2021-04-01 21:34:02.000000000","message":"Cool -- I was going to make a comment about absolute vs relative paths on the previous patchset ;-)","commit_id":"d3cfc5fca7e11824041e4a59ca7a0f38a65c41a7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c27d9132689e359725025443fe2ae56e7bb8f0f4","unresolved":true,"context_lines":[{"line_number":372,"context_line":"                        self.logger.info("},{"line_number":373,"context_line":"                            \"Relinking%s: cleaning up unwanted file: %s\","},{"line_number":374,"context_line":"                            \u0027 (cleanup)\u0027 if self.do_cleanup else \u0027\u0027, old_file)"},{"line_number":375,"context_line":"                        unwanted_files.append(filename)"},{"line_number":376,"context_line":"                else:"},{"line_number":377,"context_line":"                    self.logger.warning("},{"line_number":378,"context_line":"                        \"Error relinking%s: failed to relink %s to %s: %s\","}],"source_content_type":"text/x-python","patch_set":3,"id":"e63abde9_3d58c1ec","line":375,"range":{"start_line":375,"start_character":46,"end_line":375,"end_character":54},"in_reply_to":"902b240a_4ad1137b","updated":"2021-04-06 08:39:58.000000000","message":"it turned out that the absolute path also worked here due to os.path.join being \"intelligent\"...but for mere mortals using filename seemed a much better idea :)","commit_id":"d3cfc5fca7e11824041e4a59ca7a0f38a65c41a7"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"23eae7ee8b7db24fbb06e7eaeaa7f150fdb70577","unresolved":true,"context_lines":[{"line_number":4440,"context_line":"        self.assertEqual(700, utils.get_partition_for_hash(hex_hash, 10))"},{"line_number":4441,"context_line":"        self.assertEqual(1400, utils.get_partition_for_hash(hex_hash, 11))"},{"line_number":4442,"context_line":"        self.assertEqual(0, utils.get_partition_for_hash(hex_hash, 0))"},{"line_number":4443,"context_line":"        self.assertEqual(0, utils.get_partition_for_hash(hex_hash, -1))"},{"line_number":4444,"context_line":""},{"line_number":4445,"context_line":"    def test_replace_partition_in_path(self):"},{"line_number":4446,"context_line":"        # Check for new part \u003d part * 2"}],"source_content_type":"text/x-python","patch_set":3,"id":"e107f3ba_a26ad2b6","line":4443,"updated":"2021-04-01 21:34:02.000000000","message":"We should maybe have that one throw a ValueError...","commit_id":"d3cfc5fca7e11824041e4a59ca7a0f38a65c41a7"}]}
