)]}'
{"test/unit/container/test_sharder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0f6f5398d04342342f374f0092aa310c8ce4308f","unresolved":true,"context_lines":[{"line_number":5779,"context_line":"            dict(delete_timestamp\u003d0,"},{"line_number":5780,"context_line":"                 put_timestamp\u003dnext(self.ts_iter),"},{"line_number":5781,"context_line":"                 status_changed_at\u003dnext(self.ts_iter),"},{"line_number":5782,"context_line":"                 storage_policy_index\u003d3),"},{"line_number":5783,"context_line":"        ]"},{"line_number":5784,"context_line":"        shard_brokers \u003d ["},{"line_number":5785,"context_line":"            self._make_broker(container\u003d\u0027c_%d\u0027 % i,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3c63a867_8e5e1b48","line":5782,"updated":"2021-08-26 03:15:12.000000000","message":"Just out of curiousity, what whould happen when all these roots replicate together:\n  \n  dict(delete_timestamp\u003dT(old recreate),\n     put_timestamp\u003dT(recently PUT),\n     status_changed_at\u003dT(recently PUT),\n     storage_policy_index\u003d3),\n\nIn this case both the reconciler and shards would do the right thing. _and_ the shards current code, would have got there first I guess.","commit_id":"60e3767a0b2b77a05ea0976982cc7dd2342b450d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"18cfc19e1637cbbc76aaef52e5a1e09efc7a1e00","unresolved":true,"context_lines":[{"line_number":5779,"context_line":"            dict(delete_timestamp\u003d0,"},{"line_number":5780,"context_line":"                 put_timestamp\u003dnext(self.ts_iter),"},{"line_number":5781,"context_line":"                 status_changed_at\u003dnext(self.ts_iter),"},{"line_number":5782,"context_line":"                 storage_policy_index\u003d3),"},{"line_number":5783,"context_line":"        ]"},{"line_number":5784,"context_line":"        shard_brokers \u003d ["},{"line_number":5785,"context_line":"            self._make_broker(container\u003d\u0027c_%d\u0027 % i,"}],"source_content_type":"text/x-python","patch_set":2,"id":"affd1830_5dc1345c","line":5782,"in_reply_to":"3c63a867_8e5e1b48","updated":"2021-08-26 09:06:47.000000000","message":"I think status_changed_at would take a new value if the SPI is updated: https://github.com/openstack/swift/blob/bc5f4c061122aee5965cfb055beb3cb079073536/swift/container/replicator.py#L66-L86\n\nIt\u0027s weird though, AFAICT, old recreate wins for policy index and delete timestamp but recently put wins for put_timestamp.\n\nI wonder if we have/need some tests to prove our understanding?","commit_id":"60e3767a0b2b77a05ea0976982cc7dd2342b450d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"afb324fce77a78e5bd46ca5967aa9dcc22d85b62","unresolved":true,"context_lines":[{"line_number":5779,"context_line":"            dict(delete_timestamp\u003d0,"},{"line_number":5780,"context_line":"                 put_timestamp\u003dnext(self.ts_iter),"},{"line_number":5781,"context_line":"                 status_changed_at\u003dnext(self.ts_iter),"},{"line_number":5782,"context_line":"                 storage_policy_index\u003d3),"},{"line_number":5783,"context_line":"        ]"},{"line_number":5784,"context_line":"        shard_brokers \u003d ["},{"line_number":5785,"context_line":"            self._make_broker(container\u003d\u0027c_%d\u0027 % i,"}],"source_content_type":"text/x-python","patch_set":2,"id":"c61345f6_c41ee6ef","line":5782,"in_reply_to":"affd1830_5dc1345c","updated":"2021-08-28 06:35:13.000000000","message":"OK, think I see, according to that code status_changed_at will be updated if the SPI is different and needs to change.\n\nBut it also seems to indicate that we don\u0027t do a sync of status_changed_at during replication, only created_at, delete, and put timestamps. Which seems to indicate to me that the status_changed_at is used more of a \u0027local to the replica\u0027 last_changed_at. So maybe doesn\u0027t really count when it comes to replaying events. So if we take it out of the equiation. Then I\u0027d expect no matter how we replay these root\u0027s on a single container we\u0027d always get the same, if we only ever based on latest timestamps (which we\u0027re currently not doing in the reconciler because it takes latest first unless there is a recreated one, then that wins):\n\n  delete_timestamp \u003d T1\n  put_timestamp \u003d T2\n  created_at \u003d T0 (or maybe T1 as it might have updated the created_at at thre recreate)\n  storage_policy_index \u003d 3\n\nYeah, I think we need some tests and I also love the idea of your axiom 😊","commit_id":"60e3767a0b2b77a05ea0976982cc7dd2342b450d"}]}
