)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9be8cf16709234c54b439786e867c28398e38d4","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix SSYNC failing to replicate unexpired object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix a situation where SSYNC would fail to replicate a valid object because"},{"line_number":10,"context_line":"the datafile contains an exired X-Delete-At information while a metafile"},{"line_number":11,"context_line":"contains no X-Delete-At information. Example:"},{"line_number":12,"context_line":" - 1454619054.02968.data \u003d\u003e contains X-Delete-At: 1454619654"},{"line_number":13,"context_line":" - 1454619056.04876.meta \u003d\u003e does not contain X-Delete-At info"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7ffa3b31_31d87a1c","line":10,"updated":"2017-04-19 14:43:37.000000000","message":"s/exired/expired/","commit_id":"530ae6e53cd0a3a93fe1f6310a874d245df4a98a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9be8cf16709234c54b439786e867c28398e38d4","unresolved":false,"context_lines":[{"line_number":18,"context_line":"the POST fails because the object does not exist (expired)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This commit allows PUT and POST to works so that the object can be replicated."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I919994ead2b20dbb6c5671c208823e8b7f513715"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7ffa3b31_f1de920f","line":21,"updated":"2017-04-19 14:43:37.000000000","message":"needs a Closes-Bug tag","commit_id":"530ae6e53cd0a3a93fe1f6310a874d245df4a98a"}],"swift/obj/diskfile.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8e87c0b3afe2ffe4fbc67eaa46b4f9f5976d2f77","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"    def __init__(self, mgr, device_path, partition,"},{"line_number":1913,"context_line":"                 account\u003dNone, container\u003dNone, obj\u003dNone, _datadir\u003dNone,"},{"line_number":1914,"context_line":"                 policy\u003dNone, use_splice\u003dFalse, pipe_size\u003dNone,"},{"line_number":1915,"context_line":"                 use_linkat\u003dFalse, open_expired\u003dFalse, **kwargs):"},{"line_number":1916,"context_line":"        self._manager \u003d mgr"},{"line_number":1917,"context_line":"        self._device_path \u003d device_path"},{"line_number":1918,"context_line":"        self._logger \u003d mgr.logger"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_271f5f6d","line":1915,"updated":"2017-04-25 10:17:43.000000000","message":"this works, but I had thought open_expired might be an optional arg to open() ?\n\nOIC this also works for methods such as read_metadata that wrap open()","commit_id":"8c5f7d062d929d87e5eeae35b574f56519f6439c"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9be8cf16709234c54b439786e867c28398e38d4","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            orig_metadata \u003d disk_file.read_metadata()"},{"line_number":524,"context_line":"        except DiskFileXattrNotSupported:"},{"line_number":525,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":526,"context_line":"        except DiskFileExpired as err:"},{"line_number":527,"context_line":"            if config_true_value(request.headers.get(\u0027x-backend-replication\u0027,"},{"line_number":528,"context_line":"                                                     \u0027false\u0027)):"},{"line_number":529,"context_line":"                # When there is a meta file, SSYNC first PUT the data file,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_f138d2a0","line":526,"updated":"2017-04-19 14:43:37.000000000","message":"I think I would prefer to make it possible to open a diskfile that is expired without it raising an exception, by passing a flag to the __init__ or to open(). It\u0027s arguably more intuitive (vs knowing that the exception carries the object\u0027s metadata) and would give us a lot more insight into the structure of the metadata (datafile vs metafile metadata) if we ever need it e.g. it may also help with bug https://bugs.launchpad.net/swift/+bug/1652323 where we need to be able to open expired diskfiles on the sender.","commit_id":"530ae6e53cd0a3a93fe1f6310a874d245df4a98a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9be8cf16709234c54b439786e867c28398e38d4","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        if error_response:"},{"line_number":664,"context_line":"            return error_response"},{"line_number":665,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":666,"context_line":"        if (new_delete_at and new_delete_at \u003c time.time()"},{"line_number":667,"context_line":"                and not config_true_value("},{"line_number":668,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027))):"},{"line_number":669,"context_line":"            return HTTPBadRequest(body\u003d\u0027X-Delete-At in past\u0027, request\u003drequest,"},{"line_number":670,"context_line":"                                  content_type\u003d\u0027text/plain\u0027)"},{"line_number":671,"context_line":"        try:"},{"line_number":672,"context_line":"            fsize \u003d request.message_length()"},{"line_number":673,"context_line":"        except ValueError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_91374e4e","line":670,"range":{"start_line":666,"start_character":1,"end_line":670,"end_character":60},"updated":"2017-04-19 14:43:37.000000000","message":"these lines seem redundant (on master and here) because the check is alerady made in check_object_creation()","commit_id":"530ae6e53cd0a3a93fe1f6310a874d245df4a98a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"54abfd76d64a31f2f6316e384d1c45c55fd51132","unresolved":false,"context_lines":[{"line_number":517,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":518,"context_line":"                device, partition, account, container, obj,"},{"line_number":519,"context_line":"                policy\u003dpolicy, open_expired\u003dconfig_true_value("},{"line_number":520,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027false\u0027)))"},{"line_number":521,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":522,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":523,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_6f0e483c","line":520,"updated":"2017-05-31 11:51:18.000000000","message":"NIT: In the contraints you use \u0027f\u0027 and here your using \u0027false\u0027.","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"}],"test/unit/obj/common.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a721c5984af18c49fe9dbdd10e32019baff9d738","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                       account\u003d\u0027a\u0027, container\u003d\u0027c\u0027, obj\u003d\u0027o\u0027, body\u003d\u0027test\u0027,"},{"line_number":76,"context_line":"                       extra_metadata\u003dNone, policy\u003dNone,"},{"line_number":77,"context_line":"                       frag_index\u003dNone, timestamp\u003dNone, df_mgr\u003dNone,"},{"line_number":78,"context_line":"                       commit\u003dTrue, verify\u003dTrue):"},{"line_number":79,"context_line":"        policy \u003d policy or POLICIES.legacy"},{"line_number":80,"context_line":"        object_parts \u003d account, container, obj"},{"line_number":81,"context_line":"        timestamp \u003d Timestamp(time.time()) if timestamp is None else timestamp"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_02ebe812","line":78,"updated":"2017-04-27 02:05:55.000000000","message":"I dont understand why we have a verify. It effectively just mirrors what commit does in this method.\n\nFurther it is only used in tests, the tests can simply change verify\u003dFalse to commit\u003dFalse to do the same thing. So verify seems redundant.","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"599b984e9dc1060a71e93313b7cfd2c2f8197cfa","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                       account\u003d\u0027a\u0027, container\u003d\u0027c\u0027, obj\u003d\u0027o\u0027, body\u003d\u0027test\u0027,"},{"line_number":76,"context_line":"                       extra_metadata\u003dNone, policy\u003dNone,"},{"line_number":77,"context_line":"                       frag_index\u003dNone, timestamp\u003dNone, df_mgr\u003dNone,"},{"line_number":78,"context_line":"                       commit\u003dTrue, verify\u003dTrue):"},{"line_number":79,"context_line":"        policy \u003d policy or POLICIES.legacy"},{"line_number":80,"context_line":"        object_parts \u003d account, container, obj"},{"line_number":81,"context_line":"        timestamp \u003d Timestamp(time.time()) if timestamp is None else timestamp"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_ca487288","line":78,"in_reply_to":"5ff73747_02ebe812","updated":"2017-04-27 08:09:15.000000000","message":"commit is also passed to write_diskfile at line 88\n\nso \n\n  commit -\u003e commit the diskfile (for EC, make it durable)\n  verify -\u003e if committed, then try opening diskfile and check files are sane","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"54abfd76d64a31f2f6316e384d1c45c55fd51132","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                       account\u003d\u0027a\u0027, container\u003d\u0027c\u0027, obj\u003d\u0027o\u0027, body\u003d\u0027test\u0027,"},{"line_number":76,"context_line":"                       extra_metadata\u003dNone, policy\u003dNone,"},{"line_number":77,"context_line":"                       frag_index\u003dNone, timestamp\u003dNone, df_mgr\u003dNone,"},{"line_number":78,"context_line":"                       commit\u003dTrue, verify\u003dTrue):"},{"line_number":79,"context_line":"        policy \u003d policy or POLICIES.legacy"},{"line_number":80,"context_line":"        object_parts \u003d account, container, obj"},{"line_number":81,"context_line":"        timestamp \u003d Timestamp(time.time()) if timestamp is None else timestamp"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_8fb99cea","line":78,"in_reply_to":"5ff73747_ca487288","updated":"2017-05-31 11:51:18.000000000","message":"Oh right, wow, that\u0027s subtle. But yeah I see it now. All thanks to the commit that will be sent on line 88, which would be mean we can\u0027t use simply commit\u003dfalse in the test.","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"}],"test/unit/obj/test_ssync.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8e87c0b3afe2ffe4fbc67eaa46b4f9f5976d2f77","unresolved":false,"context_lines":[{"line_number":1368,"context_line":"            return sender()"},{"line_number":1369,"context_line":""},{"line_number":1370,"context_line":"        # simulate o1 that was PUT with x-delete-at that is now expired but"},{"line_number":1371,"context_line":"        # later had a POST that had no x-delete-at: object should not expire."},{"line_number":1372,"context_line":"        t1 \u003d next(self.ts_iter)"},{"line_number":1373,"context_line":"        obj_name \u003d \u0027o1\u0027"},{"line_number":1374,"context_line":"        metadata \u003d {\u0027X-Delete-At\u0027: \u00270\u0027, \u0027Content-Type\u0027: \u0027plain/text\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_424db970","line":1371,"updated":"2017-04-25 10:17:43.000000000","message":"there\u0027s another scenario that clay has identified with his probe tests, where the receiver has the .data file but not the .meta file.\n\nI\u0027ll leave a diff to add that","commit_id":"8c5f7d062d929d87e5eeae35b574f56519f6439c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a721c5984af18c49fe9dbdd10e32019baff9d738","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"        df \u003d self._make_diskfile("},{"line_number":1411,"context_line":"            obj\u003dobj_name, body\u003dself._get_object_data(\u0027/a/c/%s\u0027 % obj_name),"},{"line_number":1412,"context_line":"            extra_metadata\u003dmetadata, timestamp\u003dt1, policy\u003dpolicy,"},{"line_number":1413,"context_line":"            df_mgr\u003dtx_df_mgr, verify\u003dFalse)"},{"line_number":1414,"context_line":""},{"line_number":1415,"context_line":"        self._check_no_longer_expired_object(obj_name, df, policy)"},{"line_number":1416,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_a2ce74b1","line":1413,"range":{"start_line":1413,"start_character":30,"end_line":1413,"end_character":42},"updated":"2017-04-27 02:05:55.000000000","message":"there is already a commit parameter you can use that does the same thing as verify so:\n\n  commit\u003dFalse\n\ndoes the same thing, so verify should be removed.","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a721c5984af18c49fe9dbdd10e32019baff9d738","unresolved":false,"context_lines":[{"line_number":1426,"context_line":"        df \u003d self._make_diskfile("},{"line_number":1427,"context_line":"            obj\u003dobj_name, body\u003dself._get_object_data(\u0027/a/c/%s\u0027 % obj_name),"},{"line_number":1428,"context_line":"            extra_metadata\u003dmetadata, timestamp\u003dt1, policy\u003dpolicy,"},{"line_number":1429,"context_line":"            df_mgr\u003dtx_df_mgr, verify\u003dFalse)"},{"line_number":1430,"context_line":"        # rx got the .data file but is missing the .meta"},{"line_number":1431,"context_line":"        rx_df \u003d self._make_diskfile("},{"line_number":1432,"context_line":"            obj\u003dobj_name, body\u003dself._get_object_data(\u0027/a/c/%s\u0027 % obj_name),"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_02d40847","line":1429,"range":{"start_line":1429,"start_character":30,"end_line":1429,"end_character":42},"updated":"2017-04-27 02:05:55.000000000","message":"And here","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a721c5984af18c49fe9dbdd10e32019baff9d738","unresolved":false,"context_lines":[{"line_number":1431,"context_line":"        rx_df \u003d self._make_diskfile("},{"line_number":1432,"context_line":"            obj\u003dobj_name, body\u003dself._get_object_data(\u0027/a/c/%s\u0027 % obj_name),"},{"line_number":1433,"context_line":"            extra_metadata\u003dmetadata, timestamp\u003dt1, policy\u003dpolicy,"},{"line_number":1434,"context_line":"            df_mgr\u003drx_df_mgr, verify\u003dFalse)"},{"line_number":1435,"context_line":"        with self.assertRaises(DiskFileExpired):"},{"line_number":1436,"context_line":"            rx_df.open()  # sanity check - expired"},{"line_number":1437,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_22ba6409","line":1434,"range":{"start_line":1434,"start_character":30,"end_line":1434,"end_character":42},"updated":"2017-04-27 02:05:55.000000000","message":"and here","commit_id":"38d35797df1d18d58eed5b537faa3696762c2e2a"}]}
