)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"072d9512a606eeac1b5b892945961ae553c6f96f","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"No observable change in client facing behavior except that swift is"},{"line_number":24,"context_line":"faster to respond Accepted when it already has the data the client is"},{"line_number":25,"context_line":"purposing to send."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: Ie400d5bfd9ab28b290abce2e790889d78726095f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da86d52c_84e69cae","line":25,"updated":"2015-02-04 17:30:03.000000000","message":"nit: s/purposing/proposing/ ?","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"b20f8d9faf826ce7267938f967d9871c93109015","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            self.account_name, self.container_name, self.object_name)"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        # do a HEAD request for container sync and checking object versions"},{"line_number":509,"context_line":"        if object_versions and not req.environ.get(\u0027swift_versioned_copy\u0027):"},{"line_number":510,"context_line":"            # make sure proxy-server uses the right policy index"},{"line_number":511,"context_line":"            _headers \u003d {\u0027X-Backend-Storage-Policy-Index\u0027: policy_index,"},{"line_number":512,"context_line":"                        \u0027X-Newest\u0027: \u0027True\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_4ab40335","line":509,"updated":"2014-08-26 13:57:49.000000000","message":"with this change, could this HEAD request be moved to line 550? sorry if I\u0027m missing something...","commit_id":"6929a8da8675bafd47050ffaeee3b672cb1103b1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"19f2cadacd63f780872f173089485f6d59eb2ab5","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            self.account_name, self.container_name, self.object_name)"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        # do a HEAD request for container sync and checking object versions"},{"line_number":509,"context_line":"        if object_versions and not req.environ.get(\u0027swift_versioned_copy\u0027):"},{"line_number":510,"context_line":"            # make sure proxy-server uses the right policy index"},{"line_number":511,"context_line":"            _headers \u003d {\u0027X-Backend-Storage-Policy-Index\u0027: policy_index,"},{"line_number":512,"context_line":"                        \u0027X-Newest\u0027: \u0027True\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_d3aa8219","line":509,"in_reply_to":"1abeadc6_4ab40335","updated":"2014-08-26 19:41:54.000000000","message":"well, i should definitely update the comment since the head request is only used for version copies... but I don\u0027t think moving where it happens in the code would have a functional impact... I\u0027d rather save it for a targeted \"clean up object put\" change and leave this diff as simple as possible.","commit_id":"6929a8da8675bafd47050ffaeee3b672cb1103b1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d56f0433714a6757bdc24a02d601368345d65d22","unresolved":false,"context_lines":[{"line_number":678,"context_line":"                  \u0027%(req_timestamp)s \u003c\u003d %(timestamps)r\u0027),"},{"line_number":679,"context_line":"                {\u0027req_timestamp\u0027: req.timestamp.internal,"},{"line_number":680,"context_line":"                 \u0027timestamps\u0027: \u0027, \u0027.join(timestamps)})"},{"line_number":681,"context_line":"            return HTTPAccepted(request\u003dreq)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        if len(conns) \u003c min_conns:"},{"line_number":684,"context_line":"            self.app.logger.error("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_9ab7a3d7","line":681,"updated":"2015-01-08 02:15:42.000000000","message":"So I had a notion here that it might be \"better\" to update container sync and the container reconciler to accept the 409 as success, maybe include the X-Timestamp we think is newer so the remote end can validate us if we\u0027re really paranoid.\n\nBut if we don\u0027t translate \"a newer timestamped object already exists than the x-timestamp of this upload\" to 202 then it *is* unfortunately a public facing api change (since container_sync uses the public api).  Also we can\u0027t know when a remote cluster will have it\u0027s it\u0027s container sync upgraded to accept the 409\u0027s - so I\u0027d probably have to trap the PUT response in the container sync middleware to translate to 202.  The reconciler could just get updated, and during a rolling upgrade out-of-date reconcilers may get a few 409\u0027s that they\u0027ll retry, but that\u0027s probably fine.","commit_id":"c9a9d41561742ac36c2d16f7d550cbf75e5535db"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4d5081defaa7b6d5d6342ef4a3e8644e32506bd8","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                    conn.resp \u003d None"},{"line_number":341,"context_line":"                    conn.node \u003d node"},{"line_number":342,"context_line":"                    return conn"},{"line_number":343,"context_line":"                elif is_success(resp.status) or resp.status \u003d\u003d HTTP_CONFLICT:"},{"line_number":344,"context_line":"                    conn.resp \u003d resp"},{"line_number":345,"context_line":"                    conn.node \u003d node"},{"line_number":346,"context_line":"                    return conn"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa81d914_314dcf73","line":343,"updated":"2015-01-27 21:40:20.000000000","message":"Just curious, do you want to chuck self.app.logger.debug(_(\u0027Object PUT returning 202 for 409: \u0027 ...)) in here somewhere? Not sure if anyone ever wanted it but it\u0027s there in the old code.","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7c140a7bcd72cdc1a2278e303d8b38704599407c","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                    conn.resp \u003d None"},{"line_number":341,"context_line":"                    conn.node \u003d node"},{"line_number":342,"context_line":"                    return conn"},{"line_number":343,"context_line":"                elif is_success(resp.status) or resp.status \u003d\u003d HTTP_CONFLICT:"},{"line_number":344,"context_line":"                    conn.resp \u003d resp"},{"line_number":345,"context_line":"                    conn.node \u003d node"},{"line_number":346,"context_line":"                    return conn"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_f606491c","line":343,"updated":"2015-02-04 05:13:45.000000000","message":"Pete, looks like he\u0027s doing just that in PUT below.","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"302232cfae9aec8ecd24b918c9a0d72fc5b012ed","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                    conn.resp \u003d None"},{"line_number":341,"context_line":"                    conn.node \u003d node"},{"line_number":342,"context_line":"                    return conn"},{"line_number":343,"context_line":"                elif is_success(resp.status) or resp.status \u003d\u003d HTTP_CONFLICT:"},{"line_number":344,"context_line":"                    conn.resp \u003d resp"},{"line_number":345,"context_line":"                    conn.node \u003d node"},{"line_number":346,"context_line":"                    return conn"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_36ce21b5","line":343,"in_reply_to":"da86d52c_f606491c","updated":"2015-02-04 05:27:57.000000000","message":"Oops, I see it now.","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"072d9512a606eeac1b5b892945961ae553c6f96f","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":570,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def test_container_sync_put_x_timestamp_race(self):"},{"line_number":573,"context_line":"        ts \u003d (utils.Timestamp(t) for t in itertools.count(int(time.time())))"},{"line_number":574,"context_line":"        test_indexes \u003d [None] + [int(p) for p in POLICIES]"},{"line_number":575,"context_line":"        for policy_index in test_indexes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_09e56537","line":572,"updated":"2015-02-04 17:30:03.000000000","message":"this looks equivalent to test_container_sync_put_x_timestamp_match ?","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"072d9512a606eeac1b5b892945961ae553c6f96f","unresolved":false,"context_lines":[{"line_number":572,"context_line":"    def test_container_sync_put_x_timestamp_race(self):"},{"line_number":573,"context_line":"        ts \u003d (utils.Timestamp(t) for t in itertools.count(int(time.time())))"},{"line_number":574,"context_line":"        test_indexes \u003d [None] + [int(p) for p in POLICIES]"},{"line_number":575,"context_line":"        for policy_index in test_indexes:"},{"line_number":576,"context_line":"            put_timestamp \u003d ts.next().internal"},{"line_number":577,"context_line":"            req \u003d swob.Request.blank("},{"line_number":578,"context_line":"                \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_29b94915","line":575,"updated":"2015-02-04 17:30:03.000000000","message":"policy_index not used","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"072d9512a606eeac1b5b892945961ae553c6f96f","unresolved":false,"context_lines":[{"line_number":592,"context_line":"    def test_container_sync_put_x_timestamp_unsynced_race(self):"},{"line_number":593,"context_line":"        ts \u003d (utils.Timestamp(t) for t in itertools.count(int(time.time())))"},{"line_number":594,"context_line":"        test_indexes \u003d [None] + [int(p) for p in POLICIES]"},{"line_number":595,"context_line":"        for policy_index in test_indexes:"},{"line_number":596,"context_line":"            put_timestamp \u003d ts.next().internal"},{"line_number":597,"context_line":"            req \u003d swob.Request.blank("},{"line_number":598,"context_line":"                \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_e949f131","line":595,"updated":"2015-02-04 17:30:03.000000000","message":"ditto policy_index not used","commit_id":"3782bf1b562dbd61d933fd9031bcb56a6e674fb5"}]}
