)]}'
{"etc/proxy-server.conf-sample":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"# If set to false will treat objects with X-Static-Large-Object header set"},{"line_number":155,"context_line":"# as a regular object on GETs, i.e. will return that object\u0027s contents. Should"},{"line_number":156,"context_line":"# be set to false if slo is not used in pipeline."},{"line_number":157,"context_line":"# allow_static_large_object \u003d true"},{"line_number":158,"context_line":"#"},{"line_number":159,"context_line":"# The maximum time (seconds) that a large object connection is allowed to last."},{"line_number":160,"context_line":"# max_large_object_get_time \u003d 86400"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F9zBw%3D","side":"PARENT","line":157,"updated":"2013-12-05 20:22:35.000000000","message":"Would it be worth having the proxy server log a warning message if this configuration option is true?","commit_id":"80a9f7013a2016251219ccd9f02781366710dcd2"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":154,"context_line":"# If set to false will treat objects with X-Static-Large-Object header set"},{"line_number":155,"context_line":"# as a regular object on GETs, i.e. will return that object\u0027s contents. Should"},{"line_number":156,"context_line":"# be set to false if slo is not used in pipeline."},{"line_number":157,"context_line":"# allow_static_large_object \u003d true"},{"line_number":158,"context_line":"#"},{"line_number":159,"context_line":"# The maximum time (seconds) that a large object connection is allowed to last."},{"line_number":160,"context_line":"# max_large_object_get_time \u003d 86400"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F9xzU%3D","side":"PARENT","line":157,"in_reply_to":"AAAATn%2F9zBw%3D","updated":"2013-12-06 20:11:45.000000000","message":"Probably not, IMO. The only time you\u0027d get a behavior change on upgrade is if you had slo in the pipeline, but had allow_static_large_object \u003d false in your proxy config (or vice versa) and that\u0027s a weird, half-broken state anyway.","commit_id":"80a9f7013a2016251219ccd9f02781366710dcd2"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.listing_iter \u003d listing_iter"},{"line_number":219,"context_line":"        self.max_get_time \u003d max_get_time"},{"line_number":220,"context_line":"        self.name \u003d name"},{"line_number":221,"context_line":"        self.logger \u003d logger"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def app_iter_range(self, *a, **kw):"},{"line_number":224,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y7E%3D","line":221,"updated":"2013-12-05 20:22:35.000000000","message":"Can you add a test that uses a logger so that we can verify the logging calls don\u0027t fail?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a2813852a8097dba2f45f2af20e39af2140e77a0","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.listing_iter \u003d listing_iter"},{"line_number":219,"context_line":"        self.max_get_time \u003d max_get_time"},{"line_number":220,"context_line":"        self.name \u003d name"},{"line_number":221,"context_line":"        self.logger \u003d logger"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def app_iter_range(self, *a, **kw):"},{"line_number":224,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9tpk%3D","line":221,"in_reply_to":"AAAATn%2F9y7E%3D","updated":"2013-12-06 20:20:24.000000000","message":"Turns out it\u0027s always getting a logger; there\u0027s only one instantiator of SloIterable, and it always passes in a logger.\n\nHow about if I remove the default value instead?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                    yield sub_seg_dict, sb, eb"},{"line_number":391,"context_line":"            else:"},{"line_number":392,"context_line":"                if isinstance(seg_dict[\u0027name\u0027], unicode):"},{"line_number":393,"context_line":"                    seg_dict[\u0027name\u0027] \u003d seg_dict[\u0027name\u0027].encode(\"utf-8\")"},{"line_number":394,"context_line":"                seg_length \u003d int(seg_dict[\u0027bytes\u0027])"},{"line_number":395,"context_line":"                yield (seg_dict,"},{"line_number":396,"context_line":"                       (None if first_byte \u003c\u003d 0 else first_byte),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y7M%3D","line":393,"updated":"2013-12-05 20:22:35.000000000","message":"Unit tests for the slo middleware do not cover unicode names.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                    yield sub_seg_dict, sb, eb"},{"line_number":391,"context_line":"            else:"},{"line_number":392,"context_line":"                if isinstance(seg_dict[\u0027name\u0027], unicode):"},{"line_number":393,"context_line":"                    seg_dict[\u0027name\u0027] \u003d seg_dict[\u0027name\u0027].encode(\"utf-8\")"},{"line_number":394,"context_line":"                seg_length \u003d int(seg_dict[\u0027bytes\u0027])"},{"line_number":395,"context_line":"                yield (seg_dict,"},{"line_number":396,"context_line":"                       (None if first_byte \u003c\u003d 0 else first_byte),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9x2M%3D","line":393,"in_reply_to":"AAAATn%2F9y7M%3D","updated":"2013-12-06 20:11:45.000000000","message":"FWIW, functional tests do. I didn\u0027t have this originally, but the UTF8 functional tests fail without it.\n\nStill, not a bad idea to add a unit test. Will fix.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"33c553a3a27f81d3801706f085d4b0a47f1fa391","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        plain_listing_iter \u003d self._segment_listing_iterator("},{"line_number":488,"context_line":"            req, ver, account, segments, first_byte, last_byte)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        ratelimited_listing_iter \u003d RateLimitedIterator("},{"line_number":491,"context_line":"            plain_listing_iter,"},{"line_number":492,"context_line":"            self.slo.rate_limit_segments_per_sec,"},{"line_number":493,"context_line":"            limit_after\u003dself.slo.rate_limit_after_segment)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zAU%3D","line":490,"updated":"2013-12-05 21:05:23.000000000","message":"Is this rate limiting the listing or the retrieval of the segments? Thought I saw rate limiting on the segments in the core code but not on HEAD","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        plain_listing_iter \u003d self._segment_listing_iterator("},{"line_number":488,"context_line":"            req, ver, account, segments, first_byte, last_byte)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        ratelimited_listing_iter \u003d RateLimitedIterator("},{"line_number":491,"context_line":"            plain_listing_iter,"},{"line_number":492,"context_line":"            self.slo.rate_limit_segments_per_sec,"},{"line_number":493,"context_line":"            limit_after\u003dself.slo.rate_limit_after_segment)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9x14%3D","line":490,"in_reply_to":"AAAATn%2F9zAU%3D","updated":"2013-12-06 20:11:45.000000000","message":"It\u0027s limiting the listing, but I think that has the same effect of only allowing N segments per second to be processed.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":558,"context_line":""},{"line_number":559,"context_line":"    def copy_response_hook(self, inner_hook):"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        def slo_hook(req, resp):"},{"line_number":562,"context_line":"            if (config_true_value(resp.headers.get(\u0027X-Static-Large-Object\u0027))"},{"line_number":563,"context_line":"                    and req.params.get(\u0027multipart-manifest\u0027) !\u003d \u0027get\u0027):"},{"line_number":564,"context_line":"                return SloGetContext(self).get_or_head_response("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y7U%3D","line":561,"updated":"2013-12-05 20:22:35.000000000","message":"The slo_hook internal method does not appear to be called when just the slo middleware tests are run. Is that fixable?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":558,"context_line":""},{"line_number":559,"context_line":"    def copy_response_hook(self, inner_hook):"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        def slo_hook(req, resp):"},{"line_number":562,"context_line":"            if (config_true_value(resp.headers.get(\u0027X-Static-Large-Object\u0027))"},{"line_number":563,"context_line":"                    and req.params.get(\u0027multipart-manifest\u0027) !\u003d \u0027get\u0027):"},{"line_number":564,"context_line":"                return SloGetContext(self).get_or_head_response("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9x1U%3D","line":561,"in_reply_to":"AAAATn%2F9y7U%3D","updated":"2013-12-06 20:11:45.000000000","message":"I wasn\u0027t sure how to go about it, honestly. This is one spot where the middleware has to do more than plain-WSGI stuff and really get tightly coupled with some code in the proxy server. I started to write a focused test here, but it felt like one of those unit tests with MagicMocks all over the place where you\u0027re not sure if it\u0027s really testing anything or not.\n\nAs an aside: I thought about pulling the implementation of the COPY verb out into middleware, but that won\u0027t work due to asymmetries in GET vs. PUT. Specifically, a GET of a SLO manifest has \"X-Static-Large-Object: true\" in the headers, but if you try a PUT with that then you get a 400, and you get other, different wackiness with the X-Object-Manifest header on a DLO manifest. That could be resolved with a bunch of special cases in the hypothetical COPY middleware, but that cure seems worse than the disease.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"9cda599853d3ac41739d23fc15e0ebb30aaa287a","unresolved":false,"context_lines":[{"line_number":628,"context_line":"            new_env[\u0027HTTP_USER_AGENT\u0027] \u003d \\"},{"line_number":629,"context_line":"                \u0027%s MultipartPUT\u0027 % req.environ.get(\u0027HTTP_USER_AGENT\u0027)"},{"line_number":630,"context_line":"            head_seg_resp \u003d \\"},{"line_number":631,"context_line":"                Request.blank(obj_path, new_env).get_response(self)"},{"line_number":632,"context_line":"            if head_seg_resp.is_success:"},{"line_number":633,"context_line":"                total_size +\u003d seg_size"},{"line_number":634,"context_line":"                if seg_size !\u003d head_seg_resp.content_length:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zD0%3D","line":631,"updated":"2013-12-05 19:42:16.000000000","message":"just starting looking but quick question - doesn\u0027t this change reference the StaticLargeObject object now instead of the middleware object?  How does it work and why was the change needed?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":628,"context_line":"            new_env[\u0027HTTP_USER_AGENT\u0027] \u003d \\"},{"line_number":629,"context_line":"                \u0027%s MultipartPUT\u0027 % req.environ.get(\u0027HTTP_USER_AGENT\u0027)"},{"line_number":630,"context_line":"            head_seg_resp \u003d \\"},{"line_number":631,"context_line":"                Request.blank(obj_path, new_env).get_response(self)"},{"line_number":632,"context_line":"            if head_seg_resp.is_success:"},{"line_number":633,"context_line":"                total_size +\u003d seg_size"},{"line_number":634,"context_line":"                if seg_size !\u003d head_seg_resp.content_length:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9x1M%3D","line":631,"in_reply_to":"AAAATn%2F9zD0%3D","updated":"2013-12-06 20:11:45.000000000","message":"The etag of a SLO manifest is defined as the MD5 of its segments\u0027 etags. Before, that computation was done down in the proxy server, so a request to self.app would get the right etag. This patch moves that computation in to the StaticLargeObject middleware, so we need to go through our own HEAD handling to receive the right etag.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"cfd740094af326eb35b2cf22fb74a35725e476f8","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        Will handle the PUT of a SLO manifest."},{"line_number":597,"context_line":"        Heads every object in manifest to check if is valid and if so will"},{"line_number":598,"context_line":"        save a manifest generated from the user input. Uses WSGIContext to"},{"line_number":599,"context_line":"        call self.app and start_response and returns a WSGI iterator."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        :params req: a swob.Request with an obj in path"},{"line_number":602,"context_line":"        :raises: HttpException on errors"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9g0M%3D","line":599,"updated":"2013-12-10 18:42:00.000000000","message":"I believe this should be \"call self\" now instead of \"call self.app\"","commit_id":"c13aab653bf25c3be84f295c31f6c8d00db14786"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"079e9a1701b703cbc435e77ad829ac97733ba2fd","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        Will handle the PUT of a SLO manifest."},{"line_number":597,"context_line":"        Heads every object in manifest to check if is valid and if so will"},{"line_number":598,"context_line":"        save a manifest generated from the user input. Uses WSGIContext to"},{"line_number":599,"context_line":"        call self.app and start_response and returns a WSGI iterator."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        :params req: a swob.Request with an obj in path"},{"line_number":602,"context_line":"        :raises: HttpException on errors"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9gkE%3D","line":599,"in_reply_to":"AAAATn%2F9g0M%3D","updated":"2013-12-10 20:08:18.000000000","message":"Will fix.","commit_id":"c13aab653bf25c3be84f295c31f6c8d00db14786"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b430bdefb0c2835422cb0ddc3a678361c307f8d3","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        Will handle the PUT of a SLO manifest."},{"line_number":597,"context_line":"        Heads every object in manifest to check if is valid and if so will"},{"line_number":598,"context_line":"        save a manifest generated from the user input. Uses WSGIContext to"},{"line_number":599,"context_line":"        call self.app and start_response and returns a WSGI iterator."},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        :params req: a swob.Request with an obj in path"},{"line_number":602,"context_line":"        :raises: HttpException on errors"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9foU%3D","line":599,"in_reply_to":"AAAATn%2F9gkE%3D","updated":"2013-12-10 22:49:17.000000000","message":"Done","commit_id":"c13aab653bf25c3be84f295c31f6c8d00db14786"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"ba25956915f704dab1c9688a09bfb8c97005731a","unresolved":false,"context_lines":[{"line_number":824,"context_line":"                    return self.handle_multipart_delete(req)(env,"},{"line_number":825,"context_line":"                                                             start_response)"},{"line_number":826,"context_line":"                if ((req.method \u003d\u003d \u0027GET\u0027 or req.method \u003d\u003d \u0027HEAD\u0027) and"},{"line_number":827,"context_line":"                        req.params.get(\u0027multipart-manifest\u0027) !\u003d \u0027get\u0027):"},{"line_number":828,"context_line":"                    return self.handle_multipart_get_or_head(req,"},{"line_number":829,"context_line":"                                                             start_response)"},{"line_number":830,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9rjI%3D","line":827,"updated":"2013-12-10 02:40:00.000000000","message":"FWIW: I realize this is existing behavior, but doesn\u0027t this check allow a query parameter of multipart-manifest\u003dput to work here just as well as no multipart-manifest parameter present?","commit_id":"c13aab653bf25c3be84f295c31f6c8d00db14786"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"079e9a1701b703cbc435e77ad829ac97733ba2fd","unresolved":false,"context_lines":[{"line_number":824,"context_line":"                    return self.handle_multipart_delete(req)(env,"},{"line_number":825,"context_line":"                                                             start_response)"},{"line_number":826,"context_line":"                if ((req.method \u003d\u003d \u0027GET\u0027 or req.method \u003d\u003d \u0027HEAD\u0027) and"},{"line_number":827,"context_line":"                        req.params.get(\u0027multipart-manifest\u0027) !\u003d \u0027get\u0027):"},{"line_number":828,"context_line":"                    return self.handle_multipart_get_or_head(req,"},{"line_number":829,"context_line":"                                                             start_response)"},{"line_number":830,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F9gjI%3D","line":827,"in_reply_to":"AAAATn%2F9rjI%3D","updated":"2013-12-10 20:08:18.000000000","message":"Yep, sure does.\n\nLike you said, existing behavior.","commit_id":"c13aab653bf25c3be84f295c31f6c8d00db14786"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4587d155b54e398107afc3bfb0f9db3ed88e7008","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    HTTPMethodNotAllowed, HTTPRequestEntityTooLarge, HTTPLengthRequired, \\"},{"line_number":148,"context_line":"    HTTPOk, HTTPPreconditionFailed, HTTPException, HTTPNotFound, \\"},{"line_number":149,"context_line":"    HTTPUnauthorized, HTTPRequestedRangeNotSatisfiable, Response"},{"line_number":150,"context_line":"from swift.common.utils import json, get_logger, config_true_value, \\"},{"line_number":151,"context_line":"    get_valid_utf8_str, override_bytes_from_content_type, split_path, \\"},{"line_number":152,"context_line":"    register_swift_info, RateLimitedIterator"},{"line_number":153,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2FqCU%3D","line":150,"updated":"2014-01-04 06:06:21.000000000","message":"I ended doing both: backslash at the first line and then imports in parenthesises. pep8 seems eating that, and the list is not in the right 40 columns.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d3cc5654ebf34e0d23f5304bc9ce5966bbf89aa8","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    HTTPMethodNotAllowed, HTTPRequestEntityTooLarge, HTTPLengthRequired, \\"},{"line_number":148,"context_line":"    HTTPOk, HTTPPreconditionFailed, HTTPException, HTTPNotFound, \\"},{"line_number":149,"context_line":"    HTTPUnauthorized, HTTPRequestedRangeNotSatisfiable, Response"},{"line_number":150,"context_line":"from swift.common.utils import json, get_logger, config_true_value, \\"},{"line_number":151,"context_line":"    get_valid_utf8_str, override_bytes_from_content_type, split_path, \\"},{"line_number":152,"context_line":"    register_swift_info, RateLimitedIterator"},{"line_number":153,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F%2Bdg%3D","line":150,"in_reply_to":"AAAAT3%2F%2FqCU%3D","updated":"2014-01-05 22:16:59.000000000","message":"Hm, pep8 doesn\u0027t have a problem with this on my system. Different version perhaps?\n\nI mostly did this so it looked like the long import lines above and below it.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"942384392cac26dd6ecfc700dd999e363e75e55f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    HTTPMethodNotAllowed, HTTPRequestEntityTooLarge, HTTPLengthRequired, \\"},{"line_number":148,"context_line":"    HTTPOk, HTTPPreconditionFailed, HTTPException, HTTPNotFound, \\"},{"line_number":149,"context_line":"    HTTPUnauthorized, HTTPRequestedRangeNotSatisfiable, Response"},{"line_number":150,"context_line":"from swift.common.utils import json, get_logger, config_true_value, \\"},{"line_number":151,"context_line":"    get_valid_utf8_str, override_bytes_from_content_type, split_path, \\"},{"line_number":152,"context_line":"    register_swift_info, RateLimitedIterator"},{"line_number":153,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2FwOc%3D","line":150,"in_reply_to":"AAAAUH%2F%2F%2BRA%3D","updated":"2014-01-08 21:08:49.000000000","message":"I\u0027m a little confused; is this line actually causing problems for folks? If so, I can fix it, but it looks okay to me, and it looks just like the previous import statement.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"fcb45258befbe5b7497d20dcb36052c208ba266b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    HTTPMethodNotAllowed, HTTPRequestEntityTooLarge, HTTPLengthRequired, \\"},{"line_number":148,"context_line":"    HTTPOk, HTTPPreconditionFailed, HTTPException, HTTPNotFound, \\"},{"line_number":149,"context_line":"    HTTPUnauthorized, HTTPRequestedRangeNotSatisfiable, Response"},{"line_number":150,"context_line":"from swift.common.utils import json, get_logger, config_true_value, \\"},{"line_number":151,"context_line":"    get_valid_utf8_str, override_bytes_from_content_type, split_path, \\"},{"line_number":152,"context_line":"    register_swift_info, RateLimitedIterator"},{"line_number":153,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F%2BRA%3D","line":150,"in_reply_to":"AAAAUH%2F%2F%2Bdg%3D","updated":"2014-01-06 00:54:11.000000000","message":"IME, pep8 is happiest with something like:\n\n  from X import (...\n      ...)\n\nWith all the newlines you want inside the parens with no back-slashes.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"30b3d61ee39edc9b16d585a80192f7cce88a08dc","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    HTTPMethodNotAllowed, HTTPRequestEntityTooLarge, HTTPLengthRequired, \\"},{"line_number":148,"context_line":"    HTTPOk, HTTPPreconditionFailed, HTTPException, HTTPNotFound, \\"},{"line_number":149,"context_line":"    HTTPUnauthorized, HTTPRequestedRangeNotSatisfiable, Response"},{"line_number":150,"context_line":"from swift.common.utils import json, get_logger, config_true_value, \\"},{"line_number":151,"context_line":"    get_valid_utf8_str, override_bytes_from_content_type, split_path, \\"},{"line_number":152,"context_line":"    register_swift_info, RateLimitedIterator"},{"line_number":153,"context_line":"from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2Filw%3D","line":150,"in_reply_to":"AAAAUH%2F%2FwOc%3D","updated":"2014-01-12 04:03:31.000000000","message":"I don\u0027t know if it\u0027s causing any problems; I just said what I said because PEP8 actually says, \"The preferred way of wrapping long lines is by using Python\u0027s implied line continuation inside parentheses, brackets and braces. Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.\"\n\n...so if there *were* problems, using parens might help.\n\nI don\u0027t actually know what Pete was saying.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"}],"swift/common/utils.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"33c553a3a27f81d3801706f085d4b0a47f1fa391","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        raise ValueError(\u0027Invalid partition: %s\u0027 % quote(partition or \u0027\u0027))"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"class RateLimitedIterator(object):"},{"line_number":615,"context_line":"    \"\"\""},{"line_number":616,"context_line":"    Wrap an iterator to only yield elements at a rate of N per second."},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9zAA%3D","line":614,"updated":"2013-12-05 21:05:23.000000000","message":"Just curious if you know of other existing code that can make use of this new wrapper","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        raise ValueError(\u0027Invalid partition: %s\u0027 % quote(partition or \u0027\u0027))"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"class RateLimitedIterator(object):"},{"line_number":615,"context_line":"    \"\"\""},{"line_number":616,"context_line":"    Wrap an iterator to only yield elements at a rate of N per second."},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9xzE%3D","line":614,"in_reply_to":"AAAATn%2F9zAA%3D","updated":"2013-12-06 20:11:45.000000000","message":"I thought about using it for DLOs, but I\u0027ve got a half-baked patch to move those out to middleware (and that patch uses RateLimitedIterator in it), so it didn\u0027t seem worth it to make that change on master only to throw out that code very shortly thereafter.\n\nThere may well be other places, but I don\u0027t know of any off the top of my head.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        self.running_time \u003d 0"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def __iter__(self):"},{"line_number":631,"context_line":"        return self"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def next(self):"},{"line_number":634,"context_line":"        if self.limit_after \u003e 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y7k%3D","line":631,"updated":"2013-12-05 20:22:35.000000000","message":"No unit tests apparently cover this method.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"379351e095c6aa849f3a031c52a64e3d85049d45","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        self.running_time \u003d 0"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def __iter__(self):"},{"line_number":631,"context_line":"        return self"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def next(self):"},{"line_number":634,"context_line":"        if self.limit_after \u003e 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9tCQ%3D","line":631,"in_reply_to":"AAAATn%2F9y7k%3D","updated":"2013-12-06 22:45:58.000000000","message":"Bug in coverage.py, perhaps? If I comment it out, lots of tests fail (all in test_slo.py since slo is the only thing using this class).","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"33c553a3a27f81d3801706f085d4b0a47f1fa391","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def _load_next_segment(self):"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        Loads the self.segment_iter with the next object segment\u0027s contents."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises: StopIteration when there are no more object segments"},{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y%2FA%3D","line":139,"updated":"2013-12-05 21:05:23.000000000","message":"might be helpful to put a comment in the DLO support functions that state they\u0027re for \"DLO support only (SLO support in middle-ware)\" or something like that","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def _load_next_segment(self):"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        Loads the self.segment_iter with the next object segment\u0027s contents."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises: StopIteration when there are no more object segments"},{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9tw8%3D","line":139,"in_reply_to":"AAAATn%2F9y%2FA%3D","updated":"2013-12-06 20:11:45.000000000","message":"I\u0027m also working on hoisting DLOs out to middleware, so this code is not long for this world.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"33c553a3a27f81d3801706f085d4b0a47f1fa391","unresolved":false,"context_lines":[{"line_number":894,"context_line":"            self.container_name \u003d orig_container_name"},{"line_number":895,"context_line":"            new_req \u003d Request.blank(req.path_info,"},{"line_number":896,"context_line":"                                    environ\u003dreq.environ, headers\u003dreq.headers)"},{"line_number":897,"context_line":"            data_source \u003d iter(source_resp.app_iter)"},{"line_number":898,"context_line":"            new_req.content_length \u003d source_resp.content_length"},{"line_number":899,"context_line":"            if new_req.content_length is None:"},{"line_number":900,"context_line":"                # This indicates a transfer-encoding: chunked source object,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y9Q%3D","line":897,"updated":"2013-12-05 21:05:23.000000000","message":"is the just \"better python\"?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":894,"context_line":"            self.container_name \u003d orig_container_name"},{"line_number":895,"context_line":"            new_req \u003d Request.blank(req.path_info,"},{"line_number":896,"context_line":"                                    environ\u003dreq.environ, headers\u003dreq.headers)"},{"line_number":897,"context_line":"            data_source \u003d iter(source_resp.app_iter)"},{"line_number":898,"context_line":"            new_req.content_length \u003d source_resp.content_length"},{"line_number":899,"context_line":"            if new_req.content_length is None:"},{"line_number":900,"context_line":"                # This indicates a transfer-encoding: chunked source object,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9ttU%3D","line":897,"in_reply_to":"AAAATn%2F9y9Q%3D","updated":"2013-12-06 20:11:45.000000000","message":"If we\u0027re copying a SLO then we need it.\n\nThe Python iterable contract is basically that if you have an iterable x, then you can get an iterator by calling x_it \u003d iter(X), then you call x_it.next() repeatedly to get values until x_it.next() raises StopIteration, and then it\u0027s exhausted.\n\nWSGI says that your application must return an iterable (seen here as source_resp.app_iter), not just an iterator.\n\nIf we\u0027re copying a SLO, then source_resp.app_iter here is a swift.common.middleware.slo.SloIterable, which is an iterable object, but not an iterator, so we need the iter() call to make it an iterator.\n\nNote that iter(an-iterator) returns an-iterator, so this shouldn\u0027t hurt any existing callers.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4587d155b54e398107afc3bfb0f9db3ed88e7008","unresolved":false,"context_lines":[{"line_number":884,"context_line":"            orig_container_name \u003d self.container_name"},{"line_number":885,"context_line":"            self.object_name \u003d src_obj_name"},{"line_number":886,"context_line":"            self.container_name \u003d src_container_name"},{"line_number":887,"context_line":"            # This gives middlewares a way to change the source; for example,"},{"line_number":888,"context_line":"            # this lets you COPY a SLO manifest and have the new object be the"},{"line_number":889,"context_line":"            # concatenation of the segments (like what a GET request gives"},{"line_number":890,"context_line":"            # the client), not a copy of the manifest file."}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAT3%2F%2FqAw%3D","line":887,"updated":"2014-01-04 06:06:21.000000000","message":"Fat lot of good this COPY is going to do if the total length exceeds max object size, is it not? Is this how the existing code works?","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d3cc5654ebf34e0d23f5304bc9ce5966bbf89aa8","unresolved":false,"context_lines":[{"line_number":884,"context_line":"            orig_container_name \u003d self.container_name"},{"line_number":885,"context_line":"            self.object_name \u003d src_obj_name"},{"line_number":886,"context_line":"            self.container_name \u003d src_container_name"},{"line_number":887,"context_line":"            # This gives middlewares a way to change the source; for example,"},{"line_number":888,"context_line":"            # this lets you COPY a SLO manifest and have the new object be the"},{"line_number":889,"context_line":"            # concatenation of the segments (like what a GET request gives"},{"line_number":890,"context_line":"            # the client), not a copy of the manifest file."}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F%2Bdk%3D","line":887,"in_reply_to":"AAAAT3%2F%2FqAw%3D","updated":"2014-01-05 22:16:59.000000000","message":"Yes, this is just preserving existing behavior. \n\nFWIW, DLOs do things the same way, and have the same problem with \u003e5GiB objects.","commit_id":"dcf9489969c74bce7aadda4ec0ee2323b1754d93"}],"test/functional/tests.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"66d047cf8d741fd87b6ff9b786fa1bd46b030423","unresolved":false,"context_lines":[{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def test_slo_copy_the_manifest(self):"},{"line_number":1946,"context_line":"        file_item \u003d self.env.container.file(\"manifest-abcde\")"},{"line_number":1947,"context_line":"        file_item.copy(self.env.container.name, \"copied-abcde-manifest-only\","},{"line_number":1948,"context_line":"                       parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":1949,"context_line":""},{"line_number":1950,"context_line":"        copied \u003d self.env.container.file(\"copied-abcde-manifest-only\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9R%2F8%3D","line":1947,"updated":"2013-12-13 03:56:08.000000000","message":"I reverted these lines in my SAIO and the tests did not fail. Is this fixing anything or just ensuring a different container is being used from test_slo_copy() above?","commit_id":"8e90de009e6f8cf270e967b2dfbd690a9e54007c"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"cbeb5fe9b233159fb7601a3129c7f3ccfcb2fa7a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                start \u003d 0"},{"line_number":96,"context_line":"            if end is None:"},{"line_number":97,"context_line":"                end \u003d len(body)"},{"line_number":98,"context_line":"            resp_class \u003d swob.HTTPPartialContent"},{"line_number":99,"context_line":"            body \u003d body[start:end + 1]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        return resp_class(headers\u003dheaders, body\u003dbody)(env, start_response)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9y8g%3D","line":98,"updated":"2013-12-05 20:22:35.000000000","message":"So should the this fake class use \"partial content\" response when swift itself does not?","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5dcb0b1edbf23df0399c33017fa29de177f01327","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                start \u003d 0"},{"line_number":96,"context_line":"            if end is None:"},{"line_number":97,"context_line":"                end \u003d len(body)"},{"line_number":98,"context_line":"            resp_class \u003d swob.HTTPPartialContent"},{"line_number":99,"context_line":"            body \u003d body[start:end + 1]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        return resp_class(headers\u003dheaders, body\u003dbody)(env, start_response)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9txc%3D","line":98,"in_reply_to":"AAAATn%2F9y8g%3D","updated":"2013-12-06 20:11:45.000000000","message":"Heh, this test actually gets way simpler if I don\u0027t. :)\n\nI had it in my head that you needed a bunch of wacky methods on your app_iter to make swob.Response give you status 206, and that\u0027s true... *unless* you pass in a \u0027body\u0027 arg that\u0027s a string, and then swob.Response just does the right thing.","commit_id":"bab9cd8b9154f53dca10b206f1d4cb67570f04f9"}]}
