)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"38a495ffaa2e8c355b45ae5efaf95596359db669","unresolved":true,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"  - add a check before removing the meta file that the hashdir has no"},{"line_number":12,"context_line":"    other frags, in case there is another revert job that still needs"},{"line_number":13,"context_line":"    the meta file"},{"line_number":14,"context_line":"  - unit test the diskfile purge method change"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Previously, after reverting handoff files, the reconstructor would"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f53079f7_d9006fec","line":13,"updated":"2021-11-19 18:44:43.000000000","message":"Good call -- if we have that\n\n t1#1#d.data\n t1#2#d.data\n t2.meta\n\nlayout but neither of the frags belong there, we definitely want the *last* revert job to do the delete, not the *first* one.","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93c4efbbb7dfc3a131fcb1ba183aed589707f1d2","unresolved":true,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"  - add a check before removing the meta file that the hashdir has no"},{"line_number":12,"context_line":"    other frags, in case there is another revert job that still needs"},{"line_number":13,"context_line":"    the meta file"},{"line_number":14,"context_line":"  - unit test the diskfile purge method change"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Previously, after reverting handoff files, the reconstructor would"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"09c2cdb8_60f3940a","line":13,"updated":"2021-11-19 23:39:21.000000000","message":"Proposed https://review.opendev.org/c/openstack/swift/+/818653 to address; feel free to squash in/edit.","commit_id":"0d3556eb8d101cb85a0a4545602d21d44ae0bbe1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"38a495ffaa2e8c355b45ae5efaf95596359db669","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ebcbfc99_9ced7967","updated":"2021-11-19 18:44:43.000000000","message":"Seems to make sense. The lingering TODO makes me a little nervous, but it seems unlikely to happen in practice. I\u0027m comfortable seeing this in prod, anyway.","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"53aa63ff2891c8f2050ddd285a469f1e1ac170fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"55017658_29099262","updated":"2021-11-19 12:18:56.000000000","message":"WIP","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3da6ed10f1b17430de4830e319db65f0f8c3290d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"be376235_62837088","updated":"2021-11-19 13:04:31.000000000","message":"i get it now maybe - the revert job will have primary_frag_index\u003dNone UNLESS there was a sync job for another frag_index\n\nso mostly we\u0027ll delete .meta files\n\n... until they\u0027re isolated :/","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1039cfe6971f1f15fda6904203bd673cb73fd7d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6f1b1e4f_933eafcd","updated":"2021-11-19 13:01:45.000000000","message":"on my revert jobs (that do have a primary node; as opposed to I guess tombstone-only partitions that might need to revert w/o a frag index) i\u0027m not seeing the timestamps offered in the missing_check when there is ONLY a .meta in the directory\n\nBut I guess they ended up as orphaned meta because they didn\u0027t get purged back when we reverted the data file maybe...","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93c4efbbb7dfc3a131fcb1ba183aed589707f1d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6f13bf52_88aefb0b","updated":"2021-11-19 23:39:21.000000000","message":"Just rebasing to resolve merge conflict.","commit_id":"0d3556eb8d101cb85a0a4545602d21d44ae0bbe1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"441fecb2cd1e8eaff53192ee3ca0c2266b0c0687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"456b6d4b_18c44fae","updated":"2021-11-23 06:30:54.000000000","message":"I\u0027m more confused than ever about how we\u0027re seeing all these dangling .meta files 😕","commit_id":"276e9ecfb1c2e3e492d78a4ed2989a4d38d32f51"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79155cadf977afe4b9e01152ae2519515f3cb90a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ee5f0829_cf6bbd9e","updated":"2021-11-23 17:34:29.000000000","message":"OK, the dangling .meta behavior still seems not-great, but this definitely ought to make that less likely to come up.","commit_id":"dc3dd4964655e686e8f502ddb2ef8b0a1aa0a62b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b7b6afe84c72b3bea4f5f0b31dc5ebdcc2e7ecbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"edcafca5_1f1345fa","updated":"2021-11-30 17:40:54.000000000","message":"Still looks good. Good candidate for backporting, yeah?","commit_id":"ada9f0eeb08368e1956fc5d6197debf1a8a47f8a"}],"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1039cfe6971f1f15fda6904203bd673cb73fd7d9","unresolved":true,"context_lines":[{"line_number":3354,"context_line":"        if meta_timestamp is not None:"},{"line_number":3355,"context_line":"            purge_file \u003d self.manager.make_on_disk_filename("},{"line_number":3356,"context_line":"                meta_timestamp, ext\u003d\u0027.meta\u0027)"},{"line_number":3357,"context_line":"            remove_file(os.path.join(self._datadir, purge_file))"},{"line_number":3358,"context_line":"        if frag_index is not None:"},{"line_number":3359,"context_line":"            # data file may or may not be durable so try removing both filename"},{"line_number":3360,"context_line":"            # possibilities"}],"source_content_type":"text/x-python","patch_set":1,"id":"b18a8ef4_2bc6fa9b","line":3357,"updated":"2021-11-19 13:01:45.000000000","message":"well this part is straight forward at least - kudos","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fd7ff406f51aeceba459f859a413ed51c4da84a5","unresolved":true,"context_lines":[{"line_number":1493,"context_line":"        \"\"\""},{"line_number":1494,"context_line":"        Returns a DiskFile instance for an object at the given"},{"line_number":1495,"context_line":"        object_hash. Just in case someone thinks of refactoring, be"},{"line_number":1496,"context_line":"        sure DiskFileDeleted is *not* raised, but the DiskFile"},{"line_number":1497,"context_line":"        instance representing the tombstoned object is returned"},{"line_number":1498,"context_line":"        instead."},{"line_number":1499,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"53c04c58_3ca25884","line":1496,"range":{"start_line":1496,"start_character":13,"end_line":1496,"end_character":44},"updated":"2021-11-23 01:03:41.000000000","message":"Should we be sure to carry this note to both methods?","commit_id":"0d3556eb8d101cb85a0a4545602d21d44ae0bbe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"15a483b535c425d41a5a9174afa0641074c65eba","unresolved":true,"context_lines":[{"line_number":1493,"context_line":"        \"\"\""},{"line_number":1494,"context_line":"        Returns a DiskFile instance for an object at the given"},{"line_number":1495,"context_line":"        object_hash. Just in case someone thinks of refactoring, be"},{"line_number":1496,"context_line":"        sure DiskFileDeleted is *not* raised, but the DiskFile"},{"line_number":1497,"context_line":"        instance representing the tombstoned object is returned"},{"line_number":1498,"context_line":"        instead."},{"line_number":1499,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8f0b4aa1_2850ff1d","line":1496,"range":{"start_line":1496,"start_character":13,"end_line":1496,"end_character":44},"in_reply_to":"53c04c58_3ca25884","updated":"2021-11-23 13:22:55.000000000","message":"fair point. Done","commit_id":"0d3556eb8d101cb85a0a4545602d21d44ae0bbe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"15a483b535c425d41a5a9174afa0641074c65eba","unresolved":true,"context_lines":[{"line_number":1560,"context_line":"        :returns: an instance of BaseDiskFile"},{"line_number":1561,"context_line":"        \"\"\""},{"line_number":1562,"context_line":"        return self.get_diskfile_and_filenames_from_hash("},{"line_number":1563,"context_line":"            device, partition, object_hash, policy, **kwargs)[0]"},{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    def get_hashes(self, device, partition, suffixes, policy,"},{"line_number":1566,"context_line":"                   skip_rehash\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1d065c13_2a34069b","line":1563,"updated":"2021-11-23 13:22:55.000000000","message":"this is a little clunky but I didn\u0027t find a nice way to break up the method into a sequence of helpers","commit_id":"03cadd99ecf856fbb2e17627bbffa68174e8e344"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3da6ed10f1b17430de4830e319db65f0f8c3290d","unresolved":true,"context_lines":[{"line_number":988,"context_line":"                if job[\u0027primary_frag_index\u0027] is None:"},{"line_number":989,"context_line":"                    # pure handoff node so it\u0027s ok to remove any meta file that"},{"line_number":990,"context_line":"                    # may have been reverted"},{"line_number":991,"context_line":"                    meta_timestamp \u003d timestamps.get(\u0027ts_meta\u0027)"},{"line_number":992,"context_line":"                else:"},{"line_number":993,"context_line":"                    meta_timestamp \u003d None"},{"line_number":994,"context_line":"                df.purge(timestamps[\u0027ts_data\u0027], job[\u0027frag_index\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"c5cc291e_d70f729c","line":991,"updated":"2021-11-19 13:04:31.000000000","message":"oh i read it wrong - we purge the meta UNLESS we have sync job - that\u0027s a little tricky!","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"38a495ffaa2e8c355b45ae5efaf95596359db669","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"                \u0027device\u0027: local_dev[\u0027device\u0027],"},{"line_number":1167,"context_line":"                # provide a hint to revert jobs that the node is a primary for"},{"line_number":1168,"context_line":"                # one of the frag indexes"},{"line_number":1169,"context_line":"                \u0027primary_frag_index\u0027: primary_frag_index,"},{"line_number":1170,"context_line":"            }"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        # aggregate jobs for all the fragment index in this part"}],"source_content_type":"text/x-python","patch_set":1,"id":"aa6a4fa1_39ea4151","line":1169,"updated":"2021-11-19 18:44:43.000000000","message":"Does anything actually care about the index? Or could this alternatively be a boolean has_primary_assignment?","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"15a483b535c425d41a5a9174afa0641074c65eba","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"                \u0027device\u0027: local_dev[\u0027device\u0027],"},{"line_number":1167,"context_line":"                # provide a hint to revert jobs that the node is a primary for"},{"line_number":1168,"context_line":"                # one of the frag indexes"},{"line_number":1169,"context_line":"                \u0027primary_frag_index\u0027: primary_frag_index,"},{"line_number":1170,"context_line":"            }"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        # aggregate jobs for all the fragment index in this part"}],"source_content_type":"text/x-python","patch_set":1,"id":"3e1417a2_b6558434","line":1169,"in_reply_to":"aa6a4fa1_39ea4151","updated":"2021-11-23 13:22:55.000000000","message":"no. I considered going with a boolean \u0027pure_handoff\u0027 but figured that the primary_frag_index might be interesting one day at no more \u0027cost\u0027 today.","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1039cfe6971f1f15fda6904203bd673cb73fd7d9","unresolved":true,"context_lines":[{"line_number":1177,"context_line":"        part_nodes \u003d policy.object_ring.get_part_nodes(partition)"},{"line_number":1178,"context_line":"        for node in part_nodes:"},{"line_number":1179,"context_line":"            if node[\u0027id\u0027] \u003d\u003d local_dev[\u0027id\u0027]:"},{"line_number":1180,"context_line":"                # this partition belongs here, we\u0027ll need a sync job"},{"line_number":1181,"context_line":"                primary_frag_index \u003d policy.get_backend_index(node[\u0027index\u0027])"},{"line_number":1182,"context_line":"                try:"},{"line_number":1183,"context_line":"                    suffixes \u003d data_fi_to_suffixes.pop(primary_frag_index)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a945cf7c_934e80b9","line":1180,"updated":"2021-11-19 13:01:45.000000000","message":"this looks like the only time primary_frag_index is not None - but on sync (as opposed to revert) jobs we don\u0027t do purge?","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"38a495ffaa2e8c355b45ae5efaf95596359db669","unresolved":true,"context_lines":[{"line_number":1236,"context_line":"                # this is an unfortunate situation, we need a revert job to"},{"line_number":1237,"context_line":"                # push partitions off this node, but none of the suffixes"},{"line_number":1238,"context_line":"                # have any data fragments to hint at which node would be a"},{"line_number":1239,"context_line":"                # good candidate to receive the tombstones."},{"line_number":1240,"context_line":"                #"},{"line_number":1241,"context_line":"                # we\u0027ll check a sample of other primaries before we delete our"},{"line_number":1242,"context_line":"                # local tombstones, the exact number doesn\u0027t matter as long as"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd304d2d_e4680c1c","line":1239,"range":{"start_line":1239,"start_character":44,"end_line":1239,"end_character":58},"updated":"2021-11-19 18:44:43.000000000","message":"I wonder if now would be a good time to call out how this code can also hit stranded .meta files.","commit_id":"8220e42d3c8ced1da066aaa5dba05524b30afbd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fd7ff406f51aeceba459f859a413ed51c4da84a5","unresolved":true,"context_lines":[{"line_number":993,"context_line":"                    if f.startswith(timestamps[\u0027ts_data\u0027].internal)]"},{"line_number":994,"context_line":"                if (job[\u0027primary_frag_index\u0027] is None"},{"line_number":995,"context_line":"                        and len(purgable_data_files) \u003c\u003d 1"},{"line_number":996,"context_line":"                        and purgable_data_files \u003d\u003d data_files):"},{"line_number":997,"context_line":"                    # pure handoff node, and we\u0027re about to purge the last"},{"line_number":998,"context_line":"                    # .data file, so it\u0027s ok to remove any meta file that may"},{"line_number":999,"context_line":"                    # have been reverted"}],"source_content_type":"text/x-python","patch_set":4,"id":"82fb8e52_792e88fd","line":996,"updated":"2021-11-23 01:03:41.000000000","message":"The list-equality check feels a little funny (something like\n\n and len(purgable_data_files) \u003d\u003d len(data_files) \u003c\u003d 1\n\nshould work just as well), but I suppose the length of the list should always be *very* short, so it doesn\u0027t really hurt.","commit_id":"276e9ecfb1c2e3e492d78a4ed2989a4d38d32f51"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"15a483b535c425d41a5a9174afa0641074c65eba","unresolved":true,"context_lines":[{"line_number":993,"context_line":"                    if f.startswith(timestamps[\u0027ts_data\u0027].internal)]"},{"line_number":994,"context_line":"                if (job[\u0027primary_frag_index\u0027] is None"},{"line_number":995,"context_line":"                        and len(purgable_data_files) \u003c\u003d 1"},{"line_number":996,"context_line":"                        and purgable_data_files \u003d\u003d data_files):"},{"line_number":997,"context_line":"                    # pure handoff node, and we\u0027re about to purge the last"},{"line_number":998,"context_line":"                    # .data file, so it\u0027s ok to remove any meta file that may"},{"line_number":999,"context_line":"                    # have been reverted"}],"source_content_type":"text/x-python","patch_set":4,"id":"9661f371_902578e7","line":996,"in_reply_to":"82fb8e52_792e88fd","updated":"2021-11-23 13:22:55.000000000","message":"oh yeah, that\u0027s neat","commit_id":"276e9ecfb1c2e3e492d78a4ed2989a4d38d32f51"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"441fecb2cd1e8eaff53192ee3ca0c2266b0c0687","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"                # this is an unfortunate situation, we need a revert job to"},{"line_number":1246,"context_line":"                # push partitions off this node, but none of the suffixes"},{"line_number":1247,"context_line":"                # have any data fragments to hint at which node would be a"},{"line_number":1248,"context_line":"                # good candidate to receive the tombstones."},{"line_number":1249,"context_line":"                #"},{"line_number":1250,"context_line":"                # we\u0027ll check a sample of other primaries before we delete our"},{"line_number":1251,"context_line":"                # local tombstones, the exact number doesn\u0027t matter as long as"}],"source_content_type":"text/x-python","patch_set":4,"id":"8a9023a4_f4aa11ee","line":1248,"range":{"start_line":1248,"start_character":44,"end_line":1248,"end_character":58},"updated":"2021-11-23 06:30:54.000000000","message":"Oh -- we probably ought to make sure we call out dangling .metas here. Though, I\u0027ve got a worry... I thought I got myself a pretty good setup:\n\n* uploaded an object\n* unmounted one of the first two assigned disks\n* ran reconstructor to rebuild to a handoff\n* did a POST to create a .meta\n* remount and check state\n* manually rm the over-replicated .data and its hashes.pkl/hashes.invalid\n* unmount the other disk for that server so we don\u0027t get any cross-talk\n* run the reconstructor just for that one server\n\nThe good news was that everything cleaned up good; starting from  the remount, state looked like https://paste.opendev.org/show/811230/\n\nBad news is that it didn\u0027t seem to actually *talk* to anyone -- tailing logs, all I saw was\n\n Nov 23 05:37:26 saio object-6040: Starting 13899\n Nov 23 05:37:26 saio object-6040: Running object reconstructor in script mode.\n Nov 23 05:37:26 saio object-6040: sdb4 is not mounted\n Nov 23 05:37:26 saio object-6040: Run listdir on /srv/node4/sdb8/objects/191\n Nov 23 05:37:26 saio object-6040: Removing partition: /srv/node4/sdb8/objects/191\n Nov 23 05:37:26 saio object-6040: 1/1 (100.00%) partitions reconstructed in 0.01s (121.42/sec, 0s remaining)\n Nov 23 05:37:26 saio object-6040: Object reconstruction complete (once). (0.00 minutes)\n Nov 23 05:37:26 saio object-6040: Exited 13899\n\nNo REPLICATE requests, no nothing. So why\u0027d we think it was OK to purge? Looks like... hashes comes back looking like {\u0027496\u0027: {}}?? So we nuke the partition. That seems... bad...\n\nApparently during _hash_suffix_dir the ondisk_info comes back\n\n {\u0027obsolete\u0027: [],\n  \u0027frag_sets\u0027: {},\n  \u0027possible_reclaim\u0027: [{\n   \u0027timestamp\u0027: 1637645664.31791_0000000000000000,\n   \u0027ext\u0027: \u0027.meta\u0027,\n   \u0027ctype_timestamp\u0027: None,\n   \u0027frag_index\u0027: None,\n   \u0027filename\u0027: \u00271637645664.31791.meta\u0027}],\n  \u0027data_file\u0027: None,\n  \u0027meta_file\u0027: None,\n  \u0027ts_file\u0027: None,\n  \u0027ctype_file\u0027: None,\n  \u0027files\u0027: [\u00271637645664.31791.meta\u0027]}\n\nand since it goes into possible_reclaim, it doesn\u0027t count towards hashes. Which means that comment about\n\n\u003e If there\u0027s any suffixes in the partition then our job list would have *at least* one revert job.\n\nin reconstruct() probably needs some footnotes.","commit_id":"276e9ecfb1c2e3e492d78a4ed2989a4d38d32f51"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"15a483b535c425d41a5a9174afa0641074c65eba","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"                # this is an unfortunate situation, we need a revert job to"},{"line_number":1246,"context_line":"                # push partitions off this node, but none of the suffixes"},{"line_number":1247,"context_line":"                # have any data fragments to hint at which node would be a"},{"line_number":1248,"context_line":"                # good candidate to receive the tombstones."},{"line_number":1249,"context_line":"                #"},{"line_number":1250,"context_line":"                # we\u0027ll check a sample of other primaries before we delete our"},{"line_number":1251,"context_line":"                # local tombstones, the exact number doesn\u0027t matter as long as"}],"source_content_type":"text/x-python","patch_set":4,"id":"6962fe14_d9cd0029","line":1248,"range":{"start_line":1248,"start_character":44,"end_line":1248,"end_character":58},"in_reply_to":"8a9023a4_f4aa11ee","updated":"2021-11-23 13:22:55.000000000","message":"I agree that some more/improved comments would be very useful. However, I\u0027m not sure exactly what they would be yet and think that the question of \"what happens to dangling metas?\" is related to but separate to this patch which is attempting to avoid dangling metas.\n\nCan we pursue improved comments (and maybe other fixes) separately?\n\nAlso, this comment is related and worth noting:\n\n  # file sets that do not include a .data or .ts\n  # file cannot be opened and therefore cannot\n  # be ssync\u0027d\n\nhttps://github.com/openstack/swift/blob/e3069e6f7e0966ad55b05d3ab7838a4b61fb421c/swift/obj/diskfile.py#L1681-L1685","commit_id":"276e9ecfb1c2e3e492d78a4ed2989a4d38d32f51"}]}
