)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4778d9edc6e7d2186841a7ec5d110cdde5127642","unresolved":true,"context_lines":[{"line_number":10,"context_line":"container sysmeta that is hidden from the user. It is desirable that"},{"line_number":11,"context_line":"this happens without modifying the put-timestamp and therefore the"},{"line_number":12,"context_line":"last-modified time that is reported in responses to client HEADs and"},{"line_number":13,"context_line":"GETs."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch modifies the container server so that a POST will not"},{"line_number":16,"context_line":"update the container put_timestamp if an X-Backend-No-Timestamp-Update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"c5b82782_4e793a15","line":13,"updated":"2023-03-08 21:35:49.000000000","message":"maybe mention that sysmeta and shard range state is already modified without modifying put_timestamp, just not via the container server API","commit_id":"81e07ca0dcdedc5470469a0c9aef41a16de28eeb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a51b7b9619eef34cde269f06c9a9f2d2671c6ec5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"container sysmeta that is hidden from the user. It is desirable that"},{"line_number":11,"context_line":"this happens without modifying the put-timestamp and therefore the"},{"line_number":12,"context_line":"last-modified time that is reported in responses to client HEADs and"},{"line_number":13,"context_line":"GETs."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch modifies the container server so that a POST will not"},{"line_number":16,"context_line":"update the container put_timestamp if an X-Backend-No-Timestamp-Update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"213732ac_23e84f23","line":13,"in_reply_to":"c5b82782_4e793a15","updated":"2023-03-14 10:18:03.000000000","message":"Done","commit_id":"81e07ca0dcdedc5470469a0c9aef41a16de28eeb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow internal container POSTs to not update put_timestamp"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There may be circumstances when an internal client wishes to modify"},{"line_number":10,"context_line":"container sysmeta that is hidden from the user. It is desirable that"},{"line_number":11,"context_line":"this happens without modifying the put-timestamp and therefore the"},{"line_number":12,"context_line":"last-modified time that is reported in responses to client HEADs and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ebb7c2b5_cb57d01e","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":50},"updated":"2023-03-17 20:21:15.000000000","message":"This put me in mind of internal_client, and I was a little surprised to not see it used anywhere.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow internal container POSTs to not update put_timestamp"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There may be circumstances when an internal client wishes to modify"},{"line_number":10,"context_line":"container sysmeta that is hidden from the user. It is desirable that"},{"line_number":11,"context_line":"this happens without modifying the put-timestamp and therefore the"},{"line_number":12,"context_line":"last-modified time that is reported in responses to client HEADs and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"cb923a9c_fcdcf1d4","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":50},"in_reply_to":"ebb7c2b5_cb57d01e","updated":"2023-03-20 11:42:47.000000000","message":"I mean internal (e.g. direct_client or internal_client) as opposed to external client \"outside of\" the gatekeeper middleware which prevents x-backend-* headers being sent","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":13,"context_line":"GETs."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch modifies the container server so that a POST will not"},{"line_number":16,"context_line":"update the container put_timestamp if an X-Backend-No-Timestamp-Update"},{"line_number":17,"context_line":"header is included with the request and has a truthy value."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Note: there are already circumstances in which container sysmeta is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"db6111d3_9b876fa6","line":16,"updated":"2023-03-17 20:21:15.000000000","message":"Similar sort of naming to X-Backend-No-Commit 👍","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"GETs."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch modifies the container server so that a POST will not"},{"line_number":16,"context_line":"update the container put_timestamp if an X-Backend-No-Timestamp-Update"},{"line_number":17,"context_line":"header is included with the request and has a truthy value."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Note: there are already circumstances in which container sysmeta is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1de63c4b_81599a18","line":16,"in_reply_to":"db6111d3_9b876fa6","updated":"2023-03-20 11:42:47.000000000","message":"Ack","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"22b24ca0_d8b23eed","updated":"2023-03-17 20:21:15.000000000","message":"Seems about right. Got a couple questions in `server.py`, and the probe test could use some improvements -- I\u0027d be happy to carry it, though.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a51b7b9619eef34cde269f06c9a9f2d2671c6ec5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9a0e650c_8b3ee47e","updated":"2023-03-14 10:18:03.000000000","message":"recheck\n\nbandit failure was fixed here https://review.opendev.org/c/openstack/swift/+/877131","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"}],"swift/common/direct_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"def direct_post_container(node, part, account, container, conn_timeout\u003d5,"},{"line_number":410,"context_line":"                          response_timeout\u003d15, headers\u003dNone):"},{"line_number":411,"context_line":"    \"\"\""},{"line_number":412,"context_line":"    Make a POST request to a container server."},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4ff7914a_df5af0a7","line":410,"updated":"2023-03-17 20:21:15.000000000","message":"Interesting that we didn\u0027t already have this -- it\u0027s a fairly obvious addition. Is it just that we\u0027d typically do a `PUT` and allow the container to be created if it didn\u0027t exist/was deleted?\n\nI kind of expected it to go between `direct_put_container` and `direct_put_container_object`, but w/e","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"def direct_post_container(node, part, account, container, conn_timeout\u003d5,"},{"line_number":410,"context_line":"                          response_timeout\u003d15, headers\u003dNone):"},{"line_number":411,"context_line":"    \"\"\""},{"line_number":412,"context_line":"    Make a POST request to a container server."},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b3192f78_3a96cd39","line":410,"in_reply_to":"4ff7914a_df5af0a7","updated":"2023-03-20 11:42:47.000000000","message":"Done\n\nwell, we have it now 😊","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"}],"swift/container/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":439,"context_line":"                raise HTTPConflict(request\u003dreq,"},{"line_number":440,"context_line":"                                   headers\u003d{\u0027x-backend-storage-policy-index\u0027:"},{"line_number":441,"context_line":"                                            broker.storage_policy_index})"},{"line_number":442,"context_line":"        broker.update_put_timestamp(timestamp)"},{"line_number":443,"context_line":"        if broker.is_deleted():"},{"line_number":444,"context_line":"            raise HTTPConflict(request\u003dreq)"},{"line_number":445,"context_line":"        if recreated:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3d65d338_bbcbbf33","line":442,"updated":"2023-03-17 20:21:15.000000000","message":"Should we guard this one, too? The semantics may get weird/hard to describe, though -- I think we\u0027d *have* to update `put_timestamp` if we initialized or recreated the DB...","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":true,"context_lines":[{"line_number":439,"context_line":"                raise HTTPConflict(request\u003dreq,"},{"line_number":440,"context_line":"                                   headers\u003d{\u0027x-backend-storage-policy-index\u0027:"},{"line_number":441,"context_line":"                                            broker.storage_policy_index})"},{"line_number":442,"context_line":"        broker.update_put_timestamp(timestamp)"},{"line_number":443,"context_line":"        if broker.is_deleted():"},{"line_number":444,"context_line":"            raise HTTPConflict(request\u003dreq)"},{"line_number":445,"context_line":"        if recreated:"}],"source_content_type":"text/x-python","patch_set":3,"id":"66e35b29_003640f4","line":442,"in_reply_to":"3d65d338_bbcbbf33","updated":"2023-03-20 11:42:47.000000000","message":"I don\u0027t have a use case for PUT and, as you say, it could get complicated. Particularly since the docstring says:\n\n  Create new database broker or update timestamps for existing database.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":880,"context_line":"            return HTTPNotFound(request\u003dreq)"},{"line_number":881,"context_line":"        if not config_true_value("},{"line_number":882,"context_line":"                req.headers.get(\u0027x-backend-no-timestamp-update\u0027, False)):"},{"line_number":883,"context_line":"            broker.update_put_timestamp(req_timestamp.internal)"},{"line_number":884,"context_line":"        self._update_metadata(req, broker, req_timestamp, \u0027POST\u0027)"},{"line_number":885,"context_line":"        return HTTPNoContent(request\u003dreq)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"75da4426_5beaae35","line":883,"updated":"2023-03-17 20:21:15.000000000","message":"Should we maybe verify that no user meta is getting updated? It wouldn\u0027t be a guarantee that no user-visible headers changed, of course, but it could catch some obvious errors/bad practices.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1abcaa0bdb630562954a3c645fba4964f1f1e6b6","unresolved":false,"context_lines":[{"line_number":880,"context_line":"            return HTTPNotFound(request\u003dreq)"},{"line_number":881,"context_line":"        if not config_true_value("},{"line_number":882,"context_line":"                req.headers.get(\u0027x-backend-no-timestamp-update\u0027, False)):"},{"line_number":883,"context_line":"            broker.update_put_timestamp(req_timestamp.internal)"},{"line_number":884,"context_line":"        self._update_metadata(req, broker, req_timestamp, \u0027POST\u0027)"},{"line_number":885,"context_line":"        return HTTPNoContent(request\u003dreq)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e6cf1aad_4cc0a36e","line":883,"in_reply_to":"2c95237e_e1e817d1","updated":"2023-03-23 15:53:48.000000000","message":"I was thinking 400 until we had a concrete use case to do something different. Easier to open up access later than close it off after the fact, and all. Either way tho","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":true,"context_lines":[{"line_number":880,"context_line":"            return HTTPNotFound(request\u003dreq)"},{"line_number":881,"context_line":"        if not config_true_value("},{"line_number":882,"context_line":"                req.headers.get(\u0027x-backend-no-timestamp-update\u0027, False)):"},{"line_number":883,"context_line":"            broker.update_put_timestamp(req_timestamp.internal)"},{"line_number":884,"context_line":"        self._update_metadata(req, broker, req_timestamp, \u0027POST\u0027)"},{"line_number":885,"context_line":"        return HTTPNoContent(request\u003dreq)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2c95237e_e1e817d1","line":883,"in_reply_to":"75da4426_5beaae35","updated":"2023-03-20 11:42:47.000000000","message":"I\u0027m reluctant to add further conditions because it would make the interface complex and with an x-backend-* header it\u0027s not unreasonable to assume the caller knows what they are doing. If we check and find X-Container-Meta-* headers, do we ignore \u0027x-backend-no-timestamp-update\u0027, or return a 409 or 400?\n\nGiven the absence of a concrete *upstream* use case at this point, I\u0027m minded to keep this as simple as possible.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"}],"test/probe/test_container_failures.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f63ef06895da094f6fdbea1049b79b4af1434c28","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        direct_client.direct_post_container("},{"line_number":126,"context_line":"            cnodes[1], cpart, self.account, container1, headers\u003dpost_hdrs)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # verify that put_timestamp was not modified"},{"line_number":129,"context_line":"        hdrs \u003d direct_client.direct_head_container("},{"line_number":130,"context_line":"            cnodes[1], cpart, self.account, container1)"},{"line_number":131,"context_line":"        self.assertLess(exp_hdrs[\u0027x-backend-put-timestamp\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"a57e054f_469438c1","line":128,"range":{"start_line":128,"start_character":36,"end_line":128,"end_character":43},"updated":"2023-03-08 21:34:52.000000000","message":"s/was not/was/","commit_id":"81e07ca0dcdedc5470469a0c9aef41a16de28eeb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a51b7b9619eef34cde269f06c9a9f2d2671c6ec5","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        direct_client.direct_post_container("},{"line_number":126,"context_line":"            cnodes[1], cpart, self.account, container1, headers\u003dpost_hdrs)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # verify that put_timestamp was not modified"},{"line_number":129,"context_line":"        hdrs \u003d direct_client.direct_head_container("},{"line_number":130,"context_line":"            cnodes[1], cpart, self.account, container1)"},{"line_number":131,"context_line":"        self.assertLess(exp_hdrs[\u0027x-backend-put-timestamp\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"87b417cc_b81f174a","line":128,"range":{"start_line":128,"start_character":36,"end_line":128,"end_character":43},"in_reply_to":"a57e054f_469438c1","updated":"2023-03-14 10:18:03.000000000","message":"Done","commit_id":"81e07ca0dcdedc5470469a0c9aef41a16de28eeb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":86,"context_line":"            hdrs \u003d direct_client.direct_head_container("},{"line_number":87,"context_line":"                cnode, cpart, self.account, container1)"},{"line_number":88,"context_line":"            if exp_hdrs:"},{"line_number":89,"context_line":"                self.assertEqual(exp_hdrs, hdrs)"},{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"279a055a_f493ec2b","line":89,"updated":"2023-03-17 20:21:15.000000000","message":"We ought to `pop(\u0027Date\u0027)` right away -- otherwise we risk having seconds roll over between `HEAD`s, causing a failure here.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            hdrs \u003d direct_client.direct_head_container("},{"line_number":87,"context_line":"                cnode, cpart, self.account, container1)"},{"line_number":88,"context_line":"            if exp_hdrs:"},{"line_number":89,"context_line":"                self.assertEqual(exp_hdrs, hdrs)"},{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dc21c25d_14c6afd6","line":89,"in_reply_to":"279a055a_f493ec2b","updated":"2023-03-20 11:42:47.000000000","message":"Done","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":89,"context_line":"                self.assertEqual(exp_hdrs, hdrs)"},{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"},{"line_number":93,"context_line":"        put_time \u003d float(exp_hdrs[\u0027X-Backend-Put-Timestamp\u0027])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Post to only one replica of container1 at least 1 second after the"}],"source_content_type":"text/x-python","patch_set":3,"id":"99e9ee8b_31718f7a","line":92,"updated":"2023-03-17 20:21:15.000000000","message":"Given that we\u0027re mainly doing this to preserve `Last-Modified`, I think we could use a\n\n self.assertIn(\u0027Last-Modified\u0027, exp_hdrs)\n\naround here.","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                self.assertEqual(exp_hdrs, hdrs)"},{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"},{"line_number":93,"context_line":"        put_time \u003d float(exp_hdrs[\u0027X-Backend-Put-Timestamp\u0027])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Post to only one replica of container1 at least 1 second after the"}],"source_content_type":"text/x-python","patch_set":3,"id":"5c6a27bd_dd7aab1d","line":92,"in_reply_to":"99e9ee8b_31718f7a","updated":"2023-03-20 11:42:47.000000000","message":"Done","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c8d9f4d09a53ce42f932bad64263b6d7c6e6c6a","unresolved":true,"context_lines":[{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"},{"line_number":93,"context_line":"        put_time \u003d float(exp_hdrs[\u0027X-Backend-Put-Timestamp\u0027])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Post to only one replica of container1 at least 1 second after the"},{"line_number":96,"context_line":"        # put (to reveal any unexpected change in Last-Modified which is"}],"source_content_type":"text/x-python","patch_set":3,"id":"6672cd05_12176e5f","line":93,"updated":"2023-03-17 20:21:15.000000000","message":"Remind me: what\u0027s the difference between this and `X-Put-Timestamp`?","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"244c61a16366f1909b075c662f7e0fccd5ad8b4e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            exp_hdrs \u003d hdrs"},{"line_number":91,"context_line":"        self.assertIsNotNone(exp_hdrs)"},{"line_number":92,"context_line":"        exp_hdrs.pop(\u0027Date\u0027)"},{"line_number":93,"context_line":"        put_time \u003d float(exp_hdrs[\u0027X-Backend-Put-Timestamp\u0027])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Post to only one replica of container1 at least 1 second after the"},{"line_number":96,"context_line":"        # put (to reveal any unexpected change in Last-Modified which is"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffdd8e40_dc51e3de","line":93,"in_reply_to":"6672cd05_12176e5f","updated":"2023-03-20 11:42:47.000000000","message":"backend timestamp headers are always returned, \u0027X-PUT-Timestamp\u0027 only comes back if the container is not deleted. If they both exist then \n\n  \u0027X-PUT-Timestamp\u0027 \u003d\u003d \u0027X-Backend-Put-Timestamp\u0027","commit_id":"380d941bee3c54e30ef73fe45f859cdfbc55a499"}]}
