)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"af06086ae2f245e53bc7b62cf5fbec28b39fab6e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    heartbeat\u003don"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"With heartbeating turned on, the proxy will attempt to complete the"},{"line_number":20,"context_line":"request within some configurable amount of time, defaulting to 10"},{"line_number":21,"context_line":"seconds. If this is possible, the response will be sent directly."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"If the request takes longer to complete, the proxy will respond with"},{"line_number":24,"context_line":"202 Accepted then send a single whitespace character periodically until"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f4e5783_1e039375","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":65},"updated":"2017-10-12 04:02:42.000000000","message":"This needs updating. As of patchset 2, this always sends a 202. I should also consider immediately yielding a space, rather than waiting for yield_frequency.","commit_id":"7c99d00fd63f7f25aa39077d8da678b3207c5015"}],"doc/source/api/large_objects.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"This verification process can take a long time to complete, particularly"},{"line_number":121,"context_line":"as the number of segments increases. You may include a ``heartbeat\u003don``"},{"line_number":122,"context_line":"query parameter to have the server:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"1. send a ``202 Accepted`` response before it begins validating segments,"},{"line_number":125,"context_line":"2. periodically send whitespace characters to keep the conneciton alive, and"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f4b6375_1c7c7070","line":122,"range":{"start_line":122,"start_character":0,"end_line":122,"end_character":15},"updated":"2017-10-24 18:40:46.000000000","message":"nit: in surrounding paragraphs the term \u0027query string\u0027 is used. IDK which is technically correct, perhaps it should even be \u0027query string parameter\u0027, but consistency would be nice.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"This verification process can take a long time to complete, particularly"},{"line_number":121,"context_line":"as the number of segments increases. You may include a ``heartbeat\u003don``"},{"line_number":122,"context_line":"query parameter to have the server:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"1. send a ``202 Accepted`` response before it begins validating segments,"},{"line_number":125,"context_line":"2. periodically send whitespace characters to keep the conneciton alive, and"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f4b6375_3e027d70","line":122,"range":{"start_line":122,"start_character":0,"end_line":122,"end_character":15},"in_reply_to":"3f4b6375_1c7c7070","updated":"2017-10-24 19:07:04.000000000","message":"Good point. I tend to think of \"query string\" as being all of the query parameters, but I ought to double check what terminology the RFCs use.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8d44b68079e1fac942db41bb1fa9bbd5dfa10a97","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"This verification process can take a long time to complete, particularly"},{"line_number":121,"context_line":"as the number of segments increases. You may include a ``heartbeat\u003don``"},{"line_number":122,"context_line":"query parameter to have the server:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"1. send a ``202 Accepted`` response before it begins validating segments,"},{"line_number":125,"context_line":"2. periodically send whitespace characters to keep the conneciton alive, and"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f4b6375_e23e83b6","line":122,"range":{"start_line":122,"start_character":0,"end_line":122,"end_character":15},"in_reply_to":"3f4b6375_3e027d70","updated":"2017-10-25 00:37:47.000000000","message":"I\u0027m pretty sure I\u0027m safe converting all to talk about \"query parameters\". For reference:\n\n- https://tools.ietf.org/html/rfc2616.html mentions \"query information\" and \"query URLs\"\n- https://tools.ietf.org/html/rfc3986#section-3.4 mentions \"query components\" and \"query data\"\n- https://tools.ietf.org/html/rfc6570#section-2.4.2 mentions \"query terms\" and \"query parameters\"\n- https://tools.ietf.org/html/rfc7230#section-2.7 mentions \"query\" having the same meaning as in 3986\n- https://tools.ietf.org/html/rfc7230#section-9.8 mentions \"query parameters\"\n- https://tools.ietf.org/html/rfc7231#section-4.2.1 refers to \"query parameters\" but just gives an example, not a definition.\n- https://tools.ietf.org/html/rfc7320#section-2.4 seems to use \"query string\" to indicate the complete query component and \"query parameters\" to refer to individual key/value pairs","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":122,"context_line":"query parameter to have the server:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"1. send a ``202 Accepted`` response before it begins validating segments,"},{"line_number":125,"context_line":"2. periodically send whitespace characters to keep the conneciton alive, and"},{"line_number":126,"context_line":"3. send a final response code in the body."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":".. note::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3f4b6375_40bd64d6","line":125,"range":{"start_line":125,"start_character":60,"end_line":125,"end_character":63},"updated":"2017-11-02 18:17:57.000000000","message":"nit: typo","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":770,"context_line":"# In order to keep a connection active during a potentially long PUT request,"},{"line_number":771,"context_line":"# clients may request that Swift send whitespace ahead of the final response"},{"line_number":772,"context_line":"# body. This whitespace will be yielded at most every yield_frequency seconds."},{"line_number":773,"context_line":"# yield_frequency \u003d 10"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"# Note: Put after auth and staticweb in the pipeline."},{"line_number":776,"context_line":"# If you don\u0027t put it in the pipeline, it will be inserted for you."}],"source_content_type":"application/octet-stream","patch_set":7,"id":"3f4b6375_bc3f9cb2","line":773,"range":{"start_line":773,"start_character":8,"end_line":773,"end_character":17},"updated":"2017-10-24 18:40:46.000000000","message":"I guess we have to follow the established naming for consistency, but it\u0027s a shame that the unit of frequency is actually 1/time","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":770,"context_line":"# In order to keep a connection active during a potentially long PUT request,"},{"line_number":771,"context_line":"# clients may request that Swift send whitespace ahead of the final response"},{"line_number":772,"context_line":"# body. This whitespace will be yielded at most every yield_frequency seconds."},{"line_number":773,"context_line":"# yield_frequency \u003d 10"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"# Note: Put after auth and staticweb in the pipeline."},{"line_number":776,"context_line":"# If you don\u0027t put it in the pipeline, it will be inserted for you."}],"source_content_type":"application/octet-stream","patch_set":7,"id":"3f4b6375_9e2cd102","line":773,"range":{"start_line":773,"start_character":8,"end_line":773,"end_character":17},"in_reply_to":"3f4b6375_bc3f9cb2","updated":"2017-10-24 19:07:04.000000000","message":"I agree; I winced while writing it.\n\nBut I\u0027m not willing to try to change bulk to use yield_period, so...","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e30c40bb09562d10ccc98d99f22b0341c07efdf4","unresolved":false,"context_lines":[{"line_number":720,"context_line":"# In order to keep a connection active during a potentially long bulk request,"},{"line_number":721,"context_line":"# Swift may return whitespace prepended to the actual response body. This"},{"line_number":722,"context_line":"# whitespace will be yielded no more than every yield_frequency seconds."},{"line_number":723,"context_line":"# yield_frequency \u003d 10"},{"line_number":724,"context_line":"#"},{"line_number":725,"context_line":"# Note: The following parameter is used during a bulk delete of objects and"},{"line_number":726,"context_line":"# their container. This would frequently fail because it is very likely"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"3f4b6375_541d8d0d","line":723,"updated":"2017-10-30 17:04:32.000000000","message":"The only reason I went with \u0027yield_frequency\u0027 is the precedent set here. I\u0027m really hesitant to have two names for essentially the same functionality -- and I don\u0027t really want to dep on a \"deprecate yield_frequency in favor of keep_alive_period\" (or somesuch) patch. It\u0027s bad enough that I\u0027m depping on \"make xml responses less insane\" (see https://review.openstack.org/#/c/513480/)","commit_id":"844cb9742de9235afc7355bfddc5e9a017a89fbf"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1b63f611d781a442653272edbc3eb9da03e223e6","unresolved":false,"context_lines":[{"line_number":770,"context_line":"# In order to keep a connection active during a potentially long PUT request,"},{"line_number":771,"context_line":"# clients may request that Swift send whitespace ahead of the final response"},{"line_number":772,"context_line":"# body. This whitespace will be yielded at most every yield_frequency seconds."},{"line_number":773,"context_line":"# yield_frequency \u003d 10"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"# Note: Put after auth and staticweb in the pipeline."},{"line_number":776,"context_line":"# If you don\u0027t put it in the pipeline, it will be inserted for you."}],"source_content_type":"application/octet-stream","patch_set":9,"id":"3f4b6375_f5aa746e","line":773,"range":{"start_line":773,"start_character":2,"end_line":773,"end_character":7},"updated":"2017-10-27 06:08:04.000000000","message":"yield is a great word, and totally makes sense, and I really like the option name.. However, without the comment above it isn\u0027t very obvious what it\u0027s used for.\n\nMaybe a name like `heartbeat_frequency` or something would make sense, as it also matches the option name. Or maybe I\u0027m just being too critical.","commit_id":"844cb9742de9235afc7355bfddc5e9a017a89fbf"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"aa772c6ce644ad0a34645491b12bf0dbedc5eda6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"receive a 2xx response and the SLO object is ready for downloading."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Note that large manifests may take a long time to verify; clients should"},{"line_number":76,"context_line":"consider using a long read timeout for the connection. Alternatively, clients"},{"line_number":77,"context_line":"may use the query parameters::"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_db3ad096","line":76,"updated":"2017-10-04 21:51:50.000000000","message":"this should be more strongly worded - we should just say:\n\n\"unless you suck - you should use heartbeat - the behavior is primo and it works like this - everytime guaranteed and it is so awesome I can\u0027t even - get your clients on this new hawt awesome sause or else you are lame forever\"","commit_id":"e9424582667e9f81c6573fe69eb91b0e00548bcc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce8f7d6c11d9cb2b0c2cd42d6c973e4394334366","unresolved":false,"context_lines":[{"line_number":73,"context_line":"receive a 2xx response and the SLO object is ready for downloading."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Note that large manifests may take a long time to verify; clients should"},{"line_number":76,"context_line":"consider using a long read timeout for the connection. Alternatively, clients"},{"line_number":77,"context_line":"may use the query parameters::"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_fcfd583b","line":76,"in_reply_to":"7f515b1d_db3ad096","updated":"2017-10-06 01:38:05.000000000","message":"Done","commit_id":"e9424582667e9f81c6573fe69eb91b0e00548bcc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"aa772c6ce644ad0a34645491b12bf0dbedc5eda6","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":82,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Behind the scenes, on success, a JSON manifest generated from the user input is"},{"line_number":85,"context_line":"sent to object servers with an extra ``X-Static-Large-Object: True`` header"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_5bd8207e","line":82,"updated":"2017-10-04 21:51:50.000000000","message":"I think we might suggest they could *also maybe* get a 201?","commit_id":"e9424582667e9f81c6573fe69eb91b0e00548bcc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce8f7d6c11d9cb2b0c2cd42d6c973e4394334366","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":82,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Behind the scenes, on success, a JSON manifest generated from the user input is"},{"line_number":85,"context_line":"sent to object servers with an extra ``X-Static-Large-Object: True`` header"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_7c9728ed","line":82,"in_reply_to":"7f515b1d_5bd8207e","updated":"2017-10-06 01:38:05.000000000","message":"Or just always send a 202. I\u0027ll clarify how without the hearbeat, you\u0027d get something different, though.","commit_id":"e9424582667e9f81c6573fe69eb91b0e00548bcc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"863ad65dcef124bb87eaf8de3c20a94f2a50a9d5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":83,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Behind the scenes, on success, a JSON manifest generated from the user input is"},{"line_number":86,"context_line":"sent to object servers with an extra ``X-Static-Large-Object: True`` header"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f515b1d_3ef07267","line":83,"updated":"2017-10-06 16:48:42.000000000","message":"maybe an example body?","commit_id":"16dd8587b393a8a16d12ee28cb6a68e18f2da8aa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"863ad65dcef124bb87eaf8de3c20a94f2a50a9d5","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"    max_manifest_size \u003d int(conf.get(\u0027max_manifest_size\u0027,"},{"line_number":1265,"context_line":"                                     DEFAULT_MAX_MANIFEST_SIZE))"},{"line_number":1266,"context_line":"    yield_frequency \u003d int(conf.get(\u0027yield_frequency\u0027,"},{"line_number":1267,"context_line":"                                   DEFAULT_YIELD_FREQUENCY))"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    register_swift_info(\u0027slo\u0027,"},{"line_number":1270,"context_line":"                        max_manifest_segments\u003dmax_manifest_segments,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f515b1d_9eac0636","line":1267,"updated":"2017-10-06 16:48:42.000000000","message":"if you make this a float it might be easier to test functionally with smaller manifests - 0.001 might get a few yields out?","commit_id":"16dd8587b393a8a16d12ee28cb6a68e18f2da8aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ecd6dac86e7a4d361d75ae7e2984797d95227af4","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"    max_manifest_size \u003d int(conf.get(\u0027max_manifest_size\u0027,"},{"line_number":1265,"context_line":"                                     DEFAULT_MAX_MANIFEST_SIZE))"},{"line_number":1266,"context_line":"    yield_frequency \u003d int(conf.get(\u0027yield_frequency\u0027,"},{"line_number":1267,"context_line":"                                   DEFAULT_YIELD_FREQUENCY))"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    register_swift_info(\u0027slo\u0027,"},{"line_number":1270,"context_line":"                        max_manifest_segments\u003dmax_manifest_segments,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f515b1d_80d70050","line":1267,"in_reply_to":"7f515b1d_9eac0636","updated":"2017-10-06 20:56:45.000000000","message":"I thought about that, but erred on the side of being consistent with bulk\u0027s notion of yield_frequency.\n\nFor testing you could try 0 -- one space per segment :-)","commit_id":"16dd8587b393a8a16d12ee28cb6a68e18f2da8aa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"Note that large manifests may take a long time to verify; historically,"},{"line_number":76,"context_line":"clients would need to use a long read timeout for the connection to give"},{"line_number":77,"context_line":"Swift enough time to send a final ``201 Created`` or ``400 Bad Request``"},{"line_number":78,"context_line":"response. Now, clients should use the query parameters::"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_b0a3faff","line":78,"updated":"2017-10-18 01:43:45.000000000","message":"I like the part about \"now do this because you\u0027re awesome\" more than the \"blah blah things used to suck\" preamble, maybe the boring parts should be a footnote or omitted?","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":82,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":83,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":84,"context_line":"The format of the response body defaults to text/plain but can be either json"},{"line_number":85,"context_line":"or xml depending on the ``Accept`` header. An example body is as follows::"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Response Status: 201 Created"},{"line_number":88,"context_line":"    Response Body:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_10b2ce49","line":85,"updated":"2017-10-18 01:43:45.000000000","message":"xml?!  ewww","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    {\"Response Status\": \"201 Created\","},{"line_number":95,"context_line":"     \"Response Body\": \"\","},{"line_number":96,"context_line":"     \"Etag\": \"\\\\\"8f481cede6d2ddc07cb36aa084d9a64d\\\\\"\","},{"line_number":97,"context_line":"     \"Errors\": []}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"Behind the scenes, on success, a JSON manifest generated from the user input is"},{"line_number":100,"context_line":"sent to object servers with an extra ``X-Static-Large-Object: True`` header"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_30b70a3d","line":97,"updated":"2017-10-18 01:43:45.000000000","message":"fancy pants!","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    {\"Response Status\": \"201 Created\","},{"line_number":95,"context_line":"     \"Response Body\": \"\","},{"line_number":96,"context_line":"     \"Etag\": \"\\\\\"8f481cede6d2ddc07cb36aa084d9a64d\\\\\"\","},{"line_number":97,"context_line":"     \"Errors\": []}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"Behind the scenes, on success, a JSON manifest generated from the user input is"},{"line_number":100,"context_line":"sent to object servers with an extra ``X-Static-Large-Object: True`` header"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_035c7a23","line":97,"in_reply_to":"5f4e5783_30b70a3d","updated":"2017-10-24 19:07:04.000000000","message":"Yeah, I mainly wanted this for swift3 -- parsing plain text responses is for suckers!","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"            start_response(\u0027202 Accepted\u0027, [  # NB: not 201 !"},{"line_number":1045,"context_line":"                (\u0027Content-Type\u0027, out_content_type),"},{"line_number":1046,"context_line":"            ])"},{"line_number":1047,"context_line":"            separator \u003d \u0027\\r\\n\\r\\n\u0027"},{"line_number":1048,"context_line":"        data_for_storage \u003d [None] * len(parsed_data)"},{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"        def resp_iter():"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_108bee67","line":1047,"updated":"2017-10-18 01:43:45.000000000","message":"so we either call start_response here and set separator for the chunking...","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":1075,"context_line":"                else:"},{"line_number":1076,"context_line":"                    start_response(err.status,"},{"line_number":1077,"context_line":"                                   [(h, v) for h, v in resp.headers.items()"},{"line_number":1078,"context_line":"                                    if h.lower() !\u003d \u0027content-length\u0027])"},{"line_number":1079,"context_line":"                yield separator + get_response_body("},{"line_number":1080,"context_line":"                    out_content_type, resp_dict, problem_segments)"},{"line_number":1081,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_50da8677","line":1078,"updated":"2017-10-18 01:43:45.000000000","message":"of if separator is the empty string, we call start_response _here_","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"    register_swift_info(\u0027slo\u0027,"},{"line_number":1291,"context_line":"                        max_manifest_segments\u003dmax_manifest_segments,"},{"line_number":1292,"context_line":"                        max_manifest_size\u003dmax_manifest_size,"},{"line_number":1293,"context_line":"                        yield_frequency\u003dyield_frequency,"},{"line_number":1294,"context_line":"                        # this used to be configurable; report it as 1 for"},{"line_number":1295,"context_line":"                        # clients that might still care"},{"line_number":1296,"context_line":"                        min_segment_size\u003d1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_d0d7964a","line":1293,"updated":"2017-10-18 01:43:45.000000000","message":"I\u0027m ok with publishing this personally, any objections?","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1ee98208a5f4eeb5f6044b6aa15e9409d232debc","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"    register_swift_info(\u0027slo\u0027,"},{"line_number":1291,"context_line":"                        max_manifest_segments\u003dmax_manifest_segments,"},{"line_number":1292,"context_line":"                        max_manifest_size\u003dmax_manifest_size,"},{"line_number":1293,"context_line":"                        yield_frequency\u003dyield_frequency,"},{"line_number":1294,"context_line":"                        # this used to be configurable; report it as 1 for"},{"line_number":1295,"context_line":"                        # clients that might still care"},{"line_number":1296,"context_line":"                        min_segment_size\u003d1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_a080fc8c","line":1293,"in_reply_to":"5f4e5783_d0d7964a","updated":"2017-10-19 17:02:42.000000000","message":"I largely want it as a signal that heartbeat\u003don is a thing that\u0027s supported. You could just include it anyway, but then your client will need to handle both 201 and 202 in whatever response it gets -- if we expose it, you *could* make a decision about what to expect earlier (though swiftclient wouldn\u0027t; why waste the extra request?)","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":83,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":84,"context_line":"The format of the response body defaults to text/plain but can be either json"},{"line_number":85,"context_line":"or xml depending on the ``Accept`` header. An example body is as follows::"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_bcc43c92","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":28},"updated":"2017-10-24 18:40:46.000000000","message":"nit: maybe \u0027an immediate\u0027","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    ?multipart-manifest\u003dput\u0026heartbeat\u003don"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"to request that Swift send a ``202 Accepted`` response and periodic whitespace"},{"line_number":83,"context_line":"to keep the connection alive. A final response code will appear in the body."},{"line_number":84,"context_line":"The format of the response body defaults to text/plain but can be either json"},{"line_number":85,"context_line":"or xml depending on the ``Accept`` header. An example body is as follows::"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_fe3ce52f","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":28},"in_reply_to":"3f4b6375_bcc43c92","updated":"2017-10-24 19:07:04.000000000","message":"+1","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    :param app: The next WSGI filter or app in the paste.deploy chain."},{"line_number":888,"context_line":"    :param conf: The configuration dict for the middleware."},{"line_number":889,"context_line":"    \"\"\""},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def __init__(self, app, conf,"},{"line_number":892,"context_line":"                 max_manifest_segments\u003dDEFAULT_MAX_MANIFEST_SEGMENTS,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_fc5cf4ed","line":889,"range":{"start_line":889,"start_character":4,"end_line":889,"end_character":7},"updated":"2017-10-24 18:40:46.000000000","message":"nit: the optional params are missing","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    resp_dict[\u0027Response Status\u0027] \u003d err.status"},{"line_number":1075,"context_line":"                else:"},{"line_number":1076,"context_line":"                    start_response(err.status,"},{"line_number":1077,"context_line":"                                   [(h, v) for h, v in resp.headers.items()"},{"line_number":1078,"context_line":"                                    if h.lower() !\u003d \u0027content-length\u0027])"},{"line_number":1079,"context_line":"                yield separator + get_response_body("},{"line_number":1080,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_1840f9a4","line":1077,"range":{"start_line":1077,"start_character":35,"end_line":1077,"end_character":75},"updated":"2017-10-24 18:40:46.000000000","message":"sometimes I see backend headers for a good segment leaking through to the client 404 response\n\nsee http://paste.openstack.org/show/624503/\n\nresp is not necessarily the resp for the problem segment","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    resp_dict[\u0027Response Status\u0027] \u003d err.status"},{"line_number":1075,"context_line":"                else:"},{"line_number":1076,"context_line":"                    start_response(err.status,"},{"line_number":1077,"context_line":"                                   [(h, v) for h, v in resp.headers.items()"},{"line_number":1078,"context_line":"                                    if h.lower() !\u003d \u0027content-length\u0027])"},{"line_number":1079,"context_line":"                yield separator + get_response_body("},{"line_number":1080,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_be1b0dc8","line":1077,"range":{"start_line":1077,"start_character":35,"end_line":1077,"end_character":75},"in_reply_to":"3f4b6375_1840f9a4","updated":"2017-10-24 19:07:04.000000000","message":"Eep! Fairly certain I\u0027d meant to use err, not resp. That would seem to best match the\n\n raise HTTPBadRequest(...)\n\nthat I\u0027m replacing.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":1125,"context_line":"            resp_dict \u003d {\u0027Response Status\u0027: resp.status}"},{"line_number":1126,"context_line":"            if resp.is_success:"},{"line_number":1127,"context_line":"                resp.etag \u003d slo_etag"},{"line_number":1128,"context_line":"                resp_dict[\u0027Etag\u0027] \u003d resp.headers[\u0027Etag\u0027]"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_9205e716","line":1128,"range":{"start_line":1128,"start_character":16,"end_line":1128,"end_character":56},"updated":"2017-10-24 18:40:46.000000000","message":"should we also include Last-Modified? IDK, but it seems reasonable to pass the same info back to client as would have been in a non-heartbeat request, albeit in the body rather than headers.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":1125,"context_line":"            resp_dict \u003d {\u0027Response Status\u0027: resp.status}"},{"line_number":1126,"context_line":"            if resp.is_success:"},{"line_number":1127,"context_line":"                resp.etag \u003d slo_etag"},{"line_number":1128,"context_line":"                resp_dict[\u0027Etag\u0027] \u003d resp.headers[\u0027Etag\u0027]"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_5ee779ad","line":1128,"range":{"start_line":1128,"start_character":16,"end_line":1128,"end_character":56},"in_reply_to":"3f4b6375_9205e716","updated":"2017-10-24 19:07:04.000000000","message":"Sure, may as well, it\u0027s cheap.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":1127,"context_line":"                resp.etag \u003d slo_etag"},{"line_number":1128,"context_line":"                resp_dict[\u0027Etag\u0027] \u003d resp.headers[\u0027Etag\u0027]"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"},{"line_number":1132,"context_line":"                yield separator + get_response_body("},{"line_number":1133,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_f86abd17","line":1130,"range":{"start_line":1130,"start_character":15,"end_line":1130,"end_character":24},"updated":"2017-10-24 18:40:46.000000000","message":"I think \u0027if separator\u0027 is same as \u0027if heartbeat\u0027 - the latter might be clearer (same in some other places)","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":1127,"context_line":"                resp.etag \u003d slo_etag"},{"line_number":1128,"context_line":"                resp_dict[\u0027Etag\u0027] \u003d resp.headers[\u0027Etag\u0027]"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"},{"line_number":1132,"context_line":"                yield separator + get_response_body("},{"line_number":1133,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_bede6dd7","line":1130,"range":{"start_line":1130,"start_character":15,"end_line":1130,"end_character":24},"in_reply_to":"3f4b6375_f86abd17","updated":"2017-10-24 19:07:04.000000000","message":"Fair enough -- I\u0027d been thinking of separator as a sentinel for \"have already called start_response\", but that\u0027s in large part because earlier patchsets *wouldn\u0027t* necessarily have called start_response immediately -- instead it would attempt to do things the old way within 1 yield_frequency timeframe, then send the 202 if and only if it was going to yield any whitespace.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"59733d9d444ed4781c2fcb30c2c5deb9d4b7aff4","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"},{"line_number":1132,"context_line":"                yield separator + get_response_body("},{"line_number":1133,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"},{"line_number":1134,"context_line":"            else:"},{"line_number":1135,"context_line":"                for chunk in resp(req.environ, start_response):"},{"line_number":1136,"context_line":"                    yield chunk"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_b25ea341","line":1133,"range":{"start_line":1133,"start_character":49,"end_line":1133,"end_character":65},"updated":"2017-10-24 18:40:46.000000000","message":"this must be empty to reach here, I think? might be clearer to pass [] so there is no suggestion that we may be dealing with problems at this point.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"151bc77cea92411fb75d5438d02e62de405fa23e","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"            if separator:"},{"line_number":1131,"context_line":"                resp_dict[\u0027Response Body\u0027] \u003d resp.body"},{"line_number":1132,"context_line":"                yield separator + get_response_body("},{"line_number":1133,"context_line":"                    out_content_type, resp_dict, problem_segments, \u0027upload\u0027)"},{"line_number":1134,"context_line":"            else:"},{"line_number":1135,"context_line":"                for chunk in resp(req.environ, start_response):"},{"line_number":1136,"context_line":"                    yield chunk"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f4b6375_3ea15d47","line":1133,"range":{"start_line":1133,"start_character":49,"end_line":1133,"end_character":65},"in_reply_to":"3f4b6375_b25ea341","updated":"2017-10-24 19:07:04.000000000","message":"Good point -- I think it was just a hold-over from when I copy/pasted it from the error handling.","commit_id":"8bf91bbc3522855afda7dd1ea775cb90b37d375a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    {\"Response Status\": \"201 Created\","},{"line_number":97,"context_line":"     \"Response Body\": \"\","},{"line_number":98,"context_line":"     \"Etag\": \"\\\\\"8f481cede6d2ddc07cb36aa084d9a64d\\\\\"\","},{"line_number":99,"context_line":"     \"Last Modified\": \"Wed, 25 Oct 2017 17:08:55 GMT\","},{"line_number":100,"context_line":"     \"Errors\": []}"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_e037b7fd","line":98,"range":{"start_line":98,"start_character":14,"end_line":98,"end_character":16},"updated":"2017-11-02 18:17:57.000000000","message":"nit: the double backslash is needed for rst processing but is misleading if one is simply reading the docstring. I\u0027m pretty sure it can be avoided by making the whole doctsring a raw string literal. i.e.\n\n  r\"\"\"\n\nat line 16","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":294,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"},{"line_number":295,"context_line":"from swift.common.http import HTTP_NOT_FOUND, HTTP_UNAUTHORIZED, is_success"},{"line_number":296,"context_line":"from swift.common.wsgi import WSGIContext, make_subrequest"},{"line_number":297,"context_line":"from swift.common.middleware.bulk import get_response_body, \\"},{"line_number":298,"context_line":"    ACCEPTABLE_FORMATS, Bulk"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"DEFAULT_RATE_LIMIT_UNDER_SIZE \u003d 1024 * 1024  # 1 MiB"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_69717344","line":298,"range":{"start_line":297,"start_character":41,"end_line":298,"end_character":22},"updated":"2017-11-02 18:17:57.000000000","message":"off-topic: I wonder if we should relocate these to a shared module. common/middleware/__init__.py perhaps?","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"        separator \u003d \u0027\u0027"},{"line_number":1053,"context_line":"        if heartbeat:"},{"line_number":1054,"context_line":"            req.environ[\u0027eventlet.minimum_write_chunk_size\u0027] \u003d 0"},{"line_number":1055,"context_line":"            start_response(\u0027202 Accepted\u0027, [  # NB: not 201 !"},{"line_number":1056,"context_line":"                (\u0027Content-Type\u0027, out_content_type),"},{"line_number":1057,"context_line":"            ])"},{"line_number":1058,"context_line":"            separator \u003d \u0027\\r\\n\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_af53eb6a","line":1055,"range":{"start_line":1055,"start_character":12,"end_line":1055,"end_character":26},"updated":"2017-11-02 18:17:57.000000000","message":"start_response calls should not be propagated until some data has been yielded, which is not until yield_frequency has passed.\n\nwhen I use heartbeat_on I did not see the 202 response until yield_interval had passed, which is a tease for the client. do we need to wait before sending the 202?\n\nunfortunately in a previous review I suggested that the 202 should be decribed as an *immediate* response, which I now realise is not the case :/","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"                err \u003d HTTPBadRequest(content_type\u003dout_content_type)"},{"line_number":1083,"context_line":"                resp_dict \u003d {}"},{"line_number":1084,"context_line":"                if heartbeat:"},{"line_number":1085,"context_line":"                    resp_dict[\u0027Response Status\u0027] \u003d err.status"},{"line_number":1086,"context_line":"                else:"},{"line_number":1087,"context_line":"                    start_response(err.status,"},{"line_number":1088,"context_line":"                                   [(h, v) for h, v in err.headers.items()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_e901e36b","line":1085,"updated":"2017-11-02 18:17:57.000000000","message":"for consistency I think resp_dict should have \u0027Response Body\u0027 here too, albeit an empty string. That will match the etag mismatch case at line 1111 and also the expectation that could be reasonably inferred from the docstring.\n\nI may be wrong, and maybe this was deliberately omitted - the non-heartbeat response body in this case is the error list, which in the heartbeat case has it\u0027s own entry in the actual body.\n\nIDK, it just confused me WRT the docstring to not see Response Body here.","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"}],"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ecd6dac86e7a4d361d75ae7e2984797d95227af4","unresolved":false,"context_lines":[{"line_number":1157,"context_line":"                self.logger.debug(log_line)"},{"line_number":1158,"context_line":"            else:"},{"line_number":1159,"context_line":"                self.logger.info(log_line)"},{"line_number":1160,"context_line":"        if True or req.method in (\u0027PUT\u0027, \u0027DELETE\u0027):"},{"line_number":1161,"context_line":"            slow \u003d self.slow - trans_time"},{"line_number":1162,"context_line":"            if slow \u003e 0:"},{"line_number":1163,"context_line":"                sleep(slow)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f515b1d_ef169fa7","line":1160,"updated":"2017-10-06 20:56:45.000000000","message":"Heh, whoops. Left over from my own testing ;-)","commit_id":"16dd8587b393a8a16d12ee28cb6a68e18f2da8aa"}],"test/functional/test_slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":804,"context_line":"                             seg_info[\u0027seg_c\u0027], seg_info[\u0027seg_d\u0027],"},{"line_number":805,"context_line":"                             seg_info[\u0027seg_e\u0027]]"},{"line_number":806,"context_line":"            if include_error:"},{"line_number":807,"context_line":"                manifest_data.append({\u0027path\u0027: \u0027non-existent/segment\u0027})"},{"line_number":808,"context_line":"            resp \u003d file_item.write("},{"line_number":809,"context_line":"                json.dumps(manifest_data),"},{"line_number":810,"context_line":"                parms\u003d{\u0027multipart-manifest\u0027: \u0027put\u0027, \u0027heartbeat\u0027: \u0027on\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_90423e0e","line":807,"updated":"2017-10-18 01:43:45.000000000","message":"NOiCE!","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0716d2c914b617dcf63fe9a760b0099ad7019cc","unresolved":false,"context_lines":[{"line_number":857,"context_line":"            \u0027Errors\u0027: ["},{"line_number":858,"context_line":"                [\u0027non-existent/segment\u0027, \u0027404 Not Found\u0027],"},{"line_number":859,"context_line":"            ],"},{"line_number":860,"context_line":"        })"},{"line_number":861,"context_line":""},{"line_number":862,"context_line":"    def _make_manifest(self):"},{"line_number":863,"context_line":"        file_item \u003d self.env.container.file(\"manifest-post\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f4e5783_5048462b","line":860,"updated":"2017-10-18 01:43:45.000000000","message":"lol @ #xmlisforsuckers","commit_id":"8fb84552294f8e9205c16c5f3a48e6799c869e53"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9892ad973bb1a67efbb0ea845743487021a0c8af","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            [\u0027/cont/object\u0027, \u0027Etag Mismatch\u0027],"},{"line_number":616,"context_line":"            [quote(u\u0027/cont/object\\u2661\u0027.encode(\u0027utf8\u0027)), \u0027Size Mismatch\u0027],"},{"line_number":617,"context_line":"        ])"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    def test_manifest_put_no_etag_success(self):"},{"line_number":620,"context_line":"        req \u003d Request.blank("},{"line_number":621,"context_line":"            \u0027/v1/AUTH_test/c/man?multipart-manifest\u003dput\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_cdacecee","line":618,"updated":"2017-11-02 18:17:57.000000000","message":"nit: could add a test with etag mismatch -\u003e 422 response status","commit_id":"6bec94f69eea7ca14a0b61ddb6221bcf72e2002e"}]}
