)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"An object node should reject a PUT with 409 when the timestamp is less"},{"line_number":10,"context_line":"than or equal to the timestamp of an existing version of the object."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"However, if the PUT is part of an SSYNC, and the fragment archive has a"},{"line_number":13,"context_line":"different index than the one on disk we may store it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_51035010","line":13,"range":{"start_line":12,"start_character":9,"end_line":13,"end_character":52},"updated":"2019-02-05 22:59:51.000000000","message":"...because we\u0027re not sure that the one with the later timestamp is actually reconstructable, is that right?\n\nIsn\u0027t that what the durable flag is for, though?","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":9,"context_line":"An object node should reject a PUT with 409 when the timestamp is less"},{"line_number":10,"context_line":"than or equal to the timestamp of an existing version of the object."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"However, if the PUT is part of an SSYNC, and the fragment archive has a"},{"line_number":13,"context_line":"different index than the one on disk we may store it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_59236abf","line":13,"range":{"start_line":12,"start_character":9,"end_line":13,"end_character":52},"in_reply_to":"9fdfeff1_51035010","updated":"2019-02-06 15:46:18.000000000","message":"Uhh.. I don\u0027t think durable comes into play.\n\nI think what I\u0027m trying to say here is that you can have t1#1d and t1#2d on disk, but not t1#1d and t0#1d?\n\nI guess as a side effect we\u0027d allow the PUT of t2#2d while t1#1d is on disk, at least temporarily.  I\u0027m not 100% sure, but I think the hashdir cleanup would reap t1#1d in that case.","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"However, if the PUT is part of an SSYNC, and the fragment archive has a"},{"line_number":13,"context_line":"different index than the one on disk we may store it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Back before the related change we used to revert fragments to handoffs"},{"line_number":18,"context_line":"and it caused a lot of problems.  Mainly multiple frag indexes piling up"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_111e2870","line":15,"range":{"start_line":15,"start_character":19,"end_line":15,"end_character":36},"updated":"2019-02-05 22:59:51.000000000","message":"Well... *the remote* thinks we\u0027re the primary... how much should/do we need to worry about one side or the other having out-of-date rings? Doubled-up frags for the same timestamp are still a really bad idea for durability... which could still happen if failures are fairly common (so your PUTs often need to reach out to handoffs) and one of the earlier handoffs gets promoted to a primary during rebalance.\n\nBut maybe with the various emergency-replication patches (like https://review.openstack.org/#/c/425493/) this is less of a concern?","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":12,"context_line":"However, if the PUT is part of an SSYNC, and the fragment archive has a"},{"line_number":13,"context_line":"different index than the one on disk we may store it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Back before the related change we used to revert fragments to handoffs"},{"line_number":18,"context_line":"and it caused a lot of problems.  Mainly multiple frag indexes piling up"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_7972eee5","line":15,"range":{"start_line":15,"start_character":19,"end_line":15,"end_character":36},"in_reply_to":"9fdfeff1_111e2870","updated":"2019-02-06 15:46:18.000000000","message":"I think doubling up frags on disk is bad for durability, we\u0027ve choose to support it so that nodes can work out a swap without a temporary node.  Having reverts happen quickly is very important - priority re-balance aims at that.  If rings are changing the requirement is only that things get where they need to eventually.\n\nIt\u0027s not really intended for normal operation to have doubling (or tripling!) of frags on disks, these are edge cases.  I have observed it, but only in cases where there was also over-replication (i.e. some handoff has two frags, but the primaries for those frags ALSO have the frags).  I assume some doubling/swapping happens, but I don\u0027t really know how much.","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Back before the related change we used to revert fragments to handoffs"},{"line_number":18,"context_line":"and it caused a lot of problems.  Mainly multiple frag indexes piling up"},{"line_number":19,"context_line":"on one handoff node.  Eventually we settled on handoffs only reverting"},{"line_number":20,"context_line":"to primaries but there was some crufty flailing left over."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_d425eeac","line":18,"range":{"start_line":18,"start_character":41,"end_line":18,"end_character":62},"updated":"2019-02-05 22:59:51.000000000","message":"...with the same timestamp, yeah? That was the main trouble?","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"We should store it we\u0027re the primary holder for that fragment index."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Back before the related change we used to revert fragments to handoffs"},{"line_number":18,"context_line":"and it caused a lot of problems.  Mainly multiple frag indexes piling up"},{"line_number":19,"context_line":"on one handoff node.  Eventually we settled on handoffs only reverting"},{"line_number":20,"context_line":"to primaries but there was some crufty flailing left over."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_9939d2f3","line":18,"range":{"start_line":18,"start_character":41,"end_line":18,"end_character":62},"in_reply_to":"9fdfeff1_d425eeac","updated":"2019-02-06 15:46:18.000000000","message":"yes, different frag index same timestamp is implied.\n\nI\u0027ve not really observed a lot multiple timestamp EC objects floating around.  It seems that our hash dir cleanup tends to weed out old timestamps pretty quickly once an timestamp is observed to be durable.","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"}],"swift/common/ring/ring.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            self._reload()"},{"line_number":409,"context_line":"        primary_nodes \u003d self._get_part_nodes(part)"},{"line_number":410,"context_line":"        used \u003d set(d[\u0027id\u0027] for d in primary_nodes)"},{"line_number":411,"context_line":"        index \u003d count()"},{"line_number":412,"context_line":"        same_regions \u003d set(d[\u0027region\u0027] for d in primary_nodes)"},{"line_number":413,"context_line":"        same_zones \u003d set((d[\u0027region\u0027], d[\u0027zone\u0027]) for d in primary_nodes)"},{"line_number":414,"context_line":"        same_ips \u003d set("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_aee2729f","line":411,"updated":"2019-02-04 21:33:38.000000000","message":"I wonder if it would be more or less confusing to have a\n\n start\u003dself.replica_count\n\n... but then I suppose we\u0027d have to worry about fractional replicas for replicated policies...","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                    dev \u003d self._devs[dev_id]"},{"line_number":435,"context_line":"                    region \u003d dev[\u0027region\u0027]"},{"line_number":436,"context_line":"                    if dev_id not in used and region not in same_regions:"},{"line_number":437,"context_line":"                        yield dev"},{"line_number":438,"context_line":"                        used.add(dev_id)"},{"line_number":439,"context_line":"                        same_regions.add(region)"},{"line_number":440,"context_line":"                        zone \u003d dev[\u0027zone\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_dda766a7","line":437,"updated":"2019-02-05 22:59:51.000000000","message":"Boo! I liked the implicit copy... I don\u0027t want callers to inadvertently change Ring._devs...","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                    dev \u003d self._devs[dev_id]"},{"line_number":435,"context_line":"                    region \u003d dev[\u0027region\u0027]"},{"line_number":436,"context_line":"                    if dev_id not in used and region not in same_regions:"},{"line_number":437,"context_line":"                        yield dev"},{"line_number":438,"context_line":"                        used.add(dev_id)"},{"line_number":439,"context_line":"                        same_regions.add(region)"},{"line_number":440,"context_line":"                        zone \u003d dev[\u0027zone\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_19064222","line":437,"in_reply_to":"9fdfeff1_dda766a7","updated":"2019-02-06 15:46:18.000000000","message":"yes, that sort of thing happens a little bit in tests.  Handing out copies is nice.  But even get_part_nodes used to trust callers with it\u0027s mutable references.","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        :raises DiskFileError: if the fragment archive cannot be reconstructed"},{"line_number":371,"context_line":"        \"\"\""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # don\u0027t try and fetch a fragment from the node we\u0027re rebuilding too"},{"line_number":374,"context_line":"        part_nodes \u003d [n for n in job[\u0027policy\u0027].object_ring.get_part_nodes("},{"line_number":375,"context_line":"            job[\u0027partition\u0027]) if n[\u0027id\u0027] !\u003d node[\u0027id\u0027]]"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b1bdf303","line":373,"range":{"start_line":373,"start_character":72,"end_line":373,"end_character":75},"updated":"2019-02-04 21:33:38.000000000","message":"nit: to","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # don\u0027t try and fetch a fragment from the node we\u0027re rebuilding too"},{"line_number":374,"context_line":"        part_nodes \u003d [n for n in job[\u0027policy\u0027].object_ring.get_part_nodes("},{"line_number":375,"context_line":"            job[\u0027partition\u0027]) if n[\u0027id\u0027] !\u003d node[\u0027id\u0027]]"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        # the fragment index we need to reconstruct is the position index"},{"line_number":378,"context_line":"        # of the node we\u0027re rebuilding to within the primary part list"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ce7b36bc","line":375,"updated":"2019-02-04 21:33:38.000000000","message":"My gut says this is fine, but when would n[\u0027id\u0027] \u003d\u003d node[\u0027id\u0027] but n !\u003d node? I guess this is because of the new backend_index key...?","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # don\u0027t try and fetch a fragment from the node we\u0027re rebuilding too"},{"line_number":374,"context_line":"        part_nodes \u003d [n for n in job[\u0027policy\u0027].object_ring.get_part_nodes("},{"line_number":375,"context_line":"            job[\u0027partition\u0027]) if n[\u0027id\u0027] !\u003d node[\u0027id\u0027]]"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        # the fragment index we need to reconstruct is the position index"},{"line_number":378,"context_line":"        # of the node we\u0027re rebuilding to within the primary part list"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a765b547","line":375,"in_reply_to":"9fdfeff1_ce7b36bc","updated":"2019-02-06 15:46:18.000000000","message":"in the next change the node we\u0027re rebuilding too may not be in the primary node list","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                continue"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":833,"context_line":"                node[\u0027index\u0027])"},{"line_number":834,"context_line":"            # ssync any out-of-sync suffixes with the remote node"},{"line_number":835,"context_line":"            success, _ \u003d ssync_sender("},{"line_number":836,"context_line":"                self, node, job, suffixes)()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_d11677f2","line":833,"updated":"2019-02-04 21:33:38.000000000","message":"Took me a sec to realize why we couldn\u0027t do this up in ObjectReconstructor._get_part_jobs()... but now I wonder if it might be worth putting into Ring.get_part_nodes()... ugh, I suppose the *ring* doesn\u0027t know anything about duplication factors...\n\nMaybe it\u0027d be worth having a StoragePolicy.get_part_nodes() that mostly just proxies through to Ring.get_part_nodes(), but EC could drop in a backend_index? Or maybe that\u0027s just too much churn for dubious benefit...","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                continue"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":833,"context_line":"                node[\u0027index\u0027])"},{"line_number":834,"context_line":"            # ssync any out-of-sync suffixes with the remote node"},{"line_number":835,"context_line":"            success, _ \u003d ssync_sender("},{"line_number":836,"context_line":"                self, node, job, suffixes)()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_c74d59c5","line":833,"in_reply_to":"9fdfeff1_d11677f2","updated":"2019-02-06 15:46:18.000000000","message":"yeah I think it\u0027s pretty dubious using nodes as scratch space for context specific vars - more coupling of rings \u0026 storage policy might help.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":853,"context_line":"        reverted_objs \u003d {}"},{"line_number":854,"context_line":"        for node in job[\u0027sync_to\u0027]:"},{"line_number":855,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":856,"context_line":"                node[\u0027index\u0027])"},{"line_number":857,"context_line":"            success, in_sync_objs \u003d ssync_sender("},{"line_number":858,"context_line":"                self, node, job, job[\u0027suffixes\u0027])()"},{"line_number":859,"context_line":"            if success:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_8e1d2e75","line":856,"updated":"2019-02-04 21:33:38.000000000","message":"Do we really need a backend_index here? Seems like we only look at this up in reconstruct_fa... and we shouldn\u0027t be reconstructing as part of a REVERT...\n\nIs this just for completeness?\n\nOh, I get it! We also use it over in ssync_sender.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":853,"context_line":"        reverted_objs \u003d {}"},{"line_number":854,"context_line":"        for node in job[\u0027sync_to\u0027]:"},{"line_number":855,"context_line":"            node[\u0027backend_index\u0027] \u003d job[\u0027policy\u0027].get_backend_index("},{"line_number":856,"context_line":"                node[\u0027index\u0027])"},{"line_number":857,"context_line":"            success, in_sync_objs \u003d ssync_sender("},{"line_number":858,"context_line":"                self, node, job, job[\u0027suffixes\u0027])()"},{"line_number":859,"context_line":"            if success:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_e74addaa","line":856,"in_reply_to":"9fdfeff1_8e1d2e75","updated":"2019-02-06 15:46:18.000000000","message":"Done","commit_id":"153407b983c16e377455e222e1fecc70eb797577"}],"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":767,"context_line":"                    raise HTTPBadRequest(body\u003dstr(e), request\u003drequest,"},{"line_number":768,"context_line":"                                         content_type\u003d\u0027text/plain\u0027)"},{"line_number":769,"context_line":"        # SSYNC will include Frag-Index header for subrequests, in which case"},{"line_number":770,"context_line":"        # get_diskfile will ignore non-matching on-disk data files"},{"line_number":771,"context_line":"        frag_index \u003d request.headers.get(\u0027X-Backend-Ssync-Frag-Index\u0027)"},{"line_number":772,"context_line":"        next_part_power \u003d request.headers.get(\u0027X-Backend-Next-Part-Power\u0027)"},{"line_number":773,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_11cb9f72","line":770,"updated":"2019-02-04 21:33:38.000000000","message":"It bugs me a little that we have to update this comment because of code that\u0027s changing elsewhere :-/\n\nStill, I think I\u0027d rather keep it than rip it out.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":787,"context_line":"            orig_timestamp \u003d e.timestamp"},{"line_number":788,"context_line":"        except (DiskFileNotExist, DiskFileQuarantined):"},{"line_number":789,"context_line":"            orig_metadata \u003d {}"},{"line_number":790,"context_line":"            orig_timestamp \u003d Timestamp(0)"},{"line_number":791,"context_line":"        # Checks for If-None-Match"},{"line_number":792,"context_line":"        if request.if_none_match is not None and orig_metadata:"},{"line_number":793,"context_line":"            if \u0027*\u0027 in request.if_none_match:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_f1929b58","line":790,"updated":"2019-02-04 21:33:38.000000000","message":"So now non-match will fall to here...","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":797,"context_line":"                # The current ETag matches, so raise 412"},{"line_number":798,"context_line":"                raise HTTPPreconditionFailed(request\u003drequest)"},{"line_number":799,"context_line":"        if orig_timestamp \u003e\u003d req_timestamp:"},{"line_number":800,"context_line":"            raise HTTPConflict("},{"line_number":801,"context_line":"                request\u003drequest,"},{"line_number":802,"context_line":"                headers\u003d{\u0027X-Backend-Timestamp\u0027: orig_timestamp.internal})"},{"line_number":803,"context_line":"        return disk_file, fsize, orig_metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b19c136b","line":800,"updated":"2019-02-04 21:33:38.000000000","message":"... and this path will be avoided.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":478,"context_line":"            subreq.headers[\u0027X-Backend-Replication\u0027] \u003d \u0027True\u0027"},{"line_number":479,"context_line":"            if self.node_index is not None:"},{"line_number":480,"context_line":"                # primary node should not 409 if it has a non-primary fragment"},{"line_number":481,"context_line":"                subreq.headers[\u0027X-Backend-Ssync-Frag-Index\u0027] \u003d self.node_index"},{"line_number":482,"context_line":"            if replication_headers:"},{"line_number":483,"context_line":"                subreq.headers[\u0027X-Backend-Replication-Headers\u0027] \u003d \\"},{"line_number":484,"context_line":"                    \u0027 \u0027.join(replication_headers)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_f1c93b5a","side":"PARENT","line":481,"range":{"start_line":481,"start_character":68,"end_line":481,"end_character":78},"updated":"2019-02-04 21:33:38.000000000","message":"This makes me think of https://review.openstack.org/#/c/629935/ ...","commit_id":"0c316a134fd44f7254a9561796f088d9b7f9a9c3"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                # replication jobs will not have a frag_index key;"},{"line_number":240,"context_line":"                # reconstructor jobs with only tombstones will have a"},{"line_number":241,"context_line":"                # frag_index key explicitly set to the value of None - in both"},{"line_number":242,"context_line":"                # cases on the wire we write the empty string which"},{"line_number":243,"context_line":"                # ssync_receiver will translate to None"},{"line_number":244,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027, frag_index)"},{"line_number":245,"context_line":"                # Node-Index header is for backwards compat"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_f1f7fb8b","line":242,"range":{"start_line":242,"start_character":24,"end_line":242,"end_character":61},"updated":"2019-02-04 21:33:38.000000000","message":"This is no longer true; looks like we omit the header now.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                # replication jobs will not have a frag_index key;"},{"line_number":240,"context_line":"                # reconstructor jobs with only tombstones will have a"},{"line_number":241,"context_line":"                # frag_index key explicitly set to the value of None - in both"},{"line_number":242,"context_line":"                # cases on the wire we write the empty string which"},{"line_number":243,"context_line":"                # ssync_receiver will translate to None"},{"line_number":244,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027, frag_index)"},{"line_number":245,"context_line":"                # Node-Index header is for backwards compat"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_0787e1b8","line":242,"range":{"start_line":242,"start_character":24,"end_line":242,"end_character":61},"in_reply_to":"9fdfeff1_f1f7fb8b","updated":"2019-02-06 15:46:18.000000000","message":"I really meant to take this comment out.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                # cases on the wire we write the empty string which"},{"line_number":243,"context_line":"                # ssync_receiver will translate to None"},{"line_number":244,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027, frag_index)"},{"line_number":245,"context_line":"                # Node-Index header is for backwards compat"},{"line_number":246,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Node-Index\u0027, frag_index)"},{"line_number":247,"context_line":"            connection.endheaders()"},{"line_number":248,"context_line":"        with exceptions.MessageTimeout("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_0cce2683","line":245,"range":{"start_line":245,"start_character":39,"end_line":245,"end_character":59},"updated":"2019-02-04 21:33:38.000000000","message":"Maybe include affected versions, so we can have some hope of ever remembering to remove it? I guess, 2.4.0-2.20.0?","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                # cases on the wire we write the empty string which"},{"line_number":243,"context_line":"                # ssync_receiver will translate to None"},{"line_number":244,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027, frag_index)"},{"line_number":245,"context_line":"                # Node-Index header is for backwards compat"},{"line_number":246,"context_line":"                connection.putheader(\u0027X-Backend-Ssync-Node-Index\u0027, frag_index)"},{"line_number":247,"context_line":"            connection.endheaders()"},{"line_number":248,"context_line":"        with exceptions.MessageTimeout("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_67a26d4e","line":245,"range":{"start_line":245,"start_character":39,"end_line":245,"end_character":59},"in_reply_to":"9fdfeff1_0cce2683","updated":"2019-02-06 15:46:18.000000000","message":"I don\u0027t really know what you mean; I don\u0027t have any hope of ever removing it.  I\u0027ll put those numbers in the comment tho.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            # a sync job must use the node\u0027s index for the frag_index of the"},{"line_number":235,"context_line":"            # rebuilt fragments instead of the frag_index from the job which"},{"line_number":236,"context_line":"            # will be rebuilding them"},{"line_number":237,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":238,"context_line":"            if frag_index is None:"},{"line_number":239,"context_line":"                # replication jobs will not have a frag_index key;"},{"line_number":240,"context_line":"                # reconstructor jobs with only tombstones will have a"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_ffd1eb30","side":"PARENT","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":46},"updated":"2019-02-05 22:59:51.000000000","message":"So this should be the only material change... and it makes *way* more sense with the backend_index.","commit_id":"1d4249ee9d176d5563631521fb17aa24baf7fbf3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b79ac805523fbc06f458ce4b67de472068eaf28","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            # a sync job must use the node\u0027s index for the frag_index of the"},{"line_number":235,"context_line":"            # rebuilt fragments instead of the frag_index from the job which"},{"line_number":236,"context_line":"            # will be rebuilding them"},{"line_number":237,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":238,"context_line":"            if frag_index is None:"},{"line_number":239,"context_line":"                # replication jobs will not have a frag_index key;"},{"line_number":240,"context_line":"                # reconstructor jobs with only tombstones will have a"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_a6efd2ae","side":"PARENT","line":237,"range":{"start_line":237,"start_character":12,"end_line":237,"end_character":46},"in_reply_to":"9fdfeff1_ffd1eb30","updated":"2019-02-06 18:04:07.000000000","message":"I wonder if this was the root cause for https://bugs.launchpad.net/swift/+bug/1772378 ...","commit_id":"1d4249ee9d176d5563631521fb17aa24baf7fbf3"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":4189,"context_line":"    def test_process_job_revert_cleanup_tombstone(self):"},{"line_number":4190,"context_line":"        partition \u003d 0"},{"line_number":4191,"context_line":"        sync_to \u003d [random.choice(["},{"line_number":4192,"context_line":"            n for n in self.policy.object_ring.get_part_nodes(partition)"},{"line_number":4193,"context_line":"            if n[\u0027id\u0027] !\u003d self.local_dev[\u0027id\u0027]])]"},{"line_number":4194,"context_line":""},{"line_number":4195,"context_line":"        part_path \u003d os.path.join(self.devices, self.local_dev[\u0027device\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_71122bb7","line":4192,"range":{"start_line":4192,"start_character":47,"end_line":4192,"end_character":61},"updated":"2019-02-04 21:33:38.000000000","message":"So only primaries now?","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":4189,"context_line":"    def test_process_job_revert_cleanup_tombstone(self):"},{"line_number":4190,"context_line":"        partition \u003d 0"},{"line_number":4191,"context_line":"        sync_to \u003d [random.choice(["},{"line_number":4192,"context_line":"            n for n in self.policy.object_ring.get_part_nodes(partition)"},{"line_number":4193,"context_line":"            if n[\u0027id\u0027] !\u003d self.local_dev[\u0027id\u0027]])]"},{"line_number":4194,"context_line":""},{"line_number":4195,"context_line":"        part_path \u003d os.path.join(self.devices, self.local_dev[\u0027device\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_67bb4d72","line":4192,"range":{"start_line":4192,"start_character":47,"end_line":4192,"end_character":61},"in_reply_to":"9fdfeff1_71122bb7","updated":"2019-02-06 15:46:18.000000000","message":"well, we only revert to primaries in practice...","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":3712,"context_line":"            (\u0027X-Backend-Ssync-Frag-Index\u0027, right_frag_index),"},{"line_number":3713,"context_line":"            # we include this for backwards compat"},{"line_number":3714,"context_line":"            (\u0027X-Backend-Ssync-Node-Index\u0027, right_frag_index),"},{"line_number":3715,"context_line":"        ])"},{"line_number":3716,"context_line":""},{"line_number":3717,"context_line":"    def test_process_job_sync_missing_durable(self):"},{"line_number":3718,"context_line":"        partition \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_ff356ba9","line":3715,"updated":"2019-02-05 22:59:51.000000000","message":"Backing out the changes in swift/, this pops nice:\n\n $ nosetests test/unit/obj/test_reconstructor.py:TestObjectReconstructorECDuplicationFactor.test_sync_duplicates_to_remote_region\n test_sync_duplicates_to_remote_region (test.unit.obj.test_reconstructor.TestObjectReconstructorECDuplicationFactor) ... FAIL\n \n \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n FAIL: test_sync_duplicates_to_remote_region (test.unit.obj.test_reconstructor.TestObjectReconstructorECDuplicationFactor)\n ----------------------------------------------------------------------\n Traceback (most recent call last):\n   File \"/vagrant/swift/test/unit/obj/test_reconstructor.py\", line 3714, in test_sync_duplicates_to_remote_region\n     (\u0027X-Backend-Ssync-Node-Index\u0027, right_frag_index),\n AssertionError: Lists differ: [(\u0027Transfer-Encoding\u0027, \u0027chunke... !\u003d [(\u0027Transfer-Encoding\u0027, \u0027chunke...\n \n First differing element 2:\n (\u0027X-Backend-Ssync-Frag-Index\u0027, 20)\n (\u0027X-Backend-Ssync-Frag-Index\u0027, 6)\n \n   [(\u0027Transfer-Encoding\u0027, \u0027chunked\u0027),\n    (\u0027X-Backend-Storage-Policy-Index\u0027, 0),\n -  (\u0027X-Backend-Ssync-Frag-Index\u0027, 20),\n ?                                 ^^\n \n +  (\u0027X-Backend-Ssync-Frag-Index\u0027, 6),\n ?                                 ^\n \n -  (\u0027X-Backend-Ssync-Node-Index\u0027, 20)]\n ?                                 ^^\n \n +  (\u0027X-Backend-Ssync-Node-Index\u0027, 6)]\n ?                                 ^\n \n     \"\"\"Fail immediately, with the given message.\"\"\"\n \u003e\u003e  raise self.failureException(\"Lists differ: [(\u0027Transfer-Encoding\u0027, \u0027chunke... !\u003d [(\u0027Transfer-Encoding\u0027, \u0027chunke...\\n\\nFirst differing element 2:\\n(\u0027X-Backend-Ssync-Frag-Index\u0027, 20)\\n(\u0027X-Backend-Ssync-Frag-Index\u0027, 6)\\n\\n  [(\u0027Transfer-Encoding\u0027, \u0027chunked\u0027),\\n   (\u0027X-Backend-Storage-Policy-Index\u0027, 0),\\n-  (\u0027X-Backend-Ssync-Frag-Index\u0027, 20),\\n?                                 ^^\\n\\n+  (\u0027X-Backend-Ssync-Frag-Index\u0027, 6),\\n?                                 ^\\n\\n-  (\u0027X-Backend-Ssync-Node-Index\u0027, 20)]\\n?                                 ^^\\n\\n+  (\u0027X-Backend-Ssync-Node-Index\u0027, 6)]\\n?                                 ^\\n\")\n \n \n ----------------------------------------------------------------------\n Ran 1 test in 0.163s\n \n FAILED (failures\u003d1)","commit_id":"fb0e7837af119dfb6bd30627ac8f9f4eb5a3e890"}],"test/unit/obj/test_ssync.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.rx_node \u003d {\u0027replication_ip\u0027: self.rx_ip,"},{"line_number":71,"context_line":"                        \u0027replication_port\u0027: self.rx_port,"},{"line_number":72,"context_line":"                        \u0027device\u0027: self.device,"},{"line_number":73,"context_line":"                        \u0027backend_index\u0027: 0}"},{"line_number":74,"context_line":"        self.obj_data \u003d {}  # maps obj path -\u003e obj data"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_712f8ba7","line":73,"updated":"2019-02-04 21:33:38.000000000","message":"Why do we need this? Does TestSsyncReplication still reflect reality? Should we just do this in TestBaseSsyncEC?","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.rx_node \u003d {\u0027replication_ip\u0027: self.rx_ip,"},{"line_number":71,"context_line":"                        \u0027replication_port\u0027: self.rx_port,"},{"line_number":72,"context_line":"                        \u0027device\u0027: self.device,"},{"line_number":73,"context_line":"                        \u0027backend_index\u0027: 0}"},{"line_number":74,"context_line":"        self.obj_data \u003d {}  # maps obj path -\u003e obj data"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_67702dde","line":73,"in_reply_to":"9fdfeff1_712f8ba7","updated":"2019-02-06 15:46:18.000000000","message":"yeah that seems like a good idea.","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e6747828fbfe122145d01e47549e093cf308e42e","unresolved":false,"context_lines":[{"line_number":808,"context_line":"                    os.path.basename(os.path.dirname(df._datadir)))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        self.job_node \u003d dict(self.rx_node)"},{"line_number":811,"context_line":"        self.job_node[\u0027index\u0027] \u003d self.rx_node_index"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        self.frag_length \u003d int("},{"line_number":814,"context_line":"            self.tx_objs[\u0027o1\u0027][0].get_metadata()[\u0027Content-Length\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_117dc8e6","side":"PARENT","line":811,"updated":"2019-02-05 22:59:51.000000000","message":"So I got a little nervous about this after backing out just the swift/ changes and leaving the test/unit/ changes in place; I\u0027d see failures like\n\nFAIL: test_sync_reconstructor_rebuild_ok (test.unit.obj.test_ssync.TestSsyncECReconstructorSyncJob)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/vagrant/swift/test/unit/obj/test_ssync.py\", line 1047, in test_sync_reconstructor_rebuild_ok\n    results \u003d self._analyze_trace(trace)\n  File \"/vagrant/swift/test/unit/obj/test_ssync.py\", line 254, in _analyze_trace\n    self.fail(\u0027Handshake %s not found\u0027 % str(missed[0]))\nAssertionError: Handshake (\u0027rx\u0027, \u0027:UPDATES: START\u0027) not found\n-------------------- \u003e\u003e begin captured stdout \u003c\u003c ---------------------\ntest INFO: Traceback (most recent call last):\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py\", line 572, in handle_one_response\n    write(b\u0027\u0027.join(towrite))\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py\", line 519, in write\n    wfile.flush()\n  File \"/usr/lib/python2.7/socket.py\", line 307, in flush\n    self._sock.sendall(view[write_offset:write_offset+buffer_size])\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py\", line 401, in sendall\n    tail \u003d self.send(data, flags)\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py\", line 395, in send\n    return self._send_loop(self.fd.send, data, flags)\n  File \"/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py\", line 382, in _send_loop\n    return send_method(data, *args)\nerror: [Errno 32] Broken pipe\n\ntest INFO: 127.0.0.1 - - [05/Feb/2019 21:26:25] \"SSYNC /dev/9 HTTP/1.1\" 200 272 0.062840\ntest INFO: (26807) wsgi starting up on http://127.0.0.1:48183\ntest INFO: (26807) wsgi exited, is_accepting\u003dTrue\ntest DEBUG: (26807) accepted (\u0027127.0.0.1\u0027, 44624)\ntest-ssync-sender ERROR: 127.0.0.1:48183/dev/9 EXCEPTION in ssync.Sender:\nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/obj/ssync_sender.py\", line 178, in __call__\n    self.updates(connection, response, send_map)\n  File \"/vagrant/swift/swift/obj/ssync_sender.py\", line 354, in updates\n    self.job, self.node, df.get_datafile_metadata())\n  File \"/vagrant/swift/swift/obj/reconstructor.py\", line 379, in reconstruct_fa\n    fi_to_rebuild \u003d job[\u0027policy\u0027].get_backend_index(node[\u0027index\u0027])\nKeyError: \u0027index\u0027\n\n--------------------- \u003e\u003e end captured stdout \u003c\u003c ----------------------\n    \"\"\"Fail immediately, with the given message.\"\"\"\n\u003e\u003e  raise self.failureException(\"Handshake (\u0027rx\u0027, \u0027:UPDATES: START\u0027) not found\")\n\nbut... I guess it\u0027s OK? get_part_nodes should always provide an index: https://github.com/openstack/swift/blob/2.20.0/swift/common/ring/ring.py#L328","commit_id":"1d4249ee9d176d5563631521fb17aa24baf7fbf3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":808,"context_line":"                    os.path.basename(os.path.dirname(df._datadir)))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        self.job_node \u003d dict(self.rx_node)"},{"line_number":811,"context_line":"        self.job_node[\u0027index\u0027] \u003d self.rx_node_index"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        self.frag_length \u003d int("},{"line_number":814,"context_line":"            self.tx_objs[\u0027o1\u0027][0].get_metadata()[\u0027Content-Length\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_1d5b8d2e","side":"PARENT","line":811,"in_reply_to":"9fdfeff1_117dc8e6","updated":"2019-02-06 15:46:18.000000000","message":"Yeah, I think it stands to reason.\n\nThe ssync tests don\u0027t get their jobs/nodes from the reconstructor - they just use stubs.  So to match reality, I noticed when we added index to get_part_nodes, we also had to add it to the test stubs.  Now we use backend_index across the board (and the test stubs fixups got consolidated to the Base class).\n\n... but if the ssync code is reverted and still looking \u0027index\u0027 but the tests still s/index/backend_index/ - we get the KeyError","commit_id":"1d4249ee9d176d5563631521fb17aa24baf7fbf3"}],"test/unit/obj/test_ssync_receiver.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            [\u0027:MISSING_CHECK: START\u0027, \u0027:MISSING_CHECK: END\u0027,"},{"line_number":233,"context_line":"             \u0027:UPDATES: START\u0027, \u0027:UPDATES: END\u0027])"},{"line_number":234,"context_line":"        self.assertEqual(rcvr.policy, POLICIES[1])"},{"line_number":235,"context_line":"        # no one ever did this and no one cares"},{"line_number":236,"context_line":"        self.assertEqual(rcvr.frag_index, None)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    @unit.patch_policies()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ece1622c","line":235,"range":{"start_line":235,"start_character":8,"end_line":235,"end_character":47},"updated":"2019-02-04 21:33:38.000000000","message":"I was starting to get nervous about possible upgrade problems... but it looks like you\u0027re right:\n\n- before https://github.com/openstack/swift/commit/ac8a769 we only sent frag-index and\n- we don\u0027t need to worry about regressing on https://bugs.launchpad.net/swift/+bug/1452619 because\n- as you already noted, we stopped reverting to handoffs in https://review.openstack.org/#/c/425441/\n\nShould we just remove this test?","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            [\u0027:MISSING_CHECK: START\u0027, \u0027:MISSING_CHECK: END\u0027,"},{"line_number":233,"context_line":"             \u0027:UPDATES: START\u0027, \u0027:UPDATES: END\u0027])"},{"line_number":234,"context_line":"        self.assertEqual(rcvr.policy, POLICIES[1])"},{"line_number":235,"context_line":"        # no one ever did this and no one cares"},{"line_number":236,"context_line":"        self.assertEqual(rcvr.frag_index, None)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    @unit.patch_policies()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_275b0555","line":235,"range":{"start_line":235,"start_character":8,"end_line":235,"end_character":47},"in_reply_to":"9fdfeff1_ece1622c","updated":"2019-02-06 15:46:18.000000000","message":"i was gunna say \"sure\" but I think there\u0027s some material value here both for input fuzzing and for future maintainers trying to make sense of the deprecated node-index","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d74b45553b9279541b1de28204d3a0a5560e879f","unresolved":false,"context_lines":[{"line_number":296,"context_line":"            [\u0027:MISSING_CHECK: START\u0027, \u0027:MISSING_CHECK: END\u0027,"},{"line_number":297,"context_line":"             \u0027:UPDATES: START\u0027, \u0027:UPDATES: END\u0027])"},{"line_number":298,"context_line":"        self.assertEqual(rcvr.policy, POLICIES[1])"},{"line_number":299,"context_line":"        # no one ever did this and no one cares"},{"line_number":300,"context_line":"        self.assertEqual(rcvr.frag_index, 7)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def test_SSYNC_replication_lock_fail(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_4ccaeea1","line":299,"updated":"2019-02-04 21:33:38.000000000","message":"ditto","commit_id":"153407b983c16e377455e222e1fecc70eb797577"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c3329680f4b9753187d1eef2ab94d03821440e8","unresolved":false,"context_lines":[{"line_number":296,"context_line":"            [\u0027:MISSING_CHECK: START\u0027, \u0027:MISSING_CHECK: END\u0027,"},{"line_number":297,"context_line":"             \u0027:UPDATES: START\u0027, \u0027:UPDATES: END\u0027])"},{"line_number":298,"context_line":"        self.assertEqual(rcvr.policy, POLICIES[1])"},{"line_number":299,"context_line":"        # no one ever did this and no one cares"},{"line_number":300,"context_line":"        self.assertEqual(rcvr.frag_index, 7)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def test_SSYNC_replication_lock_fail(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_8718b184","line":299,"in_reply_to":"9fdfeff1_4ccaeea1","updated":"2019-02-06 15:46:18.000000000","message":"keeping it w a better comment","commit_id":"153407b983c16e377455e222e1fecc70eb797577"}]}
