)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4a15d8571b698a728a22ed101cbd922cc299705c","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"container-updater: demonstrate account stat blockage with probe test"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We have seen account stats become distorted: in worst case an account with"},{"line_number":10,"context_line":"only one container drops to reporting zero bytes and zero object count"},{"line_number":11,"context_line":"despite the container having objects."},{"line_number":12,"context_line":"And can remain stuck until another object is PUT or DELETEd into the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"519e425e_c4d6fbb0","line":9,"updated":"2021-09-30 05:07:18.000000000","message":"Could you make the lines a little shorter?","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42bbbb0b4edbecc913768e18a0e1a4fb7e8ebf3a","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"container-updater: demonstrate account stat blockage with probe test"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We have seen account stats become distorted: in worst case an account with"},{"line_number":10,"context_line":"only one container drops to reporting zero bytes and zero object count"},{"line_number":11,"context_line":"despite the container having objects."},{"line_number":12,"context_line":"And can remain stuck until another object is PUT or DELETEd into the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5cc8ad37_f7b36fa1","line":9,"in_reply_to":"519e425e_c4d6fbb0","updated":"2021-09-30 21:20:06.000000000","message":"good call.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"container-updater: demonstrate account stat blockage with probe test"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We have seen account stats become distorted: in worst case an account with"},{"line_number":10,"context_line":"only one container drops to reporting zero bytes and zero object count"},{"line_number":11,"context_line":"despite the container having objects."},{"line_number":12,"context_line":"And can remain stuck until another object is PUT or DELETEd into the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"cbff12c0_1095148a","line":9,"in_reply_to":"5cc8ad37_f7b36fa1","updated":"2022-02-02 06:21:25.000000000","message":"Done","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d9d3f79df06683e89f2cbdd830ca02ee00c98358","unresolved":true,"context_lines":[{"line_number":29,"context_line":"This patch rolls all this up in a probe test so we have something to"},{"line_number":30,"context_line":"fix."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: Idacc0d80ec1a73bad56696056463deeb075c2171"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f38342c2_a8dd371e","line":32,"updated":"2021-09-30 09:30:42.000000000","message":"launchpad bug https://bugs.launchpad.net/swift/+bug/1945595","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":29,"context_line":"This patch rolls all this up in a probe test so we have something to"},{"line_number":30,"context_line":"fix."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: Idacc0d80ec1a73bad56696056463deeb075c2171"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"24486b34_3f5602d2","line":32,"in_reply_to":"5e9d4f84_0e738838","updated":"2022-02-02 06:21:25.000000000","message":"Done","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42bbbb0b4edbecc913768e18a0e1a4fb7e8ebf3a","unresolved":true,"context_lines":[{"line_number":29,"context_line":"This patch rolls all this up in a probe test so we have something to"},{"line_number":30,"context_line":"fix."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: Idacc0d80ec1a73bad56696056463deeb075c2171"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5e9d4f84_0e738838","line":32,"in_reply_to":"f38342c2_a8dd371e","updated":"2021-09-30 21:20:06.000000000","message":"Will add","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"bd1d262f0dc6a33dcb011ae09e5aa4679732dd0f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"04bb0e22_5021546a","updated":"2021-10-16 04:34:53.000000000","message":"This is better, but I don\u0027t follow the reasoning still.","commit_id":"5f144a4aa4c8a568c5c56e6a8d447b6bf8c4945f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"0f16aea0_e476a491","updated":"2022-02-02 06:21:25.000000000","message":"Just cleaning up some unresolved comments (now that they stick around until they\u0027re resolved). ","commit_id":"4ba904d5253b6dc8d47a56be674884eda1bd5ad1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a6011d58e3f053cce8d9b0c3b74a471146581581","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"76f98a11_5965a067","updated":"2022-02-04 05:34:34.000000000","message":"recheck","commit_id":"4ba904d5253b6dc8d47a56be674884eda1bd5ad1"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"197f6a370c8d65af99ddc09db5f445606a58b2af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"18acab8a_39a220f1","updated":"2022-02-07 23:29:32.000000000","message":"recheck","commit_id":"48b3fa1dd7c9e17b2dcda7eb1248354290b1cc2e"}],"etc/container-server.conf-sample":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9fd0dcce51bb5ed428a5ee95b3b2254166521bd5","unresolved":true,"context_lines":[{"line_number":241,"context_line":"# If you are running a single replica container ring, then you need to enable"},{"line_number":242,"context_line":"# all_update below so any container can update the account rather then just"},{"line_number":243,"context_line":"# containers that have been replicated to."},{"line_number":244,"context_line":"# all_update \u003d no"},{"line_number":245,"context_line":"#"},{"line_number":246,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":247,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"f6f26f48_0d6c0a3e","line":244,"updated":"2021-10-07 21:47:55.000000000","message":"Maybe better named \"update_when_never_replicated\"?","commit_id":"08faa1c5b0766262dbabaa68325987ac92b43192"}],"swift/common/db_replicator.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42638cbb96793cc946da92a5458933b9f9b98c2e","unresolved":true,"context_lines":[{"line_number":975,"context_line":"            # remote node has never synced here before, even though there is"},{"line_number":976,"context_line":"            # nothing to sync let\u0027s mark it in our incoming sync table so we"},{"line_number":977,"context_line":"            # know something has attempted to sync with us."},{"line_number":978,"context_line":"            broker.merge_syncs([data])"},{"line_number":979,"context_line":"        return Response(json.dumps(info))"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"    def merge_syncs(self, broker, args):"}],"source_content_type":"text/x-python","patch_set":6,"id":"30f93280_36c0eb65","line":978,"updated":"2021-10-05 09:04:28.000000000","message":"This came about while fixing a probe failure. We don\u0027t bother updating merge_syncs if they\u0027re the same. And turns out they can be the same so there is chance especially early in a container lifecycle that there is no incoming_sync so.. now I\u0027m adding one if it\u0027s never been seen (or I guess reclaimed out). Should be ok though, they have to be the same _and_ replicating in, so from another primary or a old primary.\n\nNeed some more tests for this me thinks.","commit_id":"6241759637f1f852efd0820937cb800abbee3b74"}],"swift/common/ring/ring.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"b17a6fef8a99d95328026b6696385ddf63634da2","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        return ring_dict"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @classmethod"},{"line_number":173,"context_line":"    def load(cls, filename, metadata_only\u003dFalse, raw_metadata\u003dFalse):"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Load ring data from a file."},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"f42e914b_838acabf","line":173,"range":{"start_line":173,"start_character":49,"end_line":173,"end_character":61},"updated":"2021-10-13 08:58:00.000000000","message":"Looking at this now, this should probably be metadata_raw to match the other name.","commit_id":"9bc4d675c1cc794c7a17a552b256440fa4b61b87"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        return ring_dict"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @classmethod"},{"line_number":173,"context_line":"    def load(cls, filename, metadata_only\u003dFalse, raw_metadata\u003dFalse):"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Load ring data from a file."},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"96036e4a_de48d5f8","line":173,"range":{"start_line":173,"start_character":49,"end_line":173,"end_character":61},"in_reply_to":"f42e914b_838acabf","updated":"2022-02-02 06:21:25.000000000","message":"Ack","commit_id":"9bc4d675c1cc794c7a17a552b256440fa4b61b87"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"b17a6fef8a99d95328026b6696385ddf63634da2","unresolved":true,"context_lines":[{"line_number":197,"context_line":"                ring_data \u003d pickle.load(gz_file)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        if raw_metadata and metadata_only:"},{"line_number":200,"context_line":"            return ring_data"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        if not hasattr(ring_data, \u0027devs\u0027):"},{"line_number":203,"context_line":"            ring_data \u003d RingData(ring_data[\u0027replica2part2dev_id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"d0713349_3162fe6a","line":200,"updated":"2021-10-13 08:58:00.000000000","message":"This should probably be:\n\n  if raw_metadata:\n    return ring_data\n\nAs enabling raw_metadata pretty much means just give me meta_data only. But really just wanted to get something up before the meeting incase it came up.","commit_id":"9bc4d675c1cc794c7a17a552b256440fa4b61b87"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                ring_data \u003d pickle.load(gz_file)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        if raw_metadata and metadata_only:"},{"line_number":200,"context_line":"            return ring_data"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        if not hasattr(ring_data, \u0027devs\u0027):"},{"line_number":203,"context_line":"            ring_data \u003d RingData(ring_data[\u0027replica2part2dev_id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"947cc129_3c99aafe","line":200,"in_reply_to":"d0713349_3162fe6a","updated":"2022-02-02 06:21:25.000000000","message":"Ack","commit_id":"9bc4d675c1cc794c7a17a552b256440fa4b61b87"}],"swift/container/updater.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"64d0a7a30e1b6c9cac3c4297ff379e89acb366f5","unresolved":true,"context_lines":[{"line_number":269,"context_line":"        # out and therefore have outgoing, but nothing should be replicating to"},{"line_number":270,"context_line":"        # it. Further, if a primary does have an incoming sync then we know"},{"line_number":271,"context_line":"        # it\u0027s got details from one other primary. So whether it\u0027s a new one"},{"line_number":272,"context_line":"        # or old it should have a reletively update view"},{"line_number":273,"context_line":"        incoming_syncs \u003d len(broker.get_syncs(incoming\u003dTrue)) \u003e 0"},{"line_number":274,"context_line":"        if incoming_syncs and can_report_info:"},{"line_number":275,"context_line":"            container \u003d \u0027/%s/%s\u0027 % (info[\u0027account\u0027], info[\u0027container\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"19077bf6_2a125b89","line":272,"updated":"2021-10-02 05:03:38.000000000","message":"a relatively up-to-date view (period)","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"cd8b5354bde9d314ebea5dcc21055aaa156a8200","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        # out and therefore have outgoing, but nothing should be replicating to"},{"line_number":270,"context_line":"        # it. Further, if a primary does have an incoming sync then we know"},{"line_number":271,"context_line":"        # it\u0027s got details from one other primary. So whether it\u0027s a new one"},{"line_number":272,"context_line":"        # or old it should have a reletively update view"},{"line_number":273,"context_line":"        incoming_syncs \u003d len(broker.get_syncs(incoming\u003dTrue)) \u003e 0"},{"line_number":274,"context_line":"        if incoming_syncs and can_report_info:"},{"line_number":275,"context_line":"            container \u003d \u0027/%s/%s\u0027 % (info[\u0027account\u0027], info[\u0027container\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c69f2df_5d2344df","line":272,"in_reply_to":"19077bf6_2a125b89","updated":"2021-10-03 22:26:51.000000000","message":"Done","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d635b2431dee2a51023493eb5174a6d857fec6f0","unresolved":true,"context_lines":[{"line_number":270,"context_line":"        # it. Further, if a primary does have an incoming sync then we know"},{"line_number":271,"context_line":"        # it\u0027s got details from one other primary. So whether it\u0027s a new one"},{"line_number":272,"context_line":"        # or old it should have a reletively update view"},{"line_number":273,"context_line":"        incoming_syncs \u003d len(broker.get_syncs(incoming\u003dTrue)) \u003e 0"},{"line_number":274,"context_line":"        if incoming_syncs and can_report_info:"},{"line_number":275,"context_line":"            container \u003d \u0027/%s/%s\u0027 % (info[\u0027account\u0027], info[\u0027container\u0027])"},{"line_number":276,"context_line":"            part, nodes \u003d self.get_account_ring().get_nodes(info[\u0027account\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"239f4159_cb1d944e","line":273,"updated":"2021-10-01 07:42:18.000000000","message":"Probably don\u0027t have to be this specific, ie could get away with:\n\n  incoming_syncs \u003d broker.get_syncs(incoming\u003dTrue)\n\nBut made it more specific whild doing some debugging (it cause it was cause by a falsey problem), which turned out this wasn\u0027t the cause.. but forgot to turn it back.. I guess is doens\u0027t jurt to be specific 😊","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        # it. Further, if a primary does have an incoming sync then we know"},{"line_number":271,"context_line":"        # it\u0027s got details from one other primary. So whether it\u0027s a new one"},{"line_number":272,"context_line":"        # or old it should have a reletively update view"},{"line_number":273,"context_line":"        incoming_syncs \u003d len(broker.get_syncs(incoming\u003dTrue)) \u003e 0"},{"line_number":274,"context_line":"        if incoming_syncs and can_report_info:"},{"line_number":275,"context_line":"            container \u003d \u0027/%s/%s\u0027 % (info[\u0027account\u0027], info[\u0027container\u0027])"},{"line_number":276,"context_line":"            part, nodes \u003d self.get_account_ring().get_nodes(info[\u0027account\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"ae4af19f_ea45f18f","line":273,"in_reply_to":"239f4159_cb1d944e","updated":"2022-02-02 06:21:25.000000000","message":"Ack","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"bd1d262f0dc6a33dcb011ae09e5aa4679732dd0f","unresolved":true,"context_lines":[{"line_number":135,"context_line":"            ring_data \u003d RingData.load(ring_path, metadata_only\u003dTrue,"},{"line_number":136,"context_line":"                                      metadata_raw\u003dTrue)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # If we load up an old pickled ring it might be a RingData obj"},{"line_number":139,"context_line":"            container_replicas \u003d int("},{"line_number":140,"context_line":"                ring_data.get(\"replica_count\", 0)"},{"line_number":141,"context_line":"                if isinstance(ring_data, dict) else ring_data.replica_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"37718974_590a97cf","line":138,"updated":"2021-10-16 04:34:53.000000000","message":"So, why even avoid instantiating the RingData in the first place?","commit_id":"5f144a4aa4c8a568c5c56e6a8d447b6bf8c4945f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3b4fea8afd0964bf8f7585b7ae3acdda781b1d60","unresolved":true,"context_lines":[{"line_number":135,"context_line":"            ring_data \u003d RingData.load(ring_path, metadata_only\u003dTrue,"},{"line_number":136,"context_line":"                                      metadata_raw\u003dTrue)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # If we load up an old pickled ring it might be a RingData obj"},{"line_number":139,"context_line":"            container_replicas \u003d int("},{"line_number":140,"context_line":"                ring_data.get(\"replica_count\", 0)"},{"line_number":141,"context_line":"                if isinstance(ring_data, dict) else ring_data.replica_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"e31b65c5_39681c71","line":138,"in_reply_to":"37718974_590a97cf","updated":"2022-02-02 05:15:59.000000000","message":"Because as soon as it becomes a RingData object the replica_count that was stored in the metadata is thrown away and becomes a property that checks the replica2part2dev table. When only loading with `metadata_only\u003dTrue` the replica2part2dev table isn\u0027t deserialized so the replica_count will be 0 (even though it isn\u0027t).\n\nAn old pickle ring, will always also have the r2p2d table so we can just call the property.\n\nI\u0027ll have a play and see if I can come up with something better.","commit_id":"5f144a4aa4c8a568c5c56e6a8d447b6bf8c4945f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            ring_data \u003d RingData.load(ring_path, metadata_only\u003dTrue,"},{"line_number":136,"context_line":"                                      metadata_raw\u003dTrue)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # If we load up an old pickled ring it might be a RingData obj"},{"line_number":139,"context_line":"            container_replicas \u003d int("},{"line_number":140,"context_line":"                ring_data.get(\"replica_count\", 0)"},{"line_number":141,"context_line":"                if isinstance(ring_data, dict) else ring_data.replica_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a5bfd8a4_446adb1b","line":138,"in_reply_to":"e31b65c5_39681c71","updated":"2022-02-02 06:21:25.000000000","message":"Seems much better just to not throw away the serialised replica_count and use it if the r2p2d table isn\u0027t loaded. That\u0027s what the new patchset does.","commit_id":"5f144a4aa4c8a568c5c56e6a8d447b6bf8c4945f"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d242a19bc814f6463b65101369fff8172b29ef0b","unresolved":true,"context_lines":[{"line_number":294,"context_line":"            # be replicating to it. Further, if a primary does have an"},{"line_number":295,"context_line":"            # incoming sync then we know it\u0027s got details from one other"},{"line_number":296,"context_line":"            # primary. So whether it\u0027s a new one or old it should have a"},{"line_number":297,"context_line":"            # relatively up-to-date view."},{"line_number":298,"context_line":"            incoming_syncs \u003d len(broker.get_syncs(incoming\u003dTrue)) \u003e 0"},{"line_number":299,"context_line":"        if incoming_syncs and can_report_info:"},{"line_number":300,"context_line":"            container \u003d \u0027/%s/%s\u0027 % (info[\u0027account\u0027], info[\u0027container\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"c5192f93_b8111dad","line":297,"updated":"2022-05-02 02:11:26.000000000","message":"I guess a new replica and handoff replicating to it could still have a smaller number though. But at least tightens this edgecase window.","commit_id":"48b3fa1dd7c9e17b2dcda7eb1248354290b1cc2e"}],"test/probe/common.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"64d0a7a30e1b6c9cac3c4297ff379e89acb366f5","unresolved":true,"context_lines":[{"line_number":613,"context_line":"            if path.endswith(\u0027.db\u0027):"},{"line_number":614,"context_line":"                return path"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    def get_broker(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":617,"context_line":"        if container is None:"},{"line_number":618,"context_line":"            return AccountBroker("},{"line_number":619,"context_line":"                self.get_db_file(part, node, account, container))"}],"source_content_type":"text/x-python","patch_set":2,"id":"4b142730_a628ac1b","line":616,"updated":"2021-10-02 05:03:38.000000000","message":"account\u003dNone ... ? When does that happen?","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"cd8b5354bde9d314ebea5dcc21055aaa156a8200","unresolved":false,"context_lines":[{"line_number":613,"context_line":"            if path.endswith(\u0027.db\u0027):"},{"line_number":614,"context_line":"                return path"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    def get_broker(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":617,"context_line":"        if container is None:"},{"line_number":618,"context_line":"            return AccountBroker("},{"line_number":619,"context_line":"                self.get_db_file(part, node, account, container))"}],"source_content_type":"text/x-python","patch_set":2,"id":"10f27891_e12ad456","line":616,"in_reply_to":"4b142730_a628ac1b","updated":"2021-10-03 22:26:51.000000000","message":"cool call, done","commit_id":"d83303bd88f24965d903af552ea61314dd139452"}],"test/probe/test_container_updater.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cbde6e48e9372a89cbbd865058691f711331cb4c","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _make_object_names(self, number, start\u003d0):"},{"line_number":43,"context_line":"        return [\u0027obj%s%04d\u0027 % (self.DELIM, x)"},{"line_number":44,"context_line":"                for x in range(start, start + number)]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_storage_dir(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":47,"context_line":"        account \u003d account or self.brain.account"}],"source_content_type":"text/x-python","patch_set":1,"id":"ec60cd04_a73eb382","line":44,"updated":"2021-09-30 09:26:24.000000000","message":"some of these helper methods look the same as in test_sharder.py - why not move them up to the superclass?","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _make_object_names(self, number, start\u003d0):"},{"line_number":43,"context_line":"        return [\u0027obj%s%04d\u0027 % (self.DELIM, x)"},{"line_number":44,"context_line":"                for x in range(start, start + number)]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_storage_dir(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":47,"context_line":"        account \u003d account or self.brain.account"}],"source_content_type":"text/x-python","patch_set":1,"id":"294adbbb_9be5edf5","line":44,"in_reply_to":"9a33125c_ef0719e8","updated":"2022-02-02 06:21:25.000000000","message":"Done","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42bbbb0b4edbecc913768e18a0e1a4fb7e8ebf3a","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _make_object_names(self, number, start\u003d0):"},{"line_number":43,"context_line":"        return [\u0027obj%s%04d\u0027 % (self.DELIM, x)"},{"line_number":44,"context_line":"                for x in range(start, start + number)]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_storage_dir(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":47,"context_line":"        account \u003d account or self.brain.account"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a33125c_ef0719e8","line":44,"in_reply_to":"ec60cd04_a73eb382","updated":"2021-09-30 21:20:06.000000000","message":"they are, and yes I should do that. I did modify some a little, but yes.. good call.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4a15d8571b698a728a22ed101cbd922cc299705c","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    def get_db_file(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":65,"context_line":"        container_dir, container_hash \u003d self.get_storage_dir("},{"line_number":66,"context_line":"            part, node, account\u003daccount, container\u003dcontainer)"},{"line_number":67,"context_line":"        for f in os.listdir(container_dir):"},{"line_number":68,"context_line":"            path \u003d os.path.join(container_dir, f)"},{"line_number":69,"context_line":"            if path.endswith(\u0027.db\u0027):"},{"line_number":70,"context_line":"                return path"}],"source_content_type":"text/x-python","patch_set":1,"id":"67d14e76_d3f4eb2d","line":67,"updated":"2021-09-30 05:07:18.000000000","message":"What do you think about using _get_db_file_path()? Is that too fine-grained a refactoring and obfuscation?","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42bbbb0b4edbecc913768e18a0e1a4fb7e8ebf3a","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    def get_db_file(self, part, node, account\u003dNone, container\u003dNone):"},{"line_number":65,"context_line":"        container_dir, container_hash \u003d self.get_storage_dir("},{"line_number":66,"context_line":"            part, node, account\u003daccount, container\u003dcontainer)"},{"line_number":67,"context_line":"        for f in os.listdir(container_dir):"},{"line_number":68,"context_line":"            path \u003d os.path.join(container_dir, f)"},{"line_number":69,"context_line":"            if path.endswith(\u0027.db\u0027):"},{"line_number":70,"context_line":"                return path"}],"source_content_type":"text/x-python","patch_set":1,"id":"a06fe74b_079ab7f1","line":67,"in_reply_to":"67d14e76_d3f4eb2d","updated":"2021-09-30 21:20:06.000000000","message":"I\u0027ll take a look, it\u0027s too early and I need to run the kids to school. I ended up changing this because what used to be here didn\u0027t take sharded container db filenames into account... but not that it\u0027s needed for the single probetest in this file.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3422ee26081be8fe81ca75f0ae755b6df2aa3faa","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        # primaries"},{"line_number":108,"context_line":"        for x in self.brain.node_numbers:"},{"line_number":109,"context_line":"            self.updaters.once(number\u003dx)"},{"line_number":110,"context_line":"            self.replicators.once(number\u003dx)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # sanity check"},{"line_number":113,"context_line":"        self.assert_account_object_count(10)"}],"source_content_type":"text/x-python","patch_set":1,"id":"51c80f8b_1153973e","line":110,"updated":"2021-09-30 05:14:03.000000000","message":"Might want to run replicators on primaries, then run updaters on primaries. Otherwise I worry that we might have an object PUT that can update some but not all primaries, and it just so happens that brain.node_numbers[0] was the one that missed it. In that case, it\u0027d send its update, receive some more rows via replication, and race with the handoff to update again on L116.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3b4fea8afd0964bf8f7585b7ae3acdda781b1d60","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        # primaries"},{"line_number":108,"context_line":"        for x in self.brain.node_numbers:"},{"line_number":109,"context_line":"            self.updaters.once(number\u003dx)"},{"line_number":110,"context_line":"            self.replicators.once(number\u003dx)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # sanity check"},{"line_number":113,"context_line":"        self.assert_account_object_count(10)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6bebcaf0_7d370577","line":110,"in_reply_to":"208bae54_2ab6275e","updated":"2022-02-02 05:15:59.000000000","message":"Ack","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"42bbbb0b4edbecc913768e18a0e1a4fb7e8ebf3a","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        # primaries"},{"line_number":108,"context_line":"        for x in self.brain.node_numbers:"},{"line_number":109,"context_line":"            self.updaters.once(number\u003dx)"},{"line_number":110,"context_line":"            self.replicators.once(number\u003dx)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # sanity check"},{"line_number":113,"context_line":"        self.assert_account_object_count(10)"}],"source_content_type":"text/x-python","patch_set":1,"id":"208bae54_2ab6275e","line":110,"in_reply_to":"51c80f8b_1153973e","updated":"2021-09-30 21:20:06.000000000","message":"kk, swapping these is simple enough 😊","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3422ee26081be8fe81ca75f0ae755b6df2aa3faa","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        self.assert_account_object_count(10)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # run the updaters and see what happens"},{"line_number":116,"context_line":"        self.updaters.once()"},{"line_number":117,"context_line":"        self.assert_account_object_count(0)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # And it\u0027s stuck, even if we run replicators and updaters again"}],"source_content_type":"text/x-python","patch_set":1,"id":"ccabfc04_8ae58c68","line":116,"updated":"2021-09-30 05:14:03.000000000","message":"Part of me wants to just stop issuing updates from handoffs... we never expect them to have a complete picture of what\u0027s going on in a container...\n\nWould still have to worry about the rebalance scenario, though, where a PUT makes an empty DB on a primary until replication has a chance to rsync-then-merge over it. I think there\u0027d be an opportunity for the empty DB to send an update and throw off stats before replication.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dfdffecee7441c3ee763330a4adb4cc670815dfd","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        self.assert_account_object_count(10)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # run the updaters and see what happens"},{"line_number":116,"context_line":"        self.updaters.once()"},{"line_number":117,"context_line":"        self.assert_account_object_count(0)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # And it\u0027s stuck, even if we run replicators and updaters again"}],"source_content_type":"text/x-python","patch_set":1,"id":"b3ffec66_c89d2a5b","line":116,"in_reply_to":"ccabfc04_8ae58c68","updated":"2022-02-02 06:21:25.000000000","message":"But if it hasn\u0027t been rsync_then_merged then it wont have any incoming_syncs right, so it wont update. That\u0027s how the current patchset works.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3422ee26081be8fe81ca75f0ae755b6df2aa3faa","unresolved":true,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # run the updaters and see what happens"},{"line_number":116,"context_line":"        self.updaters.once()"},{"line_number":117,"context_line":"        self.assert_account_object_count(0)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # And it\u0027s stuck, even if we run replicators and updaters again"},{"line_number":120,"context_line":"        self.replicators.once()"}],"source_content_type":"text/x-python","patch_set":1,"id":"f6463f8b_7e8b7dba","line":117,"updated":"2021-09-30 05:14:03.000000000","message":"*Ever* having this happen isn\u0027t great -- it\u0027s one thing to be eventually consistent, but quite another to have an accurate state that then *goes backwards in time*. It feels a decent bit like that bug we had in sharding where a failure to get a shard would mean we\u0027d just skip that section of the namespace...","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cbde6e48e9372a89cbbd865058691f711331cb4c","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        self.assert_account_object_count(0)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # And it\u0027s stuck, even if we run replicators and updaters again"},{"line_number":120,"context_line":"        self.replicators.once()"},{"line_number":121,"context_line":"        self.updaters.once()"},{"line_number":122,"context_line":"        self.assert_account_object_count(0)"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6adcd60e_1e40d809","line":120,"updated":"2021-09-30 09:26:24.000000000","message":"the reported_* fields aren\u0027t replicated. If they were then a primary would get the handoff\u0027s reported_object_count of zero and subsequently update the root again with the \u0027correct\u0027 value. But replicating reported_* timestamps might also result in primaries sending more updates after replicating with other primaries. I\u0027m not sure if that is a bad thing though.","commit_id":"673b0479c42b1002cc37706a32f80eca8e335a5a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"64d0a7a30e1b6c9cac3c4297ff379e89acb366f5","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestContainerUpdater, self).setUp()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        self.account_ring \u003d ring.Ring(\u0027/etc/swift/account.ring.gz\u0027)"},{"line_number":30,"context_line":"        self.account_part, self.account_nodes \u003d \\"},{"line_number":31,"context_line":"            self.account_ring.get_nodes(self.account)"},{"line_number":32,"context_line":"        self.container_name \u003d \u0027container%s%s\u0027 % (self.DELIM, uuid4())"}],"source_content_type":"text/x-python","patch_set":2,"id":"bcdc3867_a9b20ea1","line":29,"updated":"2021-10-02 05:03:38.000000000","message":"ProbeTest already has self.account_ring. We inherit it through ReplProbeTest. Why is this necessary? Is it a different ring or I\u0027m missing something?","commit_id":"d83303bd88f24965d903af552ea61314dd139452"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"cd8b5354bde9d314ebea5dcc21055aaa156a8200","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestContainerUpdater, self).setUp()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        self.account_ring \u003d ring.Ring(\u0027/etc/swift/account.ring.gz\u0027)"},{"line_number":30,"context_line":"        self.account_part, self.account_nodes \u003d \\"},{"line_number":31,"context_line":"            self.account_ring.get_nodes(self.account)"},{"line_number":32,"context_line":"        self.container_name \u003d \u0027container%s%s\u0027 % (self.DELIM, uuid4())"}],"source_content_type":"text/x-python","patch_set":2,"id":"9c90f116_f4bcd5ea","line":29,"in_reply_to":"bcdc3867_a9b20ea1","updated":"2021-10-03 22:26:51.000000000","message":"Nope, just completely missed it for some reason, thanks Pete!","commit_id":"d83303bd88f24965d903af552ea61314dd139452"}]}
