)]}'
{"doc/source/deployment_guide.rst":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7d4b1477618c857eaed5e688320a31128648ca51","unresolved":false,"context_lines":[{"line_number":405,"context_line":"                                              large queue depths. A good"},{"line_number":406,"context_line":"                                              starting point is 4 threads per"},{"line_number":407,"context_line":"                                              disk."},{"line_number":408,"context_line":"replication_concurrency        \u003cunlimited\u003e    Set to restrict the number of"},{"line_number":409,"context_line":"                                              concurrent incoming REPLICATION"},{"line_number":410,"context_line":"                                              requests"},{"line_number":411,"context_line":"replication_failure_threshold  100            The number of subrequest failures"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAATH%2F%2FZSg%3D","line":408,"updated":"2013-10-16 19:24:18.000000000","message":"I wouldn\u0027t mind a low-number default here; using unlimited as a default seems like it could easily turn into \"if you forget to set this config value, your cluster will melt\".\n\nI know this is what rsyncd does by default, but I think rsyncd\u0027s default is wrong. :)","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":405,"context_line":"                                              large queue depths. A good"},{"line_number":406,"context_line":"                                              starting point is 4 threads per"},{"line_number":407,"context_line":"                                              disk."},{"line_number":408,"context_line":"replication_concurrency        \u003cunlimited\u003e    Set to restrict the number of"},{"line_number":409,"context_line":"                                              concurrent incoming REPLICATION"},{"line_number":410,"context_line":"                                              requests"},{"line_number":411,"context_line":"replication_failure_threshold  100            The number of subrequest failures"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAATn%2F%2Fo%2FY%3D","line":408,"in_reply_to":"AAAATH%2F%2FZSg%3D","updated":"2013-10-31 01:52:09.000000000","message":"Will do. I choose.... 4.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"63e59a950e081c8ea786281bf9c8e3c02c2fc390","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                                              before the"},{"line_number":413,"context_line":"                                              replication_failure_ratio is"},{"line_number":414,"context_line":"                                              checked"},{"line_number":415,"context_line":"replication_failure_ratio      1.0            If the value of failures /"},{"line_number":416,"context_line":"                                              successes of REPLICATION"},{"line_number":417,"context_line":"                                              subrequests exceeds this ratio,"},{"line_number":418,"context_line":"                                              the overall REPLICATION request"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAATH%2F%2Few0%3D","line":415,"updated":"2013-10-16 17:21:25.000000000","message":"(bikeshedding) Seems like it would be more meaningful if it were a fraction, e.g. 0.5.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                                              before the"},{"line_number":413,"context_line":"                                              replication_failure_ratio is"},{"line_number":414,"context_line":"                                              checked"},{"line_number":415,"context_line":"replication_failure_ratio      1.0            If the value of failures /"},{"line_number":416,"context_line":"                                              successes of REPLICATION"},{"line_number":417,"context_line":"                                              subrequests exceeds this ratio,"},{"line_number":418,"context_line":"                                              the overall REPLICATION request"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAATn%2F%2Fo%2B0%3D","line":415,"in_reply_to":"AAAATH%2F%2Few0%3D","updated":"2013-10-31 01:52:09.000000000","message":"Not sure what this comment means. You can set it to 0.5 if you want, hinted at by the default being 1.0, a float. 1.0 means the errors have to equal or exceed the successes to abort. 0.5 means the errors have to equal or exceed half the successes to abort.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"}],"doc/source/overview_replication.rst":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"6d7805e4ddd9e5bc611cb223dfcbfb4ddfb5fb80","unresolved":false,"context_lines":[{"line_number":93,"context_line":"will be invalidated per day, which has experimentally given us acceptable"},{"line_number":94,"context_line":"replication speeds."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Work continues with a new ssync method where rsync is not used at all and"},{"line_number":97,"context_line":"instead all-Swift code is used to transfer the objects. At first, this ssync"},{"line_number":98,"context_line":"will just strive to emulate the rsync behavior. Once deemed stable it will open"},{"line_number":99,"context_line":"the way for future improvements in replication since we\u0027ll be able to easily"}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAATn%2F%2Ffpg%3D","line":96,"updated":"2013-11-06 16:59:35.000000000","message":"Is it really worth documenting this here? Seems like you covered all this in the commit message.  I am not sure adding it to the documentation as well will help, and it will age quite quickly.","commit_id":"6192a762eeda7d1f1b163025365873634918572c"}],"swift/common/wsgi.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"63e59a950e081c8ea786281bf9c8e3c02c2fc390","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            self.waitall()"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def run_server(conf, logger, sock, global_conf\u003dNone):"},{"line_number":200,"context_line":"    # Ensure TZ environment variable exists to avoid stat(\u0027/etc/localtime\u0027) on"},{"line_number":201,"context_line":"    # some platforms. This locks in reported times to the timezone in which"},{"line_number":202,"context_line":"    # the server first starts running in locations that periodically change"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FeRQ%3D","line":199,"updated":"2013-10-16 17:21:25.000000000","message":"Does anyone actually use run_server outside of wsgi.py? I don\u0027t think so. If I\u0027m right, you don\u0027t need keyword and None-checking.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            self.waitall()"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def run_server(conf, logger, sock, global_conf\u003dNone):"},{"line_number":200,"context_line":"    # Ensure TZ environment variable exists to avoid stat(\u0027/etc/localtime\u0027) on"},{"line_number":201,"context_line":"    # some platforms. This locks in reported times to the timezone in which"},{"line_number":202,"context_line":"    # the server first starts running in locations that periodically change"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Fo%2Bk%3D","line":199,"in_reply_to":"AAAATH%2F%2FeRQ%3D","updated":"2013-10-31 01:52:09.000000000","message":"Unsure so I played things safe in that any existing calls are equivalent to what they were before.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"6d7805e4ddd9e5bc611cb223dfcbfb4ddfb5fb80","unresolved":false,"context_lines":[{"line_number":217,"context_line":"    eventlet.debug.hub_exceptions(eventlet_debug)"},{"line_number":218,"context_line":"    # utils.LogAdapter stashes name in server; fallback on unadapted loggers"},{"line_number":219,"context_line":"    if not global_conf:"},{"line_number":220,"context_line":"        if hasattr(logger, \u0027server\u0027):"},{"line_number":221,"context_line":"            log_name \u003d logger.server"},{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            log_name \u003d logger.name"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fc%2FQ%3D","line":220,"updated":"2013-11-06 16:59:35.000000000","message":"Can we use try except here instead:\n\n try:\n     log_name \u003d logger.server\n except AttributeError:\n     log_name \u003d logger.name\n\nSame number of lines, but only one attribute lookup in the fast-path (no-error case).\n\nFeel free to ignore this if you want, though.","commit_id":"6192a762eeda7d1f1b163025365873634918572c"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"6d7805e4ddd9e5bc611cb223dfcbfb4ddfb5fb80","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            log_name \u003d logger.name"},{"line_number":224,"context_line":"        global_conf \u003d {\u0027log_name\u0027: log_name}"},{"line_number":225,"context_line":"    app \u003d loadapp(conf[\u0027__file__\u0027], global_conf\u003dglobal_conf)"},{"line_number":226,"context_line":"    max_clients \u003d int(conf.get(\u0027max_clients\u0027, \u00271024\u0027))"},{"line_number":227,"context_line":"    pool \u003d RestrictedGreenPool(size\u003dmax_clients)"},{"line_number":228,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fc%2FE%3D","line":225,"updated":"2013-11-06 16:59:35.000000000","message":"So in the call paths where run_server is invoked directly, NOT via run_wsgi, how come we don\u0027t invoke the global_conf_callback? Is that only for the WSGI context?","commit_id":"6192a762eeda7d1f1b163025365873634918572c"}],"swift/obj/server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7d4b1477618c857eaed5e688320a31128648ca51","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            \u0027expiring_objects\u0027"},{"line_number":108,"context_line":"        self.expiring_objects_container_divisor \u003d \\"},{"line_number":109,"context_line":"            int(conf.get(\u0027expiring_objects_container_divisor\u0027) or 86400)"},{"line_number":110,"context_line":"        if \u0027replication_semaphore\u0027 in conf:"},{"line_number":111,"context_line":"            self.replication_semaphore \u003d conf[\u0027replication_semaphore\u0027][0]"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            self.replication_semaphore \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZL0%3D","line":110,"updated":"2013-10-16 19:24:18.000000000","message":"could use a note about what populates this since it\u0027s not just from the config file","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            \u0027expiring_objects\u0027"},{"line_number":108,"context_line":"        self.expiring_objects_container_divisor \u003d \\"},{"line_number":109,"context_line":"            int(conf.get(\u0027expiring_objects_container_divisor\u0027) or 86400)"},{"line_number":110,"context_line":"        if \u0027replication_semaphore\u0027 in conf:"},{"line_number":111,"context_line":"            self.replication_semaphore \u003d conf[\u0027replication_semaphore\u0027][0]"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            self.replication_semaphore \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Fo%2BE%3D","line":110,"in_reply_to":"AAAATH%2F%2FZL0%3D","updated":"2013-10-31 01:52:09.000000000","message":"Done","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9573f537e7aaadd7fdb9895d6b2416f77b5c87c8","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                        set up semaphores, shared memory, etc."},{"line_number":697,"context_line":"    \"\"\""},{"line_number":698,"context_line":"    if \u0027replication_concurrency\u0027 in preloaded_app_conf:"},{"line_number":699,"context_line":"        # Have to put the value in a list so it can get past paste"},{"line_number":700,"context_line":"        global_conf[\u0027replication_semaphore\u0027] \u003d ["},{"line_number":701,"context_line":"            multiprocessing.BoundedSemaphore("},{"line_number":702,"context_line":"                int(preloaded_app_conf[\u0027replication_concurrency\u0027]))]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZG0%3D","line":699,"updated":"2013-10-16 19:46:48.000000000","message":"note: Copy this exact \"# Have to put\" comment where xxx[0] is used above","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                        set up semaphores, shared memory, etc."},{"line_number":697,"context_line":"    \"\"\""},{"line_number":698,"context_line":"    if \u0027replication_concurrency\u0027 in preloaded_app_conf:"},{"line_number":699,"context_line":"        # Have to put the value in a list so it can get past paste"},{"line_number":700,"context_line":"        global_conf[\u0027replication_semaphore\u0027] \u003d ["},{"line_number":701,"context_line":"            multiprocessing.BoundedSemaphore("},{"line_number":702,"context_line":"                int(preloaded_app_conf[\u0027replication_concurrency\u0027]))]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Fo98%3D","line":699,"in_reply_to":"AAAATH%2F%2FZG0%3D","updated":"2013-10-31 01:52:09.000000000","message":"Done","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"63e59a950e081c8ea786281bf9c8e3c02c2fc390","unresolved":false,"context_lines":[{"line_number":697,"context_line":"    \"\"\""},{"line_number":698,"context_line":"    if \u0027replication_concurrency\u0027 in preloaded_app_conf:"},{"line_number":699,"context_line":"        # Have to put the value in a list so it can get past paste"},{"line_number":700,"context_line":"        global_conf[\u0027replication_semaphore\u0027] \u003d ["},{"line_number":701,"context_line":"            multiprocessing.BoundedSemaphore("},{"line_number":702,"context_line":"                int(preloaded_app_conf[\u0027replication_concurrency\u0027]))]"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZjA%3D","line":700,"updated":"2013-10-16 17:21:25.000000000","message":"does anyone else have irrational prejudice about stuffing non-text into conf? I know we already have some kind of query string iterator or whatever in there.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"e239ad2a60f16cd9b271df03135d5a066497ff35","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \u0027expiring_objects\u0027"},{"line_number":95,"context_line":"        self.expiring_objects_container_divisor \u003d \\"},{"line_number":96,"context_line":"            int(conf.get(\u0027expiring_objects_container_divisor\u0027) or 86400)"},{"line_number":97,"context_line":"        # This is populated by global_conf_callback way below as the semaphore"},{"line_number":98,"context_line":"        # is shared by all workers."},{"line_number":99,"context_line":"        if \u0027replication_semaphore\u0027 in conf:"},{"line_number":100,"context_line":"            # The value was put in a list so it could get past paste"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Fl1E%3D","line":97,"updated":"2013-11-01 15:16:06.000000000","message":"Lines 97 - 107 appear to be implementation specific, is that true? If so, can you move these lines to .setup()?","commit_id":"e18db674d199a83b71dc36f5d5424022e0a91713"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9573f537e7aaadd7fdb9895d6b2416f77b5c87c8","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            # reads it and throws it away. Instead, the connection is dropped"},{"line_number":130,"context_line":"            # and the remote side will get a broken-pipe exception."},{"line_number":131,"context_line":"            try:"},{"line_number":132,"context_line":"                socket \u003d self.request.environ[\u0027wsgi.input\u0027].get_socket()"},{"line_number":133,"context_line":"                eventlet.greenio.shutdown_safe(socket)"},{"line_number":134,"context_line":"                socket.close()"},{"line_number":135,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZJM%3D","line":132,"updated":"2013-10-16 19:46:48.000000000","message":"note: ask Sam","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"63e59a950e081c8ea786281bf9c8e3c02c2fc390","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    \u0027%s:%s/%s/%s %s\u0027, self.node.get(\u0027ip\u0027),"},{"line_number":73,"context_line":"                    self.node.get(\u0027port\u0027), self.node.get(\u0027device\u0027),"},{"line_number":74,"context_line":"                    self.job.get(\u0027partition\u0027), err)"},{"line_number":75,"context_line":"            except Exception:"},{"line_number":76,"context_line":"                self.daemon.logger.exception("},{"line_number":77,"context_line":"                    \u0027%s:%s/%s/%s EXCEPTION in replication.Sender\u0027,"},{"line_number":78,"context_line":"                    self.node.get(\u0027ip\u0027), self.node.get(\u0027port\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZlU%3D","line":75,"updated":"2013-10-16 17:21:25.000000000","message":"I don\u0027t like this. IMHO it\u0027s better to re-raise with a string that has netloc/device/part. You think you\u0027re doing the same as the main handler but then if any additional instrumentation is needed or if log does not work somehow, it\u0027s hell on earth to find what fails.","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9573f537e7aaadd7fdb9895d6b2416f77b5c87c8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    \u0027%s:%s/%s/%s %s\u0027, self.node.get(\u0027ip\u0027),"},{"line_number":73,"context_line":"                    self.node.get(\u0027port\u0027), self.node.get(\u0027device\u0027),"},{"line_number":74,"context_line":"                    self.job.get(\u0027partition\u0027), err)"},{"line_number":75,"context_line":"            except Exception:"},{"line_number":76,"context_line":"                self.daemon.logger.exception("},{"line_number":77,"context_line":"                    \u0027%s:%s/%s/%s EXCEPTION in replication.Sender\u0027,"},{"line_number":78,"context_line":"                    self.node.get(\u0027ip\u0027), self.node.get(\u0027port\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZEc%3D","line":75,"updated":"2013-10-16 19:46:48.000000000","message":"note: I see now that semaphore cleanup may be in the way and also you might not want to abort whole REPLICATION. Maybe a comment explaining it if not obvious to casual readers","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    \u0027%s:%s/%s/%s %s\u0027, self.node.get(\u0027ip\u0027),"},{"line_number":73,"context_line":"                    self.node.get(\u0027port\u0027), self.node.get(\u0027device\u0027),"},{"line_number":74,"context_line":"                    self.job.get(\u0027partition\u0027), err)"},{"line_number":75,"context_line":"            except Exception:"},{"line_number":76,"context_line":"                self.daemon.logger.exception("},{"line_number":77,"context_line":"                    \u0027%s:%s/%s/%s EXCEPTION in replication.Sender\u0027,"},{"line_number":78,"context_line":"                    self.node.get(\u0027ip\u0027), self.node.get(\u0027port\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Fo8o%3D","line":75,"in_reply_to":"AAAATH%2F%2FZEc%3D","updated":"2013-10-31 01:52:09.000000000","message":"Done","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"db77ddc43083bfc72f7fbaf9ea702ae4117e1975","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                    \u0027%s:%s/%s/%s %s\u0027, self.node.get(\u0027ip\u0027),"},{"line_number":73,"context_line":"                    self.node.get(\u0027port\u0027), self.node.get(\u0027device\u0027),"},{"line_number":74,"context_line":"                    self.job.get(\u0027partition\u0027), err)"},{"line_number":75,"context_line":"            except Exception:"},{"line_number":76,"context_line":"                self.daemon.logger.exception("},{"line_number":77,"context_line":"                    \u0027%s:%s/%s/%s EXCEPTION in replication.Sender\u0027,"},{"line_number":78,"context_line":"                    self.node.get(\u0027ip\u0027), self.node.get(\u0027port\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Fo8s%3D","line":75,"in_reply_to":"AAAATH%2F%2FZlU%3D","updated":"2013-10-31 01:52:09.000000000","message":"Done","commit_id":"c0cbcfc4a1934c07ee6b980e8dd8e60cbbcce7f3"}],"swift/proxy/server.py":[{"author":{"_account_id":7680,"name":"Alex Gaynor","email":"alex.gaynor@gmail.com","username":"alex_gaynor"},"change_message_id":"391566f926875887c4d8fab29d5b517913bb3461","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            # Remove any x-backend-* headers since those are reserved for use"},{"line_number":201,"context_line":"            # by backends communicating with each other; no end user should be"},{"line_number":202,"context_line":"            # able to send those into the cluster."},{"line_number":203,"context_line":"            for key in list(k for k in env if k.startswith(\u0027HTTP_X_BACKEND_\u0027)):"},{"line_number":204,"context_line":"                del env[key]"},{"line_number":205,"context_line":"            req \u003d self.update_request(Request(env))"},{"line_number":206,"context_line":"            return self.handle_request(req)(env, start_response)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FOXU%3D","line":203,"updated":"2013-09-09 18:01:45.000000000","message":"You can write this as `[k for k in env if k.startswith(\u0027HTTP_X_BACKEND_\u0027)]`","commit_id":"70a4ac94751ef2e8341a8bddbebfe9663f5a42ea"}]}
