)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":18,"context_line":"reconstructor visits that handoff partition."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Note that the option only applies to handoff revert jobs, not to sync"},{"line_number":21,"context_line":"jobs."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: If81760c80a4692212e3774e73af5ce37c02e8aff"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"b5876dd4_069fa900","line":21,"updated":"2021-12-01 19:05:54.000000000","message":"👍","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"62be14829c38a6b47ac01e7b31f108d4ab36e4f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fe583376_45b3ddac","updated":"2021-11-16 00:02:09.000000000","message":"I guess both the replicator and the reconstructor have the behavior of only deleting objects that get returned on success from ssync (when the replicator uses rsync the return\u0027d map is empty)\n\nalso, we only configure max_objects_per_sync in the reconstructor\n\nthere\u0027s a little funky handling I think sometimes with EC duplication and remote regions; I wouldn\u0027t mind adding explicit tests for how this feature interacts with those... but also those aren\u0027t features we\u0027re using right now - so this is pretty good as is","commit_id":"16acd15dc11f0983e5b7400492a2ff3567f582f6"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ebb5f7d4e7b6261c56978a503d4b6adbd21924b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9af0b167_a75601d2","updated":"2021-11-17 03:30:41.000000000","message":"OK so I went and populated a VSAIO. Found a suffix that had 2 objects on one of my nodes and removed the second one (because ssync is doing by the suffix):\n\n  vagrant@saio1:~$ ls /srv/node1/sdb5/objects-1/953/204/\n  ee5a66c038d1748e55cebec93c3db204  ee6a0186d180c8b631832e3d4da0f204\n  vagrant@saio1:~$ rm -Rf /srv/node1/sdb5/objects-1/953/204/ee6a0186d180c8b631832e3d4da0f204\n  vagrant@saio1:~$ ls /srv/node1/sdb5/objects-1/953/204/\n  ee5a66c038d1748e55cebec93c3db204\n\nSet the max_objects_per_sync to 1.. so in theory this frag can never be rebuilt, becuase it exists outside the max_objects_per_sync, and it doesn\u0027t continue where it left off.\n\nTried to rebuild it, twice:\n\n  vagrant@saio1:~$ swift-init once object-reconstructor\n  WARNING: Unable to modify max process limit.  Running as non-root?\n  Running object-reconstructor once...(/etc/swift/object-server/1.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/2.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/3.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/4.conf.d)\n  Nov 17 03:23:48 saio1 object-6040[853]: ssync missing_check truncated after 1 objects: device: sdb8, \n  part: 953, policy: 1, last object hash: ee5a66c038d1748e55cebec93c3db204\n  vagrant@saio1:~$ swift-init once object-reconstructor\n  WARNING: Unable to modify max process limit.  Running as non-root?\n  Running object-reconstructor once...(/etc/swift/object-server/1.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/2.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/3.conf.d)\n  Running object-reconstructor once...(/etc/swift/object-server/4.conf.d)\n  Nov 17 03:24:54 saio1 object-6040[998]: ssync missing_check truncated after 1 objects: device: sdb8, \n  part: 953, policy: 1, last object hash: ee5a66c038d1748e55cebec93c3db204\n\nAnd it stopped at the same object both times so the reciever (one which had it missing) never saw the senders object to request it.\n\nStill missing:\n\n  vagrant@saio1:~$ ls /srv/node1/sdb5/objects-1/953/204/\n  ee5a66c038d1748e55cebec93c3db204\n","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2f3ba707fed90d12c409550b302eb24f31f5c280","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e9544735_b6e3acfd","updated":"2021-11-17 02:23:20.000000000","message":"Yup totally need something like this, especially when we may be limitted on replication timeouts.\n\nI have 2 worries, because your checking on the sender missing_check, it\u0027ll always stop at the same point (unless there are handoffs that will be removed).\n\nThe other worry I have is that this really further diverges from the idea of waiting for a replication or recontruction cycle before a ring rebalance (which isn\u0027t strickly true, but what people tend to use)... so in essence, there could be multpile cycles for a complete reconsturction run.. and how do we make that known.\n\nI kinda want to add something like a completed\u003dyes|no|errors to recon for replication and reconstruction cycles or something (if possible), to make it obvious that the cycle isn\u0027t finished.. or maybe we need to change the whole wait for a cycle, and move to a wait for \"all\" handoffs. (ie turn the whole thing on it\u0027s head).\n\nMaybe we need a \"still_has_handoffs\" in recon.","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac40f353975d4a3c0f16e6e3159a2a04baabe514","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ca3240c3_3520143c","updated":"2021-11-17 09:38:25.000000000","message":"good catch @Matt re. sync jobs, where we need to send all objects in missing check every time","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5733fdc8eb8339b495f97e8e1e2b275d70cea797","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e1a81fbd_d8e0c500","updated":"2021-11-16 15:17:40.000000000","message":"recheck\n\nERROR: Package \u0027oslo.cache\u0027 requires a different Python: 2.7.17 not in \u0027\u003e\u003d3.6\u0027\n\n^ i\u0027m not sure how big of a problem this is going to be","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"38d15089e21c0cb19bd257795892bf608ae9a029","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"de21c750_17844393","updated":"2021-11-19 04:16:57.000000000","message":"Reloaded up a VSAIO with enought EC objects to get more then 1 object in a suffix again, deleted a later one in the listing. Set my max_objects_per_sync \u003d 1 again and then ran the reconstuctor. And it\u0027s working again, so not breaking SYNC \u003e max_object_per_sync egecases.\n\nSo looks good. We probably should update the DOC, so whether you want to do that here, or as a follow up doesn\u0027t bother me.\n\nGreat work! ","commit_id":"5259ada4c4cc6447a0ea1b4b1fb62fe039c4893a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4c8e86c0772cac753b84bc122f914631e86bda5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c3673a87_41f2680a","updated":"2021-11-19 09:26:29.000000000","message":"Thanks @Matt, completely agree re docs. Let\u0027s see if this proves helpful in production and if so I will tidy up and remove my -2.","commit_id":"5259ada4c4cc6447a0ea1b4b1fb62fe039c4893a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"766927f6_e82ec717","updated":"2021-12-01 19:05:54.000000000","message":"I think the rename worked out well - the ability to revert smaller batches per connection (and actually have some success and do some unlinks) was a big win when we were having trouble with ssync throughput/timeouts ","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3b9ab0873ab56e58c67aee367e4570d27176830","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0c3301d1_42e13c78","updated":"2021-12-03 21:58:18.000000000","message":"I wonder a little if the replicator could benefit from a similar option -- it doesn\u0027t impact *us* much, since we\u0027re running rsync, though.","commit_id":"8ee631cceeac560cc272693b4a70567a271f2754"}],"etc/object-server.conf-sample":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"38d15089e21c0cb19bd257795892bf608ae9a029","unresolved":true,"context_lines":[{"line_number":443,"context_line":"# remaining objects will remain in the sender partition and will not be sync\u0027d"},{"line_number":444,"context_line":"# until the next call to ssync.Sender, which would currently be the next time"},{"line_number":445,"context_line":"# the reconstructor visits that partition. A value of 0 (the default) means"},{"line_number":446,"context_line":"# there is no limit."},{"line_number":447,"context_line":"# max_objects_per_sync \u003d 0"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"[object-updater]"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"91875ab5_992a7fe3","line":446,"updated":"2021-11-19 04:16:57.000000000","message":"This could mention that it only applies to REVERT, but wont make that a hard blocker, because we may want to work on making it _also_ work on SYNC.\n\nIf this is going the live here should it also live in config guide doc too.","commit_id":"5259ada4c4cc6447a0ea1b4b1fb62fe039c4893a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3b9ab0873ab56e58c67aee367e4570d27176830","unresolved":true,"context_lines":[{"line_number":382,"context_line":"# rebuild_handoff_node_count \u003d 2"},{"line_number":383,"context_line":"#"},{"line_number":384,"context_line":"# By default the reconstructor attempts to revert all objects from handoff"},{"line_number":385,"context_line":"# partitions in a single batch using a single SSYNC request. In exceptional"},{"line_number":386,"context_line":"# circumstances max_objects_per_revert can be used to temporarily limit the"},{"line_number":387,"context_line":"# number of objects reverted by each reconstructor revert type job. If more"},{"line_number":388,"context_line":"# than max_objects_per_revert are available in a sender\u0027s handoff partition,"},{"line_number":389,"context_line":"# the remaining objects will remain in the handoff partition and will not be"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"95d4437f_08c031d1","line":386,"range":{"start_line":385,"start_character":61,"end_line":386,"end_character":15},"updated":"2021-12-03 21:58:18.000000000","message":"Might be worth calling out that these circumstances likely overlap with the circumstances that might prompt one to enable handoffs_only. Or maybe handoffs_only should make reference to this option?","commit_id":"8ee631cceeac560cc272693b4a70567a271f2754"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"377b4838a790c9b8435915ecda47c0027e9d7f1d","unresolved":true,"context_lines":[{"line_number":1045,"context_line":"            # ssync any out-of-sync suffixes with the remote node"},{"line_number":1046,"context_line":"            success, _ \u003d ssync_sender("},{"line_number":1047,"context_line":"                self, node, job, suffixes, include_non_durable\u003dFalse,"},{"line_number":1048,"context_line":"                max_objects_per_sync\u003dself.max_objects_per_sync)()"},{"line_number":1049,"context_line":"            # update stats for this attempt"},{"line_number":1050,"context_line":"            self.suffix_sync +\u003d len(suffixes)"},{"line_number":1051,"context_line":"            self.logger.update_stats(\u0027suffix.syncs\u0027, len(suffixes))"}],"source_content_type":"text/x-python","patch_set":2,"id":"207be0e3_fea59957","line":1048,"updated":"2021-11-17 04:08:09.000000000","message":"As this stands we may want to always use unlimited for a normal sync. Stopping every max_objects_per_sync only really works on a handoff where every object in the suffix are REVERT jobs and so will be removed, and therefore progress would be made.\n\nIn a normal sync round, the same set of suffix objects will always be there, so we\u0027ll just keep visiting the same again and again.\n\nSo this need to be removed or changed to a 0 (unlimited)","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":1065,"context_line":"            # cycle"},{"line_number":1066,"context_line":"            success, _ \u003d ssync_sender("},{"line_number":1067,"context_line":"                self, node, job, suffixes, include_non_durable\u003dFalse,"},{"line_number":1068,"context_line":"                max_objects\u003d0)()"},{"line_number":1069,"context_line":"            # update stats for this attempt"},{"line_number":1070,"context_line":"            self.suffix_sync +\u003d len(suffixes)"},{"line_number":1071,"context_line":"            self.logger.update_stats(\u0027suffix.syncs\u0027, len(suffixes))"}],"source_content_type":"text/x-python","patch_set":7,"id":"8791a242_27475a6d","line":1068,"updated":"2021-12-01 19:05:54.000000000","message":"right, sync is always unlimited 👍","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":1101,"context_line":"                if syncd_with \u003e\u003d len(job[\u0027sync_to\u0027]):"},{"line_number":1102,"context_line":"                    self.delete_reverted_objs(job, reverted_objs)"},{"line_number":1103,"context_line":"                else:"},{"line_number":1104,"context_line":"                    self.handoffs_remaining +\u003d 1"},{"line_number":1105,"context_line":"        except PartitionLockTimeout:"},{"line_number":1106,"context_line":"            self.logger.info(\"Unable to lock handoff partition %d for revert \""},{"line_number":1107,"context_line":"                             \"on device %s policy %d\","}],"source_content_type":"text/x-python","patch_set":7,"id":"7818292d_75d3236c","line":1104,"updated":"2021-12-01 19:05:54.000000000","message":"I wonder if this shouldn\u0027t be incremented when the in_sync_objs were truncated by max_objects","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8e04de139abbb86fb0b80107f33f95dfa2cbb560","unresolved":true,"context_lines":[{"line_number":1101,"context_line":"                if syncd_with \u003e\u003d len(job[\u0027sync_to\u0027]):"},{"line_number":1102,"context_line":"                    self.delete_reverted_objs(job, reverted_objs)"},{"line_number":1103,"context_line":"                else:"},{"line_number":1104,"context_line":"                    self.handoffs_remaining +\u003d 1"},{"line_number":1105,"context_line":"        except PartitionLockTimeout:"},{"line_number":1106,"context_line":"            self.logger.info(\"Unable to lock handoff partition %d for revert \""},{"line_number":1107,"context_line":"                             \"on device %s policy %d\","}],"source_content_type":"text/x-python","patch_set":7,"id":"7880dfef_58287b92","line":1104,"in_reply_to":"7818292d_75d3236c","updated":"2021-12-03 22:12:14.000000000","message":"Ooh, I\u0027d missed that, though -- good eye! But it looks like we can land https://review.opendev.org/c/openstack/swift/+/820387/ in short order.","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2d392326858b9ed5fb8b9f2e3974c5d7547f660e","unresolved":true,"context_lines":[{"line_number":1101,"context_line":"                if syncd_with \u003e\u003d len(job[\u0027sync_to\u0027]):"},{"line_number":1102,"context_line":"                    self.delete_reverted_objs(job, reverted_objs)"},{"line_number":1103,"context_line":"                else:"},{"line_number":1104,"context_line":"                    self.handoffs_remaining +\u003d 1"},{"line_number":1105,"context_line":"        except PartitionLockTimeout:"},{"line_number":1106,"context_line":"            self.logger.info(\"Unable to lock handoff partition %d for revert \""},{"line_number":1107,"context_line":"                             \"on device %s policy %d\","}],"source_content_type":"text/x-python","patch_set":7,"id":"fb5a3841_a7124c4d","line":1104,"in_reply_to":"7880dfef_58287b92","updated":"2021-12-06 01:39:13.000000000","message":"+1 this is fixed in the follow up, and the follow up is ready to land. So I say we just land both :) (or merge the 2 and then land one but we already have a bunch of +2s on both so land land)","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2f3ba707fed90d12c409550b302eb24f31f5c280","unresolved":true,"context_lines":[{"line_number":326,"context_line":"                    \u0027device: %s, part: %s, policy: %s, last object hash: %s\u0027,"},{"line_number":327,"context_line":"                    nlines, self.job[\u0027device\u0027], self.job[\u0027partition\u0027],"},{"line_number":328,"context_line":"                    int(self.job[\u0027policy\u0027]), object_hash)"},{"line_number":329,"context_line":"                break"},{"line_number":330,"context_line":"        with exceptions.MessageTimeout("},{"line_number":331,"context_line":"                self.daemon.node_timeout, \u0027missing_check end\u0027):"},{"line_number":332,"context_line":"            msg \u003d b\u0027:MISSING_CHECK: END\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"958ee6b3_93d8da91","line":329,"updated":"2021-11-17 02:23:20.000000000","message":"This is cool, but out of curiousity, what happens on the next cycle? Wont we happen to stop at the same place again?\n\nAren\u0027t we in the sender missing_check, where it\u0027s sending _everything_ it has in the partition,  and only after this look listening tothe reciever to see what it needs?\n\nDoes this mean it\u0027ll never proceed?","commit_id":"32abcacbff30208cff12211e57af1fed978a1c3f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    \u0027ssync missing_check truncated after %d objects: \u0027"},{"line_number":326,"context_line":"                    \u0027device: %s, part: %s, policy: %s, last object hash: %s\u0027,"},{"line_number":327,"context_line":"                    nlines, self.job[\u0027device\u0027], self.job[\u0027partition\u0027],"},{"line_number":328,"context_line":"                    int(self.job[\u0027policy\u0027]), object_hash)"},{"line_number":329,"context_line":"                break"},{"line_number":330,"context_line":"        with exceptions.MessageTimeout("},{"line_number":331,"context_line":"                self.daemon.node_timeout, \u0027missing_check end\u0027):"}],"source_content_type":"text/x-python","patch_set":7,"id":"4ef83494_e974a357","line":328,"updated":"2021-12-01 19:05:54.000000000","message":"I\u0027m thinking having this log level at debug (and the lack of any other metrics/statsd) leaves us with not a lot of visibility","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9ce188b4751e2ba156303c0e3af3f6b3a2689d4d","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    \u0027ssync missing_check truncated after %d objects: \u0027"},{"line_number":326,"context_line":"                    \u0027device: %s, part: %s, policy: %s, last object hash: %s\u0027,"},{"line_number":327,"context_line":"                    nlines, self.job[\u0027device\u0027], self.job[\u0027partition\u0027],"},{"line_number":328,"context_line":"                    int(self.job[\u0027policy\u0027]), object_hash)"},{"line_number":329,"context_line":"                break"},{"line_number":330,"context_line":"        with exceptions.MessageTimeout("},{"line_number":331,"context_line":"                self.daemon.node_timeout, \u0027missing_check end\u0027):"}],"source_content_type":"text/x-python","patch_set":7,"id":"a6549543_bc87f14f","line":328,"in_reply_to":"4ef83494_e974a357","updated":"2021-12-03 12:43:41.000000000","message":"good point. I will bump this to info as an immediate fix but investigate better reporting of truncation in a follow up","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3b9ab0873ab56e58c67aee367e4570d27176830","unresolved":true,"context_lines":[{"line_number":144,"context_line":"    \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def __init__(self, daemon, node, job, suffixes, remote_check_objs\u003dNone,"},{"line_number":147,"context_line":"                 include_non_durable\u003dFalse, max_objects\u003d0):"},{"line_number":148,"context_line":"        self.daemon \u003d daemon"},{"line_number":149,"context_line":"        self.df_mgr \u003d self.daemon._df_router[job[\u0027policy\u0027]]"},{"line_number":150,"context_line":"        self.node \u003d node"}],"source_content_type":"text/x-python","patch_set":8,"id":"dc1b4037_5b732880","line":147,"updated":"2021-12-03 21:58:18.000000000","message":"OK, so this *only* applies to reconstructor, and replicator always gets this default to send everything, whether for a primary or handoff part.","commit_id":"8ee631cceeac560cc272693b4a70567a271f2754"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"62be14829c38a6b47ac01e7b31f108d4ab36e4f3","unresolved":true,"context_lines":[{"line_number":1426,"context_line":"                      dev[\u0027replication_port\u0027] \u003d\u003d"},{"line_number":1427,"context_line":"                      self.reconstructor.port]"},{"line_number":1428,"context_line":"        partition \u003d (local_devs[0][\u0027id\u0027] + 1) % 3"},{"line_number":1429,"context_line":"        # 2 durable objects"},{"line_number":1430,"context_line":"        df_0 \u003d self._create_diskfile("},{"line_number":1431,"context_line":"            object_name\u003d\u0027zero\u0027, part\u003dpartition)"},{"line_number":1432,"context_line":"        datafile_0 \u003d df_0.manager.cleanup_ondisk_files("}],"source_content_type":"text/x-python","patch_set":1,"id":"f41bb2b4_63febe44","line":1429,"updated":"2021-11-16 00:02:09.000000000","message":"0, 1, 2 - maybe... \"3\"???","commit_id":"16acd15dc11f0983e5b7400492a2ff3567f582f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"62be14829c38a6b47ac01e7b31f108d4ab36e4f3","unresolved":true,"context_lines":[{"line_number":1459,"context_line":"            self.assertEqual(REVERT, context[\u0027job\u0027][\u0027job_type\u0027])"},{"line_number":1460,"context_line":"            self.assertEqual(2, context.get(\u0027max_objects_per_sync\u0027))"},{"line_number":1461,"context_line":"        actual_datafiles \u003d [df for df in datafiles if os.path.exists(df)]"},{"line_number":1462,"context_line":"        self.assertEqual(1, len(actual_datafiles), actual_datafiles)"},{"line_number":1463,"context_line":""},{"line_number":1464,"context_line":"        # ...until next reconstructor run which will sync and purge the last"},{"line_number":1465,"context_line":"        # object"}],"source_content_type":"text/x-python","patch_set":1,"id":"f340a745_a5bb20cc","line":1462,"updated":"2021-11-16 00:02:09.000000000","message":"ok, i guess that\u0027s probably good enough","commit_id":"16acd15dc11f0983e5b7400492a2ff3567f582f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":1108,"context_line":"        \"\"\""},{"line_number":1109,"context_line":"        class _fake_ssync(object):"},{"line_number":1110,"context_line":"            def __init__(self, daemon, node, job, suffixes,"},{"line_number":1111,"context_line":"                         include_non_durable\u003dFalse, max_objects\u003d0,"},{"line_number":1112,"context_line":"                         **kwargs):"},{"line_number":1113,"context_line":"                # capture context and generate an available_map of objs"},{"line_number":1114,"context_line":"                context \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"e106c933_936172c0","line":1111,"updated":"2021-12-01 19:05:54.000000000","message":"i somehow noticed on an earlier draft the fake\u0027s kwarg was called \"max_objects_per_revert\" - but this looks correct","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9ce188b4751e2ba156303c0e3af3f6b3a2689d4d","unresolved":true,"context_lines":[{"line_number":1108,"context_line":"        \"\"\""},{"line_number":1109,"context_line":"        class _fake_ssync(object):"},{"line_number":1110,"context_line":"            def __init__(self, daemon, node, job, suffixes,"},{"line_number":1111,"context_line":"                         include_non_durable\u003dFalse, max_objects\u003d0,"},{"line_number":1112,"context_line":"                         **kwargs):"},{"line_number":1113,"context_line":"                # capture context and generate an available_map of objs"},{"line_number":1114,"context_line":"                context \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"cbfe6eee_7e5ae249","line":1111,"in_reply_to":"e106c933_936172c0","updated":"2021-12-03 12:43:41.000000000","message":"yeah, I dropped per_revert when passing to ssync because \u0027revert\u0027 vs\u0027 sync\u0027 has no meaning to ssync","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        # sanity check that some files should were deleted"},{"line_number":1221,"context_line":"        self.assertGreater(n_files, n_files_after)"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"    def test_max_object_per_sync_revert_only(self):"},{"line_number":1224,"context_line":"        # verify max_objects_per_revert option is only passed to revert jobs"},{"line_number":1225,"context_line":"        ssync_calls \u003d []"},{"line_number":1226,"context_line":"        conf \u003d dict(self.conf, max_objects_per_revert\u003d2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"0a2de552_1868316c","line":1223,"updated":"2021-12-01 19:05:54.000000000","message":"\"max_object_per_ ... SYNC\" ???","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9ce188b4751e2ba156303c0e3af3f6b3a2689d4d","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        # sanity check that some files should were deleted"},{"line_number":1221,"context_line":"        self.assertGreater(n_files, n_files_after)"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"    def test_max_object_per_sync_revert_only(self):"},{"line_number":1224,"context_line":"        # verify max_objects_per_revert option is only passed to revert jobs"},{"line_number":1225,"context_line":"        ssync_calls \u003d []"},{"line_number":1226,"context_line":"        conf \u003d dict(self.conf, max_objects_per_revert\u003d2)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fce04df2_509b03b5","line":1223,"in_reply_to":"0a2de552_1868316c","updated":"2021-12-03 12:43:41.000000000","message":"ugh. will fix.","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2d392326858b9ed5fb8b9f2e3974c5d7547f660e","unresolved":true,"context_lines":[{"line_number":1459,"context_line":"                      dev[\u0027replication_port\u0027] \u003d\u003d"},{"line_number":1460,"context_line":"                      self.reconstructor.port]"},{"line_number":1461,"context_line":"        partition \u003d (local_devs[0][\u0027id\u0027] + 1) % 3"},{"line_number":1462,"context_line":"        # 2 durable objects"},{"line_number":1463,"context_line":"        df_0 \u003d self._create_diskfile("},{"line_number":1464,"context_line":"            object_name\u003d\u0027zero\u0027, part\u003dpartition)"},{"line_number":1465,"context_line":"        datafile_0 \u003d df_0.manager.cleanup_ondisk_files("}],"source_content_type":"text/x-python","patch_set":8,"id":"d7211bdb_7fbdfadb","line":1462,"updated":"2021-12-06 01:39:13.000000000","message":"NIT, there are actaully 3, but I know you fix this in the follow up so can be left.","commit_id":"8ee631cceeac560cc272693b4a70567a271f2754"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"62be14829c38a6b47ac01e7b31f108d4ab36e4f3","unresolved":true,"context_lines":[{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        # max_objects_per_sync \u003c number that would yield"},{"line_number":945,"context_line":"        self.sender \u003d ssync_sender.Sender(self.daemon, None, self.job, None,"},{"line_number":946,"context_line":"                                          max_objects_per_sync\u003d2)"},{"line_number":947,"context_line":""},{"line_number":948,"context_line":"        connection \u003d FakeConnection()"},{"line_number":949,"context_line":"        self.sender.job \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"122e0af0_34775dc9","line":946,"updated":"2021-11-16 00:02:09.000000000","message":"this test is pretty good - i like how it\u0027s really easy to see the hashes and the wire","commit_id":"16acd15dc11f0983e5b7400492a2ff3567f582f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c67ca4fbec53a711103f6ca3732bf749ca512528","unresolved":true,"context_lines":[{"line_number":931,"context_line":"                    {\u0027ts_data\u0027: Timestamp(1380144472.22222),"},{"line_number":932,"context_line":"                     \u0027ts_meta\u0027: Timestamp(1380144473.22222)})"},{"line_number":933,"context_line":"                yield ("},{"line_number":934,"context_line":"                    \u00279d41d8cd98f00b204e9800998ecf1def\u0027,"},{"line_number":935,"context_line":"                    {\u0027ts_data\u0027: Timestamp(1380144474.44444),"},{"line_number":936,"context_line":"                     \u0027ts_ctype\u0027: Timestamp(1380144474.44448),"},{"line_number":937,"context_line":"                     \u0027ts_meta\u0027: Timestamp(1380144475.44444)})"}],"source_content_type":"text/x-python","patch_set":7,"id":"34f60970_599d899c","line":934,"updated":"2021-12-01 19:05:54.000000000","message":"f *1* def","commit_id":"b7b1db7a6b9c80be5ea2d7261ebe68898c7a2a00"}]}
