)]}'
{"test/probe/test_object_expirer.py":[{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"9cf57eb5884597fcd21981ba755e7decdeb113d7","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        #   \u003c T(expirer_executed)"},{"line_number":136,"context_line":"        # Recreated obj should be appeared in any split brain case"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        obj_brain.put_container()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # T(obj_deleted with x-delete-at)"},{"line_number":141,"context_line":"        # object-server accepts req only if X-Delete-At is later than \u0027now\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_c28307cb","line":138,"updated":"2016-05-14 00:04:40.000000000","message":"obj_brain.put_container(int(self.policy))\n\nBrainSplitter creates container with a random policy (I do not know why). When I modified as above, I do not see the random error.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"383cb543ebaa3567b0d6f784384ce03f00e7b0eb","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        #   \u003c T(expirer_executed)"},{"line_number":136,"context_line":"        # Recreated obj should be appeared in any split brain case"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        obj_brain.put_container()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # T(obj_deleted with x-delete-at)"},{"line_number":141,"context_line":"        # object-server accepts req only if X-Delete-At is later than \u0027now\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_56d4e21e","line":138,"in_reply_to":"dab17558_c28307cb","updated":"2016-05-16 05:16:43.000000000","message":"Ah, you mean. That\u0027s why Alistiar got an error with EC policy. self.policy must be a Replication policy due to BaseReplTestCase requirements but put_container doesn\u0027t see the requirements.\n\nI think the better solution is to make BrainSplitter to use the policy assigned at initiation if the arg skipped. Will try to do it but thanks for your suggestion.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f48ec6f53ff5288e22f7a4d8c3dfd2c1972ac78","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        delete_at \u003d int(time.time() + 2.0)"},{"line_number":144,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Delete-At\u0027: delete_at})"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        # some object servers stopped"},{"line_number":147,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_2fc92a7a","line":146,"updated":"2016-05-13 16:40:58.000000000","message":"could you add a comment explaining why we need to stop some obj servers - it took me a while to realise that the expirer tombstone would only be created if the original object was in place due to the x-if-delete-at header.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"383cb543ebaa3567b0d6f784384ce03f00e7b0eb","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        delete_at \u003d int(time.time() + 2.0)"},{"line_number":144,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Delete-At\u0027: delete_at})"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        # some object servers stopped"},{"line_number":147,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_161b7a74","line":146,"in_reply_to":"dab17558_2fc92a7a","updated":"2016-05-16 05:16:43.000000000","message":"ok, will add. This is from too complicated code in the diskfile. The reason we need to stop the object servers is if the correct overwritten object which doesn\u0027t have x-delete-at metadata is there, the expirer\u0027s delete will be failed as 412.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f48ec6f53ff5288e22f7a4d8c3dfd2c1972ac78","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"},{"line_number":150,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":151,"context_line":"        time.sleep(3)"},{"line_number":152,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # make sure auto-created containers get in the account listing"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_4f20ee49","line":151,"updated":"2016-05-13 16:40:58.000000000","message":"An alternative approach (and more predictable avoiding sleeps) would be to use the internal client to PUT objects. The internal client is available (self.client) and allows X-Timestamp to pass through (that is how the expirer fix manages to work).\n\nsee http://paste.openstack.org/show/497106/","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"9cf57eb5884597fcd21981ba755e7decdeb113d7","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"},{"line_number":150,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":151,"context_line":"        time.sleep(3)"},{"line_number":152,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # make sure auto-created containers get in the account listing"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_e24f2bbc","line":151,"in_reply_to":"dab17558_4f20ee49","updated":"2016-05-14 00:04:40.000000000","message":"I tried your patch, looks good.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f48ec6f53ff5288e22f7a4d8c3dfd2c1972ac78","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"},{"line_number":150,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":151,"context_line":"        time.sleep(3)"},{"line_number":152,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # make sure auto-created containers get in the account listing"},{"line_number":155,"context_line":"        Manager([\u0027container-updater\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_960317b8","line":152,"updated":"2016-05-13 16:40:58.000000000","message":"I see test errors raised here on my SAIO when the policy chosen for the container is ec42. I guess there are not enough servers available to write a quorum?\n\n  \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nERROR: test_expirer_object_should_not_be_expired (test.probe.test_object_expirer.TestObjectExpirer)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/home/swift/swift/test/probe/test_object_expirer.py\", line 152, in test_expirer_object_should_not_be_expired\n    obj_brain.put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027})\n  File \"/home/swift/swift/test/probe/brain.py\", line 168, in put_object\n    self.object_name, headers\u003dheaders)\n  File \"/home/swift/swiftclient/swiftclient/client.py\", line 1239, in put_object\n    raise ClientException.from_response(resp, \u0027Object PUT failed\u0027, body)\nClientException: Object PUT failed: http://127.0.0.1:8080/v1/AUTH_test/container-5d4adfdc-31f5-4a9e-a139-f56d64e888c6/object-bd793f37-fb84-4411-8e16-6e1be2a8d54a 503 Service Unavailable  [first 60 chars of response] \u003chtml\u003e\u003ch1\u003eService Unavailable\u003c/h1\u003e\u003cp\u003eThe server is currently","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"383cb543ebaa3567b0d6f784384ce03f00e7b0eb","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # sleep 3 sec to increment the X-Timestamp explicitly"},{"line_number":150,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":151,"context_line":"        time.sleep(3)"},{"line_number":152,"context_line":"        obj_brain.put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # make sure auto-created containers get in the account listing"},{"line_number":155,"context_line":"        Manager([\u0027container-updater\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dab17558_d6cf327d","line":152,"in_reply_to":"dab17558_960317b8","updated":"2016-05-16 05:16:43.000000000","message":"It looks you\u0027re correct. my change for put_container seems to trigger this. Probably Daisuke\u0027s comment at L138 is a hint to avoid this. I will try to do that.","commit_id":"019ce0ecb8978d932e04a6bb957eb93e36ea1380"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_expirer_object_should_not_be_expired(self):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_be03bb72","line":132,"updated":"2016-05-18 17:33:28.000000000","message":"s/if-x-delete-at/x-if-delete-at/","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_expirer_object_should_not_be_expired(self):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_024b7688","line":132,"in_reply_to":"bab6814e_be03bb72","updated":"2016-05-19 05:24:10.000000000","message":"Done","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def test_expirer_object_should_not_be_expired(self):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."},{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_5e4a8fc6","line":133,"updated":"2016-05-18 17:33:28.000000000","message":"s/correct/no correct/ I think?","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def test_expirer_object_should_not_be_expired(self):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."},{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_c207ae1a","line":133,"in_reply_to":"bab6814e_5e4a8fc6","updated":"2016-05-19 05:24:10.000000000","message":"Oh yeah, that\u0027s true. And I am realizing the word \"correct\" could cause misleading. I will change the line to be more clear.","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."},{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"},{"line_number":137,"context_line":"        # can put the tombstone with the timestamp as same as x-delete-at and"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_de44bf75","line":134,"updated":"2016-05-18 17:33:28.000000000","message":"do you mean \"with *different* x-delete-at header\" ? These cause the 412 when x-delete-at !\u003d x-if-delete-at","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Current object-expirer checks the correctness via if-x-delete-at"},{"line_number":133,"context_line":"        # header that it can be deleted by expirer. If there are correct"},{"line_number":134,"context_line":"        # objects with x-delete-at header in object-servers,"},{"line_number":135,"context_line":"        # object-expirer\u0027s delete will fail as 412 PreconditionFailed."},{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"},{"line_number":137,"context_line":"        # can put the tombstone with the timestamp as same as x-delete-at and"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_dd502f0d","line":134,"in_reply_to":"bab6814e_de44bf75","updated":"2016-05-19 05:24:10.000000000","message":"Both cases, different x-delete-at header value and no x-delete-at header.\n\nAs well as the comment above, I think this explanation should be changed to clarify the state. I will try to fix.","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"},{"line_number":137,"context_line":"        # can put the tombstone with the timestamp as same as x-delete-at and"},{"line_number":138,"context_line":"        # the object consistency will be resolved as the newer timestamp will"},{"line_number":139,"context_line":"        # be winner (in paticular, overwriten case w/o x-delete-at). This test"},{"line_number":140,"context_line":"        # asserts such a situation that, at least, the overwriten object which"},{"line_number":141,"context_line":"        # have larger timestamp than the original expirered date should be"},{"line_number":142,"context_line":"        # safe."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_de9f9f01","line":139,"updated":"2016-05-18 17:33:28.000000000","message":"s/paticular, overwriten/particular, overwritten/","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        # However, if some of the objects are in handoff nodes, the expirer"},{"line_number":137,"context_line":"        # can put the tombstone with the timestamp as same as x-delete-at and"},{"line_number":138,"context_line":"        # the object consistency will be resolved as the newer timestamp will"},{"line_number":139,"context_line":"        # be winner (in paticular, overwriten case w/o x-delete-at). This test"},{"line_number":140,"context_line":"        # asserts such a situation that, at least, the overwriten object which"},{"line_number":141,"context_line":"        # have larger timestamp than the original expirered date should be"},{"line_number":142,"context_line":"        # safe."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_7d6943be","line":139,"in_reply_to":"bab6814e_de9f9f01","updated":"2016-05-19 05:24:10.000000000","message":"Done","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        now \u003d time.time()"},{"line_number":169,"context_line":"        delete_at \u003d int(now + 2.0)"},{"line_number":170,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: delete_at,"},{"line_number":171,"context_line":"                            \u0027X-Timestamp\u0027: now})"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # some object servers stopped to make a situation that the"},{"line_number":174,"context_line":"        # object-expirer can put tombstone in the primary nodes."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_842b0882","line":171,"updated":"2016-05-18 17:33:28.000000000","message":"should probably use Timestamp(now).normal\n\nsame below","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        now \u003d time.time()"},{"line_number":169,"context_line":"        delete_at \u003d int(now + 2.0)"},{"line_number":170,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: delete_at,"},{"line_number":171,"context_line":"                            \u0027X-Timestamp\u0027: now})"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # some object servers stopped to make a situation that the"},{"line_number":174,"context_line":"        # object-expirer can put tombstone in the primary nodes."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_5dc0bf7c","line":171,"in_reply_to":"bab6814e_842b0882","updated":"2016-05-19 05:24:10.000000000","message":"Done","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # increment the X-Timestamp explicitly"},{"line_number":178,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":179,"context_line":"        put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027,"},{"line_number":180,"context_line":"                            \u0027X-Timestamp\u0027: delete_at + 1})"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_01942a89","line":178,"updated":"2016-05-18 17:33:28.000000000","message":"nit: parentheses is wrong position\n\n  (will be T(obj_deleted with x-delete-at) \u003c T(obj_recreated))","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # increment the X-Timestamp explicitly"},{"line_number":178,"context_line":"        # (will be T(obj_deleted with x-delete-at \u003c T(obj_recreated)))"},{"line_number":179,"context_line":"        put_object(headers\u003d{\u0027X-Object-Meta-Expired\u0027: \u0027False\u0027,"},{"line_number":180,"context_line":"                            \u0027X-Timestamp\u0027: delete_at + 1})"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_7dc5c38c","line":178,"in_reply_to":"bab6814e_01942a89","updated":"2016-05-19 05:24:10.000000000","message":"Done","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # some object servers recovered"},{"line_number":195,"context_line":"        obj_brain.start_primary_half()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        # Now, expirer runs at the time after obj is recreated"},{"line_number":198,"context_line":"        self.expirer.once()"},{"line_number":199,"context_line":"        # and inconsistent state of objects is recovered by replicator"},{"line_number":200,"context_line":"        Manager([\u0027object-replicator\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_417f52aa","line":197,"updated":"2016-05-18 17:33:28.000000000","message":"ah, problem is that we don\u0027t know that the real time is \u003e recreated time because we forced recreated time to be now+3\n\nSo to be sure a while loop will be needed with sleeps until time \u003e delete_at+1, or simply sleep(3.1) should work - similar to the original test.","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3fbba64151c61ac5bfa84668729c11ecc930c286","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # some object servers recovered"},{"line_number":195,"context_line":"        obj_brain.start_primary_half()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        # Now, expirer runs at the time after obj is recreated"},{"line_number":198,"context_line":"        self.expirer.once()"},{"line_number":199,"context_line":"        # and inconsistent state of objects is recovered by replicator"},{"line_number":200,"context_line":"        Manager([\u0027object-replicator\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_9dffc7a9","line":197,"in_reply_to":"bab6814e_417f52aa","updated":"2016-05-19 05:24:10.000000000","message":"Oops! I was missing to make that back to the original when changing this patch to use internal client. Nice catch!\n\nAnd anyway, it needs to sleep so that I am realizing internal client might not save the time :/","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c150341c6de61a99b59a53aa88fb05851c244560","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        obj_brain.start_primary_half()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        # Now, expirer runs at the time after obj is recreated"},{"line_number":198,"context_line":"        self.expirer.once()"},{"line_number":199,"context_line":"        # and inconsistent state of objects is recovered by replicator"},{"line_number":200,"context_line":"        Manager([\u0027object-replicator\u0027]).once()"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_c4f870e8","line":198,"updated":"2016-05-18 17:33:28.000000000","message":"here I think we should do:\n\n  obj_brain.stop_handoff_half()\n  # verify that original object was deleted by expirer\n  try:\n      metadata \u003d self.client.get_object_metadata(\n                self.account, self.container_name, self.object_name, acceptable_statuses\u003d(4,))\n  except UnexpectedResponse as e:\n            self.fail(\n                \u0027Expected 404 for HEAD object but got %s\u0027 % e.resp.status)\n  obj_brain.start_handoff_half()","commit_id":"5f20c47cfa2b6d925fae117fa716d705aae765dc"}]}
