)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix object-server to handle newer ts file"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Swift object-server will return 409 Conflict when the imcomming"},{"line_number":10,"context_line":"request X-Timestamp is older than the local disk file to prevent"},{"line_number":11,"context_line":"wasted data transfer and disk space consumption. However, IIF,"},{"line_number":12,"context_line":"the local disk file is a tombstone, current object-server will"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dae33548_2f319a5a","line":9,"updated":"2016-02-18 12:30:10.000000000","message":"s/imcomming/incoming/","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix object-server to handle newer ts file"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Swift object-server will return 409 Conflict when the imcomming"},{"line_number":10,"context_line":"request X-Timestamp is older than the local disk file to prevent"},{"line_number":11,"context_line":"wasted data transfer and disk space consumption. However, IIF,"},{"line_number":12,"context_line":"the local disk file is a tombstone, current object-server will"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dae33548_aa77339e","line":9,"in_reply_to":"dae33548_2f319a5a","updated":"2016-02-19 01:31:42.000000000","message":"Done","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Swift object-server will return 409 Conflict when the imcomming"},{"line_number":10,"context_line":"request X-Timestamp is older than the local disk file to prevent"},{"line_number":11,"context_line":"wasted data transfer and disk space consumption. However, IIF,"},{"line_number":12,"context_line":"the local disk file is a tombstone, current object-server will"},{"line_number":13,"context_line":"write the data in the device and cleanup it according to timestamp"},{"line_number":14,"context_line":"comparison result in hash_cleanup_list_dir, and then return 201"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dae33548_ef4332ad","line":11,"updated":"2016-02-18 12:30:10.000000000","message":"s/IIF/IFF/ I think, if you mean \"if and only if\"","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Swift object-server will return 409 Conflict when the imcomming"},{"line_number":10,"context_line":"request X-Timestamp is older than the local disk file to prevent"},{"line_number":11,"context_line":"wasted data transfer and disk space consumption. However, IIF,"},{"line_number":12,"context_line":"the local disk file is a tombstone, current object-server will"},{"line_number":13,"context_line":"write the data in the device and cleanup it according to timestamp"},{"line_number":14,"context_line":"comparison result in hash_cleanup_list_dir, and then return 201"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dae33548_aa9e13b6","line":11,"in_reply_to":"dae33548_ef4332ad","updated":"2016-02-19 01:31:42.000000000","message":"Yup, thanks. Done.","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        old_timestamp \u003d time()"},{"line_number":701,"context_line":"        new_timestamp \u003d old_timestamp + 100.0"},{"line_number":702,"context_line":"        old_timestamp \u003d normalize_timestamp(old_timestamp)"},{"line_number":703,"context_line":"        new_timestamp \u003d normalize_timestamp(new_timestamp)"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        req \u003d Request.blank("},{"line_number":706,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027DELETE\u0027},"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_ef7b32bc","line":703,"updated":"2016-02-18 12:30:10.000000000","message":"make_timestamp_iter() is a useful helper for creating timestamps","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        old_timestamp \u003d time()"},{"line_number":701,"context_line":"        new_timestamp \u003d old_timestamp + 100.0"},{"line_number":702,"context_line":"        old_timestamp \u003d normalize_timestamp(old_timestamp)"},{"line_number":703,"context_line":"        new_timestamp \u003d normalize_timestamp(new_timestamp)"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        req \u003d Request.blank("},{"line_number":706,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027DELETE\u0027},"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_8a6b4f85","line":703,"in_reply_to":"dae33548_ef7b32bc","updated":"2016-02-19 01:31:42.000000000","message":"Good call, change each timestamp from str to Timestamp with the iterator ;)","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":710,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":711,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":712,"context_line":"        sleep(.00001)"},{"line_number":713,"context_line":"        req \u003d Request.blank("},{"line_number":714,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":715,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: new_timestamp,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_0faad618","line":712,"updated":"2016-02-18 12:30:10.000000000","message":"sleep not needed","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":710,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":711,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":712,"context_line":"        sleep(.00001)"},{"line_number":713,"context_line":"        req \u003d Request.blank("},{"line_number":714,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":715,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: new_timestamp,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_4a1f8709","line":712,"in_reply_to":"dae33548_0faad618","updated":"2016-02-19 01:31:42.000000000","message":"Done","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":747,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":748,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":749,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":750,"context_line":"        sleep(.00001)"},{"line_number":751,"context_line":"        req \u003d Request.blank("},{"line_number":752,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":753,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: old_timestamp,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_2f699af9","line":750,"updated":"2016-02-18 12:30:10.000000000","message":"sleep not needed","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":747,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":748,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":749,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":750,"context_line":"        sleep(.00001)"},{"line_number":751,"context_line":"        req \u003d Request.blank("},{"line_number":752,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":753,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: old_timestamp,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_0a257f5b","line":750,"in_reply_to":"dae33548_2f699af9","updated":"2016-02-19 01:31:42.000000000","message":"Done","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"517ef5c1d38b5b13ddb89d578188db15030a2da1","unresolved":false,"context_lines":[{"line_number":754,"context_line":"                     \u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":755,"context_line":"                     \u0027Content-Encoding\u0027: \u0027gzip\u0027})"},{"line_number":756,"context_line":"        req.body \u003d \u0027VERIFY TWO\u0027"},{"line_number":757,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":758,"context_line":"        self.assertEqual(resp.status_int, 409)"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"        # data file doesn\u0027t exist there (This is sanity because"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_af5c8a4b","line":757,"updated":"2016-02-18 12:30:10.000000000","message":"how about mocking the diskfile.create() method to check it is NOT called?","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"01cb1860a5fcc57dc40ccbefcd112bafebcbaa29","unresolved":false,"context_lines":[{"line_number":754,"context_line":"                     \u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":755,"context_line":"                     \u0027Content-Encoding\u0027: \u0027gzip\u0027})"},{"line_number":756,"context_line":"        req.body \u003d \u0027VERIFY TWO\u0027"},{"line_number":757,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":758,"context_line":"        self.assertEqual(resp.status_int, 409)"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"        # data file doesn\u0027t exist there (This is sanity because"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_cab8b7eb","line":757,"in_reply_to":"dae33548_af5c8a4b","updated":"2016-02-19 01:31:42.000000000","message":"Good idea. In past, I checked with the file existence by mocking hash_cleanup_list_dir but it seemed overkill. I prefer your idea than mine. thanks.","commit_id":"263e95475c7ab8be6e6cd7c41d2366bd9b20c506"}]}
