)]}'
{"swift/container/backend.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":302,"context_line":"        if shard_data[\u0027reported\u0027] and not existing[\u0027reported\u0027]:"},{"line_number":303,"context_line":"            new_content \u003d True"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    if shard_data[\u0027epoch\u0027] and \\"},{"line_number":306,"context_line":"            Timestamp(shard_data[\u0027epoch\u0027]) \u003e Timestamp(existing[\u0027epoch\u0027] or 0):"},{"line_number":307,"context_line":"        new_content \u003d True"},{"line_number":308,"context_line":"    elif existing[\u0027epoch\u0027] and \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"39b33059_2912042c","line":305,"updated":"2021-03-17 12:02:40.000000000","message":"does shard_data ever not have key \u0027epoch\u0027 - line 298 implies it is always present","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    if shard_data[\u0027epoch\u0027] and \\"},{"line_number":306,"context_line":"            Timestamp(shard_data[\u0027epoch\u0027]) \u003e Timestamp(existing[\u0027epoch\u0027] or 0):"},{"line_number":307,"context_line":"        new_content \u003d True"},{"line_number":308,"context_line":"    elif existing[\u0027epoch\u0027] and \\"},{"line_number":309,"context_line":"            Timestamp(existing[\u0027epoch\u0027]) \u003e Timestamp(shard_data[\u0027epoch\u0027] or 0):"},{"line_number":310,"context_line":"        for k in (\u0027state\u0027, \u0027state_timestamp\u0027, \u0027epoch\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b302e499_3aa34f21","line":307,"updated":"2021-03-17 12:02:40.000000000","message":"so if epoch has moved on, then we take all the new content except metadata which may be taken from the existing and lower, upper, deleted.\n\nso we do take state, state_timestamp, epoch, even if state_timestamp is older?","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":308,"context_line":"    elif existing[\u0027epoch\u0027] and \\"},{"line_number":309,"context_line":"            Timestamp(existing[\u0027epoch\u0027]) \u003e Timestamp(shard_data[\u0027epoch\u0027] or 0):"},{"line_number":310,"context_line":"        for k in (\u0027state\u0027, \u0027state_timestamp\u0027, \u0027epoch\u0027):"},{"line_number":311,"context_line":"            shard_data[k] \u003d existing[k]"},{"line_number":312,"context_line":"    elif (existing[\u0027state_timestamp\u0027] \u003d\u003d shard_data[\u0027state_timestamp\u0027]"},{"line_number":313,"context_line":"            and shard_data[\u0027state\u0027] \u003e existing[\u0027state\u0027]):"},{"line_number":314,"context_line":"        new_content \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ed5502e_f90ccde7","line":311,"updated":"2021-03-17 12:02:40.000000000","message":"but if epoch is less than existing we stick with existing","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":311,"context_line":"            shard_data[k] \u003d existing[k]"},{"line_number":312,"context_line":"    elif (existing[\u0027state_timestamp\u0027] \u003d\u003d shard_data[\u0027state_timestamp\u0027]"},{"line_number":313,"context_line":"            and shard_data[\u0027state\u0027] \u003e existing[\u0027state\u0027]):"},{"line_number":314,"context_line":"        new_content \u003d True"},{"line_number":315,"context_line":"    elif existing[\u0027state_timestamp\u0027] \u003e\u003d shard_data[\u0027state_timestamp\u0027]:"},{"line_number":316,"context_line":"        for k in (\u0027state\u0027, \u0027state_timestamp\u0027, \u0027epoch\u0027):"},{"line_number":317,"context_line":"            shard_data[k] \u003d existing[k]"}],"source_content_type":"text/x-python","patch_set":1,"id":"fca4061f_648bcb71","line":314,"updated":"2021-03-17 12:02:40.000000000","message":"epoch and state_timestamp are the same, take the new is state has moved on\n\nunrelated - should this be explicit about which keys we\u0027re treating as new content???","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        new_content \u003d True"},{"line_number":315,"context_line":"    elif existing[\u0027state_timestamp\u0027] \u003e\u003d shard_data[\u0027state_timestamp\u0027]:"},{"line_number":316,"context_line":"        for k in (\u0027state\u0027, \u0027state_timestamp\u0027, \u0027epoch\u0027):"},{"line_number":317,"context_line":"            shard_data[k] \u003d existing[k]"},{"line_number":318,"context_line":"    else:"},{"line_number":319,"context_line":"        new_content \u003d True"},{"line_number":320,"context_line":"    return new_content"}],"source_content_type":"text/x-python","patch_set":1,"id":"e4ccddac_710a71fe","line":317,"updated":"2021-03-17 12:02:40.000000000","message":"epochs same but existing state timestamp newer, keep existing state etc","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":315,"context_line":"    elif existing[\u0027state_timestamp\u0027] \u003e\u003d shard_data[\u0027state_timestamp\u0027]:"},{"line_number":316,"context_line":"        for k in (\u0027state\u0027, \u0027state_timestamp\u0027, \u0027epoch\u0027):"},{"line_number":317,"context_line":"            shard_data[k] \u003d existing[k]"},{"line_number":318,"context_line":"    else:"},{"line_number":319,"context_line":"        new_content \u003d True"},{"line_number":320,"context_line":"    return new_content"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"094628f4_07c48c70","line":318,"updated":"2021-03-17 12:02:40.000000000","message":"epoch same, new state timestamp is newer, take the new state etc","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cc19fdf804911ed67b07dee77e55ff0a49c25efc","unresolved":true,"context_lines":[{"line_number":410,"context_line":"        if self.db_epoch is None:"},{"line_number":411,"context_line":"            # never been sharded"},{"line_number":412,"context_line":"            return UNSHARDED"},{"line_number":413,"context_line":"        own_sr_epoch \u003d self._own_shard_range().epoch or Timestamp(0)"},{"line_number":414,"context_line":"        if self.db_epoch !\u003d own_sr_epoch.normal:"},{"line_number":415,"context_line":"            return UNSHARDED"},{"line_number":416,"context_line":"        if not self.get_shard_ranges():"}],"source_content_type":"text/x-python","patch_set":1,"id":"fd78ac57_f6916eb1","line":413,"updated":"2021-03-17 12:02:40.000000000","message":"so could own_sr epoch be None? should we just ensure it is always set?\n\noh, I guess the interesting case is if own_sr is defaulted","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"}],"swift/container/sharder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6b85eddedfd4cc2eea86930e43d73f95d08405ef","unresolved":true,"context_lines":[{"line_number":336,"context_line":"            # Ensure acceptor state is ACTIVE (when acceptor is root)"},{"line_number":337,"context_line":"            acceptor.state_timestamp \u003d timestamp"},{"line_number":338,"context_line":"            if acceptor.epoch:"},{"line_number":339,"context_line":"                acceptor.epoch.offset +\u003d 1"},{"line_number":340,"context_line":"        acceptor_ranges.append(acceptor)"},{"line_number":341,"context_line":"    finalize_shrinking(broker, acceptor_ranges, shrinking_ranges, timestamp)"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2d23edcd_fac948c9","line":339,"updated":"2021-03-16 06:12:15.000000000","message":"Somehow I convinced myself we need to be able to now a root has been updated so using the offset, as this will be bigger, but isn\u0027t actually used in the filename epoch... but that was yesterday, and now, maybe because it\u0027s after 5pm the next day, am wondering if it\u0027s strictly needed.","commit_id":"189eba187ed827c6d1d3338c48dba37e650c6f46"}]}
