)]}'
{"bin/swift-object-reconstructor":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"598f2401216a263ac5b6c365d66089c11a62b509","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_1b697c25","line":2,"updated":"2014-09-02 03:04:17.000000000","message":"Wow, 2012.. I here I thought Oz was only a good part of a day ahead.. let alone 2 years.","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_b7764704","line":2,"in_reply_to":"fa98f980_1b697c25","updated":"2014-09-04 17:03:13.000000000","message":"heh,. this is all over the codebase so not wanting to address it as part of the EC work for sure.  Someone should just do a patch against master to address this across the board","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"}],"etc/object-server.conf-sample":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"f53b200bee572ee3f0e344404026753b972a242a","unresolved":false,"context_lines":[{"line_number":207,"context_line":"[object-reconstructor]"},{"line_number":208,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"},{"line_number":209,"context_line":"# Unless otherwise noted, each setting below has the same meaning as described"},{"line_number":210,"context_line":"# in the [object-replicator] section however these settings apply to the EC"},{"line_number":211,"context_line":"# reconstructor"},{"line_number":212,"context_line":"#"},{"line_number":213,"context_line":"# log_name \u003d object-reconstructor"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_0cd3a104","line":210,"updated":"2014-09-04 00:47:54.000000000","message":"micronit: comma after \"section\"","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":207,"context_line":"[object-reconstructor]"},{"line_number":208,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"},{"line_number":209,"context_line":"# Unless otherwise noted, each setting below has the same meaning as described"},{"line_number":210,"context_line":"# in the [object-replicator] section however these settings apply to the EC"},{"line_number":211,"context_line":"# reconstructor"},{"line_number":212,"context_line":"#"},{"line_number":213,"context_line":"# log_name \u003d object-reconstructor"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_f7636f3f","line":210,"in_reply_to":"fa98f980_0cd3a104","updated":"2014-09-04 17:03:13.000000000","message":"Done","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"f53b200bee572ee3f0e344404026753b972a242a","unresolved":false,"context_lines":[{"line_number":220,"context_line":"# run_pause \u003d 30"},{"line_number":221,"context_line":"# concurrency \u003d 1"},{"line_number":222,"context_line":"# stats_interval \u003d 300"},{"line_number":223,"context_line":"# node_timeout \u003d \u003cwhatever\u0027s in the DEFAULT section or 10\u003e"},{"line_number":224,"context_line":"# http_timeout \u003d 60"},{"line_number":225,"context_line":"# lockup_timeout \u003d 1800"},{"line_number":226,"context_line":"# reclaim_age \u003d 604800"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_ccfc3975","line":223,"updated":"2014-09-04 00:47:54.000000000","message":"nit: put 10 here so it reflects the default value (or whatever the real default is)","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":220,"context_line":"# run_pause \u003d 30"},{"line_number":221,"context_line":"# concurrency \u003d 1"},{"line_number":222,"context_line":"# stats_interval \u003d 300"},{"line_number":223,"context_line":"# node_timeout \u003d \u003cwhatever\u0027s in the DEFAULT section or 10\u003e"},{"line_number":224,"context_line":"# http_timeout \u003d 60"},{"line_number":225,"context_line":"# lockup_timeout \u003d 1800"},{"line_number":226,"context_line":"# reclaim_age \u003d 604800"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fa98f980_37d177cd","line":223,"in_reply_to":"fa98f980_ccfc3975","updated":"2014-09-04 17:03:13.000000000","message":"Done","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"}],"swift/common/manager.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":34,"context_line":"               \u0027container-server\u0027, \u0027container-sync\u0027,"},{"line_number":35,"context_line":"               \u0027container-updater\u0027, \u0027object-auditor\u0027, \u0027object-server\u0027,"},{"line_number":36,"context_line":"               \u0027object-expirer\u0027, \u0027object-replicator\u0027,"},{"line_number":37,"context_line":"               \u0027object-reconstructor\u0027, \u0027object-updater\u0027,"},{"line_number":38,"context_line":"               \u0027proxy-server\u0027, \u0027account-replicator\u0027, \u0027account-reaper\u0027]"},{"line_number":39,"context_line":"MAIN_SERVERS \u003d [\u0027proxy-server\u0027, \u0027account-server\u0027, \u0027container-server\u0027,"},{"line_number":40,"context_line":"                \u0027object-server\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_cfceeb2c","line":37,"updated":"2014-09-12 11:15:29.000000000","message":"hmm, do we want to make starting replicator and reconstructor daemons conditional on having corresponding policies configured - I wonder whether we could have a single \u0027server\u0027 type that inspects POLICIES and kicks off the appropriate daemons?","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":7485,"name":"Tushar Gohad","email":"tushar.gohad@intel.com","username":"tsg"},"change_message_id":"3cb2c7d9c5619bd41fca07744f8137b1230579cd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");\r"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License.\r"},{"line_number":5,"context_line":"# You may obtain a copy of the License at\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_8fbf6dcf","line":2,"updated":"2014-07-15 00:42:23.000000000","message":"You might want to run \"dos2unix\" on this file.  :)","commit_id":"dad27f10327ad17824328c3e1852ee6ea660d86a"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"3a12deacbf6d7e3235791294648c80ba92d26bd4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");\r"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License.\r"},{"line_number":5,"context_line":"# You may obtain a copy of the License at\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_0f927d56","line":2,"in_reply_to":"baada198_8fbf6dcf","updated":"2014-07-15 00:45:29.000000000","message":"yeah, WTF...","commit_id":"dad27f10327ad17824328c3e1852ee6ea660d86a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"598f2401216a263ac5b6c365d66089c11a62b509","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":5,"context_line":"# You may obtain a copy of the License at"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_fb02f83c","line":2,"updated":"2014-09-02 03:04:17.000000000","message":"Copyright date again?","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"f53b200bee572ee3f0e344404026753b972a242a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        begin \u003d time.time()"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            responses \u003d []"},{"line_number":133,"context_line":"            suffixes \u003d tpool.execute(tpool_get_suffixes, job[\u0027path\u0027])"},{"line_number":134,"context_line":"            if suffixes:"},{"line_number":135,"context_line":"                for node in job[\u0027nodes\u0027]:"},{"line_number":136,"context_line":"                    # TODO:  for this case the reconstructor needs to let"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_ec865dda","line":133,"updated":"2014-09-04 00:47:54.000000000","message":"Any chance of using utils.Threadpool instead? tpool is sort of awful in that it\u0027s got some fixed size that we can\u0027t control, and it\u0027s probably going to be too many or too few.\n\nAlso, if we use utils.Threadpool, we can have one per disk, and that might be good. (Also might not. Depends on where we apply concurrency.)","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        begin \u003d time.time()"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            responses \u003d []"},{"line_number":133,"context_line":"            suffixes \u003d tpool.execute(tpool_get_suffixes, job[\u0027path\u0027])"},{"line_number":134,"context_line":"            if suffixes:"},{"line_number":135,"context_line":"                for node in job[\u0027nodes\u0027]:"},{"line_number":136,"context_line":"                    # TODO:  for this case the reconstructor needs to let"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_5747db76","line":133,"in_reply_to":"fa98f980_ec865dda","updated":"2014-09-04 17:03:13.000000000","message":"would you be OK braking this out into another task?  The intent here was to get a basic framework down, based on the replicator, to build on.  Also, this use of tpool I don\u0027t think is specific to the needs to the reconstructor is it? Looks like its being used just to build up the suffix list.  I\u0027m assuming maybe you were thinking of the GreenPool used in reconstruct() wrt the concurrency comment?","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"f53b200bee572ee3f0e344404026753b972a242a","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                job[\u0027nodes\u0027],"},{"line_number":196,"context_line":"                job[\u0027object_ring\u0027].get_more_nodes(int(job[\u0027partition\u0027])))"},{"line_number":197,"context_line":"            while attempts_left \u003e 0:"},{"line_number":198,"context_line":"                # If this throws StopIterator it will be caught way below"},{"line_number":199,"context_line":"                node \u003d next(nodes)"},{"line_number":200,"context_line":"                attempts_left -\u003d 1"},{"line_number":201,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_8c7b11f4","line":198,"updated":"2014-09-04 00:47:54.000000000","message":"nit: StopIteration","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                job[\u0027nodes\u0027],"},{"line_number":196,"context_line":"                job[\u0027object_ring\u0027].get_more_nodes(int(job[\u0027partition\u0027])))"},{"line_number":197,"context_line":"            while attempts_left \u003e 0:"},{"line_number":198,"context_line":"                # If this throws StopIterator it will be caught way below"},{"line_number":199,"context_line":"                node \u003d next(nodes)"},{"line_number":200,"context_line":"                attempts_left -\u003d 1"},{"line_number":201,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_ba4aae52","line":198,"in_reply_to":"fa98f980_8c7b11f4","updated":"2014-09-04 17:03:13.000000000","message":"Done","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        Get the ring object to use to handle a request based on its policy."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :policy_idx: policy index as defined in swift.conf"},{"line_number":99,"context_line":"        :returns: appropriate ring object"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        return POLICIES.get_object_ring(policy_idx, self.swift_dir)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_c517c643","line":98,"updated":"2014-09-12 11:15:29.000000000","message":"nit :param policy_idx:","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                job[\u0027nodes\u0027],"},{"line_number":196,"context_line":"                job[\u0027object_ring\u0027].get_more_nodes(int(job[\u0027partition\u0027])))"},{"line_number":197,"context_line":"            while attempts_left \u003e 0:"},{"line_number":198,"context_line":"                # If this throws StopIteration it will be caught way below"},{"line_number":199,"context_line":"                node \u003d next(nodes)"},{"line_number":200,"context_line":"                attempts_left -\u003d 1"},{"line_number":201,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_cce519a5","line":198,"updated":"2014-09-12 11:15:29.000000000","message":"nit: that would happen if we run out of nodes? is it worth explicitly catching the StopIteration and logging something more explicit than the catch all at line 248?","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                    suffixes \u003d [suffix for suffix in local_hash if"},{"line_number":232,"context_line":"                                local_hash[suffix] !\u003d"},{"line_number":233,"context_line":"                                remote_hash.get(suffix, -1)]"},{"line_number":234,"context_line":"                    self.sync(node, job, suffixes)"},{"line_number":235,"context_line":"                    with Timeout(self.http_timeout):"},{"line_number":236,"context_line":"                        conn \u003d http_connect("},{"line_number":237,"context_line":"                            node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_4fbbdb0e","line":234,"updated":"2014-09-12 11:15:29.000000000","message":"sync() is not defined","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                    with Timeout(self.http_timeout):"},{"line_number":236,"context_line":"                        conn \u003d http_connect("},{"line_number":237,"context_line":"                            node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":238,"context_line":"                            node[\u0027device\u0027], job[\u0027partition\u0027], \u0027replicate\u0027,"},{"line_number":239,"context_line":"                            \u0027/\u0027 + \u0027-\u0027.join(suffixes),"},{"line_number":240,"context_line":"                            headers\u003dself.headers)"},{"line_number":241,"context_line":"                        conn.getresponse().read()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_cca8b98e","line":238,"updated":"2014-09-12 11:15:29.000000000","message":"why method \u003d \u0027replicate\u0027 vs \u0027REPLICATE\u0027 or some other verb?","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0fb178af79f89edb1aad6a492e875e478b1e2608","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                    self.suffix_sync +\u003d len(suffixes)"},{"line_number":243,"context_line":"                    self.logger.update_stats(\u0027suffix.syncs\u0027, len(suffixes))"},{"line_number":244,"context_line":"                except (Exception, Timeout):"},{"line_number":245,"context_line":"                    self.logger.exception(_(\"Error w/reconstructor on \""},{"line_number":246,"context_line":"                                            \"node: %s\") % node)"},{"line_number":247,"context_line":"            self.suffix_count +\u003d len(local_hash)"},{"line_number":248,"context_line":"        except (Exception, Timeout):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_cce439e2","line":245,"updated":"2014-09-12 11:15:29.000000000","message":"semi-nit: For an exception message maybe avoid the shorthand, so w/reconstructor -\u003e with reconstructor","commit_id":"21e88fcab2edf2d9ad76dae89f0c69266bdad08f"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"598f2401216a263ac5b6c365d66089c11a62b509","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            # EC reconstructor returns us the reconstructed archive"},{"line_number":231,"context_line":"            # here and we then self.send_put() it here"},{"line_number":232,"context_line":"            if self.policy_idx \u003d\u003d EC_POLICY:"},{"line_number":233,"context_line":"                # TODO"},{"line_number":234,"context_line":"                pass"},{"line_number":235,"context_line":"            else:"},{"line_number":236,"context_line":"                # this is not EC so we can just open up the local copy"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_b80eb330","line":233,"updated":"2014-09-02 03:04:17.000000000","message":"I wonder if we should already start thinking about how we will handle more _different_ storage policies? replication + EC is a huge step, but will probably only be the start.\n\nDo we just have custom code in an if statement when required, or should be encapsulate something, like get_local_copy(ssync_sender) in the policy class or somewhere better?\n\nI\u0027m ok with either seeing as EC and REPL is a binary option, this is not a blocking comment, just want to put the thought out there, we can probably deal with this if there is a next time this code has to change.","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            # EC reconstructor returns us the reconstructed archive"},{"line_number":231,"context_line":"            # here and we then self.send_put() it here"},{"line_number":232,"context_line":"            if self.policy_idx \u003d\u003d EC_POLICY:"},{"line_number":233,"context_line":"                # TODO"},{"line_number":234,"context_line":"                pass"},{"line_number":235,"context_line":"            else:"},{"line_number":236,"context_line":"                # this is not EC so we can just open up the local copy"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_5a44621a","line":233,"in_reply_to":"fa98f980_b80eb330","updated":"2014-09-04 17:03:13.000000000","message":"we\u0027ve talked about this a few times and none of us have come up other real examples of different durability policies.  Keep in mind EC covers a whole family of schemes.  Appreciate the comment though and its the right thinking - I\u0027m not a huge fan of having this condition in here either, maybe this is something we do when we fill in the TODO here","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"598f2401216a263ac5b6c365d66089c11a62b509","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":5,"context_line":"# You may obtain a copy of the License at"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_d6b429d3","line":2,"updated":"2014-09-02 03:04:17.000000000","message":"Date?","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2309c70b3608baccf74930384f3086c0aa632c10","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":5,"context_line":"# You may obtain a copy of the License at"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_5a5b82f5","line":2,"in_reply_to":"fa98f980_d6b429d3","updated":"2014-09-04 17:03:13.000000000","message":"same comment as before, this is better left to a swooping patch on master to fix all of them I think","commit_id":"38764b3076909c7f303e24f3302c87bb95210a2c"}]}
