)]}'
{"swift/obj/reconstructor.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c53c3a345d3362884dfd0688dbc65dd3f9a740b4","unresolved":true,"context_lines":[{"line_number":670,"context_line":"                \u0027local etag: %s\u0027,"},{"line_number":671,"context_line":"                _full_path(node, partition, path, policy),"},{"line_number":672,"context_line":"                fi_to_rebuild, local_timestamp.internal, local_etag)"},{"line_number":673,"context_line":"            matching_bucket, node_count \u003d self._search_handoffs("},{"line_number":674,"context_line":"                node, policy, partition, fi_to_rebuild, path, headers,"},{"line_number":675,"context_line":"                ring, pile, buckets, error_responses,"},{"line_number":676,"context_line":"                primary_node_count, max_node_count, concurrency,"}],"source_content_type":"text/x-python","patch_set":3,"id":"82b5cdca_bb1c190e","line":673,"updated":"2026-06-01 07:25:57.000000000","message":"What happens if while searching handoffs we get a set of newer complete set as well as a enough on the local time. Then the localtime will win and we\u0027ll rebuild an older verion. Why because we are only checking against the local time. But in that case the local should be obsolete. Do we need to run the `_has_local_newer_mismatch`? on the buckets agein after the handoff check?\n\nI know it\u0027s probably an edgecase:\n\n  - T1: older useful bucket from primaries.\n  - T2: local fragment timestamp, only one matching peer so far.\n  - _has_local_newer_mismatch() says “OK, local is newer than useful peer bucket.”\n  - Handoffs return enough fragments at T3, where T3 \u003e T2.\n  - Now we know local T2 is obsolete.\n  - Later handoffs return enough T2 fragments.\n  - Current code accepts T2 and rebuilds it anyway.\n  \nWhy, because we only check:\n```\nbucket.is_useful(policy) and bucket.matches(local_timestamp, local_etag)\n```","commit_id":"90a57bfe0dd756c458f2c384fb25ed7d79940a4f"}]}
