)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7884,"name":"Noboru Arai","email":"arai@mxa.nes.nec.co.jp","username":"NoboruArai"},"change_message_id":"111eab9ebfb5c68325785b2ddbed5b903219d57e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Added a unit test to upload images of various sizes to trigger the usage"},{"line_number":11,"context_line":"of the S3 Multipart Upload API and ensure that it is being exercised."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint s3-multi-part-upload"},{"line_number":14,"context_line":"Change-Id: I36e28e7944e57cd7ac05e46afac461ec10245c68"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"AAAAUH%2F%2B4jc%3D","line":13,"updated":"2014-01-21 05:20:29.000000000","message":"when I accessed to this link,  web browser is output as follows:\n -No feature specifications match your criteria.\n\nI look like this blueprint doe\u0027snt exist. \nDoes this blueprint exist?\n\nThanks","commit_id":"be0b70d664f04fb591ca7243366e5be5234a3b18"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"20eb61de1447aa5e3823c2bc56ee7859446f3ff9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Added a unit test to upload images of various sizes to trigger the usage"},{"line_number":11,"context_line":"of the S3 Multipart Upload API and ensure that it is being exercised."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint s3-multi-part-upload"},{"line_number":14,"context_line":"Change-Id: I36e28e7944e57cd7ac05e46afac461ec10245c68"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"AAAAUH%2F9oqQ%3D","line":13,"updated":"2014-02-05 13:47:14.000000000","message":"Seems this bp need to reopen for track this change.\n\nhttps://blueprints.launchpad.net/glance/+spec/s3-multi-part-upload","commit_id":"e5285e64ef2444ea7dfaa1b66a1f1ca60e773119"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"266233f89e06c9a83e9915714e24e67527ac1583","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Added a unit test to upload images of various sizes to trigger the usage"},{"line_number":11,"context_line":"of the S3 Multipart Upload API and ensure that it is being exercised."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint s3-multi-part-upload"},{"line_number":14,"context_line":"Change-Id: I36e28e7944e57cd7ac05e46afac461ec10245c68"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"AAAAVn%2F%2FNrk%3D","line":13,"in_reply_to":"AAAAUH%2F9oqQ%3D","updated":"2014-03-07 15:45:59.000000000","message":"Yeah, can you please take care of this part?","commit_id":"e5285e64ef2444ea7dfaa1b66a1f1ca60e773119"}],"doc/source/configuring.rst":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":638,"context_line":""},{"line_number":639,"context_line":"`This option is specific to the S3 storage backend.`"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"What size, in MB, should S3 start chunking image files"},{"line_number":642,"context_line":"and do a multipart upload in S3."},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"* ``s3_store_large_object_chunk_size\u003dSIZE_IN_MB``"}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAATn%2F9mig%3D","line":641,"updated":"2013-12-09 19:36:27.000000000","message":"I believe we do not need \"What\" in here.\n\nSomething like:\nSize, in ``MB``, should S3 start chunking image files ... should help, I presume.","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"`This option is specific to the S3 storage backend.`"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"What multipart upload part size, in MB, should S3 use"},{"line_number":653,"context_line":"when uploading parts. The size must be greater than or"},{"line_number":654,"context_line":"equal to s3_store_large_object_min_chunk_size."},{"line_number":655,"context_line":"The default is 10MB."}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAATn%2F9miY%3D","line":652,"updated":"2013-12-09 19:36:27.000000000","message":"Feel like MB should be highlighted.","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":662,"context_line":""},{"line_number":663,"context_line":"`This option is specific to the S3 storage backend.`"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"What minimum multipart upload part size, in MB, should be specified"},{"line_number":666,"context_line":"when uploading parts. The default is 5MB."},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"* ``s3_store_thread_pools\u003dNUM``"}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAATn%2F9miQ%3D","line":665,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"}],"etc/glance-api.conf":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"35ec1c10bbfccd8421780f9eb9898f18ccb519c2","unresolved":false,"context_lines":[{"line_number":359,"context_line":""},{"line_number":360,"context_line":"# If the object size is greater than \u0027s3_store_large_object_size\u0027, then"},{"line_number":361,"context_line":"# a multipart upload will be performed. Otherwise, a single put will be"},{"line_number":362,"context_line":"# performed. (MB)"},{"line_number":363,"context_line":"s3_store_large_object_size \u003d 100"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"# When a multipart upload is performed, the object will be divided by"}],"source_content_type":"text/plain","patch_set":7,"id":"AAAATH%2F%2FwgI%3D","line":362,"updated":"2013-10-10 09:07:01.000000000","message":"Can you keep consistent for this description message to s3.py? I prefer this one is better then which in code.\n\nSame like below one.","commit_id":"9c132ac969458436ed201c46168d4de125d1d0fb"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"35ec1c10bbfccd8421780f9eb9898f18ccb519c2","unresolved":false,"context_lines":[{"line_number":360,"context_line":"# If the object size is greater than \u0027s3_store_large_object_size\u0027, then"},{"line_number":361,"context_line":"# a multipart upload will be performed. Otherwise, a single put will be"},{"line_number":362,"context_line":"# performed. (MB)"},{"line_number":363,"context_line":"s3_store_large_object_size \u003d 100"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"# When a multipart upload is performed, the object will be divided by"},{"line_number":366,"context_line":"# this value(MB) into a chunked object and each chunked object will be"}],"source_content_type":"text/plain","patch_set":7,"id":"AAAATH%2F%2FwgE%3D","line":363,"updated":"2013-10-10 09:07:01.000000000","message":"I prefer comment this line, just like other options:\n\n#s3_store_large_object_size \u003d 100\n\nSame like below one.","commit_id":"9c132ac969458436ed201c46168d4de125d1d0fb"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"35ec1c10bbfccd8421780f9eb9898f18ccb519c2","unresolved":false,"context_lines":[{"line_number":364,"context_line":""},{"line_number":365,"context_line":"# When a multipart upload is performed, the object will be divided by"},{"line_number":366,"context_line":"# this value(MB) into a chunked object and each chunked object will be"},{"line_number":367,"context_line":"# uploaded in parallel."},{"line_number":368,"context_line":"s3_store_large_object_chunk_size \u003d 10"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d RBD Store Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":7,"id":"AAAATH%2F%2Fwfs%3D","line":367,"updated":"2013-10-10 09:07:01.000000000","message":"And this value must greater than or equal to 5 (MB).","commit_id":"9c132ac969458436ed201c46168d4de125d1d0fb"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"62bcc1ec4dcc8a7dda79f3c3427bc27f47c0c405","unresolved":false,"context_lines":[{"line_number":365,"context_line":"# When a multipart upload is performed, the object will be divided by"},{"line_number":366,"context_line":"# this value(MB) into a chunked object and each chunked object will be"},{"line_number":367,"context_line":"# uploaded in parallel. This value must be greater than or equal to 5 (MB)."},{"line_number":368,"context_line":"s3_store_large_object_chunk_size \u003d 10"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d RBD Store Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":371,"context_line":""}],"source_content_type":"text/plain","patch_set":8,"id":"AAAATH%2F%2Fl4M%3D","line":368,"updated":"2013-10-14 04:15:58.000000000","message":"Pls comment this line just like above one, since this is a default value.\n\nbtw, actually you need also change \u0027doc/source/configuring.rst\u0027 file. of cause you can do that later when other key functional parts ok.","commit_id":"e48c0d2baac719d02f60c3a0d5c829f9b4ef6944"}],"glance/store/s3.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"62bcc1ec4dcc8a7dda79f3c3427bc27f47c0c405","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                      \u0027Either subdomain or path can be used.\u0027)),"},{"line_number":63,"context_line":"    cfg.IntOpt(\u0027s3_store_large_object_size\u0027,"},{"line_number":64,"context_line":"               default\u003dDEFAULT_LARGE_OBJECT_SIZE,"},{"line_number":65,"context_line":"               help\u003d_(\u0027Image files above this MB size will be uploaded using \u0027"},{"line_number":66,"context_line":"                      \u0027the S3 multi-part upload API. Default is %d MB.\u0027"},{"line_number":67,"context_line":"                      % DEFAULT_LARGE_OBJECT_SIZE)),"},{"line_number":68,"context_line":"    cfg.IntOpt(\u0027s3_store_large_object_chunk_size\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2Fl4Q%3D","line":65,"updated":"2013-10-14 04:15:58.000000000","message":"As I mentioned in PS1, could you pls keep this description message (and below one) consistent with what you said in glance-api.conf? thanks.","commit_id":"e48c0d2baac719d02f60c3a0d5c829f9b4ef6944"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"62bcc1ec4dcc8a7dda79f3c3427bc27f47c0c405","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                else:"},{"line_number":513,"context_line":"                    cnt \u003d tchunks"},{"line_number":514,"context_line":"                crange \u003d chunks[cstart:cstart + cnt]"},{"line_number":515,"context_line":"                t \u003d UploadParts(mpu,"},{"line_number":516,"context_line":"                                open(temp_file.name, \u0027rb\u0027),"},{"line_number":517,"context_line":"                                offset,"},{"line_number":518,"context_line":"                                cstart + 1,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2Fl2E%3D","line":515,"updated":"2013-10-14 04:15:58.000000000","message":"I personally like we using glance.openstack.commom.threadgroup util at here. actually we using eventlet.greenthread.","commit_id":"e48c0d2baac719d02f60c3a0d5c829f9b4ef6944"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"62bcc1ec4dcc8a7dda79f3c3427bc27f47c0c405","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            if success:"},{"line_number":539,"context_line":"                # Complete"},{"line_number":540,"context_line":"                xml \u003d get_mpu_xml(pedict)"},{"line_number":541,"context_line":"                cmpu \u003d bucket_obj.complete_multipart_upload(obj_name,"},{"line_number":542,"context_line":"                                                            mpu.id,"},{"line_number":543,"context_line":"                                                            xml)"},{"line_number":544,"context_line":"                checksum_hex \u003d checksum.hexdigest()"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2Fl2U%3D","line":541,"updated":"2013-10-14 04:15:58.000000000","message":"where we using \u0027cmpu\u0027 ?","commit_id":"e48c0d2baac719d02f60c3a0d5c829f9b4ef6944"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":39,"context_line":"DEFAULT_LARGE_OBJECT_SIZE \u003d 100       # 100M"},{"line_number":40,"context_line":"DEFAULT_LARGE_OBJECT_CHUNK_SIZE \u003d 10  # 10M"},{"line_number":41,"context_line":"DEFAULT_THREAD_POOLS \u003d 10             # 10 pools"},{"line_number":42,"context_line":"MIN_CHUNK_SIZE \u003d 5                    # 5M"},{"line_number":43,"context_line":"ONE_MB \u003d 1024 * 1024"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"s3_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FOJo%3D","line":42,"updated":"2013-11-12 18:33:16.000000000","message":"why not use config value for this var? Seems like being used like the other 3 above.","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def run_upload(parts):"},{"line_number":105,"context_line":"    for bsize in parts.chunks:"},{"line_number":106,"context_line":"        part \u003d parts.mpu.upload_part_from_file(parts.fp,"},{"line_number":107,"context_line":"                                               part_num\u003dparts.partnum,"},{"line_number":108,"context_line":"                                               size\u003dbsize)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FN5M%3D","line":105,"updated":"2013-11-12 18:33:16.000000000","message":"1. I feel like this should be within a try: catch\n\n2. We should check if the backend is full or not on any sort of upload, no? Does s3 handle it in some sort of better way?\n\n3. How do you plan to handle connection timeouts? May be add in another param called to_retry or even retry_count (not sure which would be a better option) and then have this iterated over.\n\n4. Please add debug level logging when there is an attempt for upload, info level logging whenever there is a success and error log when there is an error","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":681,"context_line":"        return boto.s3.connection.SubdomainCallingFormat()"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"def get_mpu_xml(pedict):"},{"line_number":685,"context_line":"    xml \u003d \u0027\u003cCompleteMultipartUpload\u003e\\n\u0027"},{"line_number":686,"context_line":"    for p in range(1, len(pedict) + 1):"},{"line_number":687,"context_line":"        xml +\u003d \u0027  \u003cPart\u003e\\n\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FOGk%3D","line":684,"updated":"2013-11-12 18:33:16.000000000","message":"it\u0027s unfortunate that we don\u0027t have the xmlutil library which is in nova/cinder in Glance. This looks good though.","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def run_upload(parts):"},{"line_number":110,"context_line":"    from boto.exception import BotoServerError"},{"line_number":111,"context_line":"    for bsize in parts.chunks:"},{"line_number":112,"context_line":"        pnum \u003d parts.partnum"},{"line_number":113,"context_line":"        msg \u003d _(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQjs%3D","line":110,"updated":"2013-11-28 09:21:05.000000000","message":"why we don\u0027t do import at above common place but in the function? thanks.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    for bsize in parts.chunks:"},{"line_number":112,"context_line":"        pnum \u003d parts.partnum"},{"line_number":113,"context_line":"        msg \u003d _(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":114,"context_line":"                \"size\u003d%(bsize)d \") % locals()"},{"line_number":115,"context_line":"        LOG.debug(msg)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQjQ%3D","line":114,"updated":"2013-11-28 09:21:05.000000000","message":"nit: remove the space from the end.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                    \"size\u003d%(bsize)d, status\u003d%(status)d, \""},{"line_number":129,"context_line":"                    \"reason\u003d%(reason)s\") % locals()"},{"line_number":130,"context_line":"            LOG.error(msg)"},{"line_number":131,"context_line":"            parts.fp.close()"},{"line_number":132,"context_line":"            return"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    parts.fp.close()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQdU%3D","line":131,"updated":"2013-11-28 09:21:05.000000000","message":"I prefer close fp in a finally block.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        self.s3_store_object_buffer_dir \u003d CONF.s3_store_object_buffer_dir"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":328,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * ONE_MB"},{"line_number":329,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":330,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"},{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQxE%3D","line":328,"updated":"2013-11-28 09:21:05.000000000","message":"we are using units utils now, for example: https://github.com/openstack/glance/blob/master/glance/store/base.py#L45","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":328,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * ONE_MB"},{"line_number":329,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":330,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"},{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"},{"line_number":332,"context_line":"            reason \u003d _(\"s3_store_large_object_chunk_size must be at \""},{"line_number":333,"context_line":"                       \"least %(_s3_ck_min)d MB. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQx0%3D","line":330,"updated":"2013-11-28 09:21:05.000000000","message":"If s3_store_large_object_min_chunk_size option only do a limitation to s3_store_large_object_chunk_size, why we need allow end user control it? I\u0027m not sure but can we just make a built-in theoretical minimal chunk size in code, and write the hardcord value to the comments for s3_store_large_object_chunk_size option in glance-api.conf? The reason to me is that: min chunk size, just like it\u0027s name, it should be most basic limitation value to glance s3 store driver, chunk_size option can use any value only if greater than it. Any thoughts @nikhil?\n\nAnyway i\u0027m open on this point. both are OK to me, but I think it will better if we don\u0027t expose all details to end user and keep main option as simple as possible.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"04f47b97469b4e0b91398edad2bf8d93fb0ea87f","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":328,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * ONE_MB"},{"line_number":329,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":330,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"},{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"},{"line_number":332,"context_line":"            reason \u003d _(\"s3_store_large_object_chunk_size must be at \""},{"line_number":333,"context_line":"                       \"least %(_s3_ck_min)d MB. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAT3%2F%2Fujs%3D","line":330,"in_reply_to":"AAAAT3%2F%2Fu7E%3D","updated":"2014-01-02 20:18:23.000000000","message":"@nikhil, I\u0027m really confused on your comments here, on the hand you agree with me to remove \"s3_store_large_object_min_chunk_size\" option, but on the other hand you say PS22 is OK, but this option is still there in PS22. It will be great if you can clarify your input.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"7eeda82268a818a0eb8c56e9d0d4d056570e365b","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":328,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * ONE_MB"},{"line_number":329,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":330,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"},{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"},{"line_number":332,"context_line":"            reason \u003d _(\"s3_store_large_object_chunk_size must be at \""},{"line_number":333,"context_line":"                       \"least %(_s3_ck_min)d MB. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAT3%2F%2FuaE%3D","line":330,"in_reply_to":"AAAAT3%2F%2Fujs%3D","updated":"2014-01-02 21:11:50.000000000","message":"I agree with you that there should be a default value as a global variable however, do not have a strong say in removing the config value.\n\nHowever, you\u0027r right to bring this up again. I get it, that keeping a variable here and not exposing code level details to configuration options sounds better and less confusing from deployer perspective.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5269665e9e27f303a023c8062dda054205932516","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":328,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * ONE_MB"},{"line_number":329,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":330,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"},{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"},{"line_number":332,"context_line":"            reason \u003d _(\"s3_store_large_object_chunk_size must be at \""},{"line_number":333,"context_line":"                       \"least %(_s3_ck_min)d MB. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAT3%2F%2Fu7E%3D","line":330,"in_reply_to":"AAAATn%2F%2BQx0%3D","updated":"2014-01-02 18:13:10.000000000","message":"Yeah, this makes sense. I think the current (PS22) implementation looks good.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            LOG.error(reason)"},{"line_number":336,"context_line":"            raise exception.BadStoreConfiguration(store_name\u003d\"s3\","},{"line_number":337,"context_line":"                                                  reason\u003dreason)"},{"line_number":338,"context_line":"        self.s3_store_large_object_chunk_size \u003d _s3_ck_size * ONE_MB"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def _option_get(self, param):"},{"line_number":341,"context_line":"        result \u003d getattr(CONF, param)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQw4%3D","line":338,"updated":"2013-11-28 09:21:05.000000000","message":"ditto, ONE_MB \u003d\u003e glance.openstack.common.units.Mi","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            pool_size \u003d self._option_get(\u0027s3_store_thread_pools\u0027)"},{"line_number":527,"context_line":"            pool \u003d threadgroup.greenpool.GreenPool(size\u003dpool_size)"},{"line_number":528,"context_line":"            mpu \u003d bucket_obj.initiate_multipart_upload(obj_name)"},{"line_number":529,"context_line":"            tchunks \u003d parts / threads"},{"line_number":530,"context_line":"            extra \u003d parts % threads"},{"line_number":531,"context_line":"            cstart \u003d 0"},{"line_number":532,"context_line":"            plist \u003d []"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQhM%3D","line":529,"updated":"2013-11-28 09:21:05.000000000","message":"\"thunks\" will always be \"1\" since line #524? and \"extra\" always be \"0\". seems it\u0027s wrong.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"17021d099f20e5eb3d4bd5af45e72fb7fec955c2","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            plist \u003d []"},{"line_number":533,"context_line":"            offset \u003d 0"},{"line_number":534,"context_line":"            for p in range(threads):"},{"line_number":535,"context_line":"                if extra \u003e 0:"},{"line_number":536,"context_line":"                    cnt \u003d tchunks + 1"},{"line_number":537,"context_line":"                else:"},{"line_number":538,"context_line":"                    cnt \u003d tchunks"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BQlU%3D","line":535,"updated":"2013-11-28 09:21:05.000000000","message":"we need \"extra -\u003d 1\" in the loop if my above comments is valid.","commit_id":"69a14ddabe16357daaa8f6b2afa6af46955810d7"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    pnum \u003d parts.partnum"},{"line_number":113,"context_line":"    bsize \u003d parts.chunks"},{"line_number":114,"context_line":"    msg \u003d _(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":115,"context_line":"            \"size\u003d%(bsize)d\") % locals()"},{"line_number":116,"context_line":"    LOG.debug(msg)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhk%3D","line":115,"updated":"2013-12-09 19:36:27.000000000","message":"same as line 115","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        reason \u003d e.reason"},{"line_number":127,"context_line":"        msg \u003d _(\"Failed to upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":128,"context_line":"                \"size\u003d%(bsize)d, status\u003d%(status)d, \""},{"line_number":129,"context_line":"                \"reason\u003d%(reason)s\") % locals()"},{"line_number":130,"context_line":"        LOG.error(msg)"},{"line_number":131,"context_line":"        part_ok \u003d False"},{"line_number":132,"context_line":"    finally:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhs%3D","line":129,"updated":"2013-12-09 19:36:27.000000000","message":"Use of locals in str formatting is deprecated. Please use a dict or tuple to format string with more than one var.","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        if _s3_ck_size \u003c _s3_ck_min:"},{"line_number":332,"context_line":"            reason \u003d _(\"s3_store_large_object_chunk_size must be at \""},{"line_number":333,"context_line":"                       \"least %(_s3_ck_min)d MB. \""},{"line_number":334,"context_line":"                       \"You configured it as %(_s3_ck_size)d MB\") % locals()"},{"line_number":335,"context_line":"            LOG.error(reason)"},{"line_number":336,"context_line":"            raise exception.BadStoreConfiguration(store_name\u003d\"s3\","},{"line_number":337,"context_line":"                                                  reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhc%3D","line":334,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        tmpdir \u003d self.s3_store_object_buffer_dir"},{"line_number":487,"context_line":"        temp_file \u003d tempfile.NamedTemporaryFile(dir\u003dtmpdir)"},{"line_number":488,"context_line":"        checksum \u003d hashlib.md5()"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        for chunk in utils.chunkreadable(image_file, self.CHUNKSIZE):"},{"line_number":491,"context_line":"            checksum.update(chunk)"},{"line_number":492,"context_line":"            temp_file.write(chunk)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhQ%3D","line":489,"updated":"2013-12-09 19:36:27.000000000","message":"new line not necessary","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            key \u003d bucket_obj.new_key(obj_name)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"            # OK, now upload the data into the key"},{"line_number":503,"context_line":"            key.set_contents_from_file(open(temp_file.name, \u0027r+b\u0027),"},{"line_number":504,"context_line":"                                       replace\u003dFalse)"},{"line_number":505,"context_line":"            size \u003d key.size"},{"line_number":506,"context_line":"            checksum_hex \u003d checksum.hexdigest()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mew%3D","line":503,"updated":"2013-12-09 19:36:27.000000000","message":"Do you think that the file should be open in \"ab\" mode (Append; open or create file for writing at end-of-file.) ?","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            key.set_contents_from_file(open(temp_file.name, \u0027r+b\u0027),"},{"line_number":504,"context_line":"                                       replace\u003dFalse)"},{"line_number":505,"context_line":"            size \u003d key.size"},{"line_number":506,"context_line":"            checksum_hex \u003d checksum.hexdigest()"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"            LOG.debug(_(\"Wrote %(size)d bytes to S3 key named %(obj_name)s \""},{"line_number":509,"context_line":"                        \"with checksum %(checksum_hex)s\") % locals())"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mfk%3D","line":506,"updated":"2013-12-09 19:36:27.000000000","message":"I\u0027m not sure and would like to verify if all the stores return a hexdigest of the checksum.","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            checksum_hex \u003d checksum.hexdigest()"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"            LOG.debug(_(\"Wrote %(size)d bytes to S3 key named %(obj_name)s \""},{"line_number":509,"context_line":"                        \"with checksum %(checksum_hex)s\") % locals())"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"            return (loc.get_uri(), size, checksum_hex, {})"},{"line_number":512,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhM%3D","line":509,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":525,"context_line":""},{"line_number":526,"context_line":"            pool_size \u003d self._option_get(\u0027s3_store_thread_pools\u0027)"},{"line_number":527,"context_line":"            pool \u003d threadgroup.greenpool.GreenPool(size\u003dpool_size)"},{"line_number":528,"context_line":"            mpu \u003d bucket_obj.initiate_multipart_upload(obj_name)"},{"line_number":529,"context_line":"            cstart \u003d 0"},{"line_number":530,"context_line":"            plist \u003d []"},{"line_number":531,"context_line":"            offset \u003d 0"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mec%3D","line":528,"updated":"2013-12-09 19:36:27.000000000","message":"Should we add a log line indicating that this process is beginning?","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                crange \u003d chunks[cstart]"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"                LOG.debug(_(\"crange\u003d%(crange)d, offset\u003d%(offset)d, \""},{"line_number":536,"context_line":"                            \"cstart\u003d%(cstart)d\") % locals())"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"                part \u003d UploadParts(mpu, open(temp_file.name, \u0027rb\u0027),"},{"line_number":539,"context_line":"                                   offset,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhI%3D","line":536,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":566,"context_line":"                checksum_hex \u003d checksum.hexdigest()"},{"line_number":567,"context_line":"                LOG.debug(_(\"Wrote %(total_size)d bytes to S3 key \""},{"line_number":568,"context_line":"                            \"named %(obj_name)s \""},{"line_number":569,"context_line":"                            \"with checksum %(checksum_hex)s\") % locals())"},{"line_number":570,"context_line":"                return (loc.get_uri(), total_size, checksum_hex, {})"},{"line_number":571,"context_line":"            else:"},{"line_number":572,"context_line":"                # Abort"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhE%3D","line":569,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                # Abort"},{"line_number":573,"context_line":"                bucket_obj.cancel_multipart_upload(obj_name, mpu.id)"},{"line_number":574,"context_line":"                msg \u003d (_(\"Some parts failed to upload to S3. \""},{"line_number":575,"context_line":"                         \"Aborted the object key\u003d%(obj_name)s\") % locals())"},{"line_number":576,"context_line":"                LOG.error(msg)"},{"line_number":577,"context_line":"                raise glance.store.BackendException(msg)"},{"line_number":578,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mhA%3D","line":575,"updated":"2013-12-09 19:36:27.000000000","message":"ditto","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"015fa8f3e03d1cfdde3cc5a559c659bd03302c29","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from oslo.config import cfg"},{"line_number":28,"context_line":"from boto.exception import BotoServerError"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from glance.common import exception"},{"line_number":31,"context_line":"from glance.common import utils"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9j7Q%3D","line":28,"updated":"2013-12-10 08:24:42.000000000","message":"pls do this be alphabetical","commit_id":"d314361fdc190538bc10543d787485d3e4427d9c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"015fa8f3e03d1cfdde3cc5a559c659bd03302c29","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.fp.seek(offset)"},{"line_number":104,"context_line":"        self.size \u003d 0"},{"line_number":105,"context_line":"        self.chunks \u003d chunks"},{"line_number":106,"context_line":"        self.parts \u003d {}  # partnum -\u003e etag"},{"line_number":107,"context_line":"        self.success \u003d False"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9j9Q%3D","line":106,"updated":"2013-12-10 08:24:42.000000000","message":"do you think rename it to \"etag\" will be better?","commit_id":"d314361fdc190538bc10543d787485d3e4427d9c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"015fa8f3e03d1cfdde3cc5a559c659bd03302c29","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        self.success \u003d False"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def run_upload(parts):"},{"line_number":111,"context_line":"    part_ok \u003d True"},{"line_number":112,"context_line":"    pnum \u003d parts.partnum"},{"line_number":113,"context_line":"    bsize \u003d parts.chunks"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9j%2FQ%3D","line":110,"updated":"2013-12-10 08:24:42.000000000","message":"1. I prefer change argument name to \"part\", plural form here is not make sense.\n\n2. pls add some necessary docs.","commit_id":"d314361fdc190538bc10543d787485d3e4427d9c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"015fa8f3e03d1cfdde3cc5a559c659bd03302c29","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                                        \u0027status\u0027: status,"},{"line_number":132,"context_line":"                                        \u0027reason\u0027: reason})"},{"line_number":133,"context_line":"        LOG.error(msg)"},{"line_number":134,"context_line":"        part_ok \u003d False"},{"line_number":135,"context_line":"    finally:"},{"line_number":136,"context_line":"        parts.fp.close()"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9j9k%3D","line":134,"updated":"2013-12-10 08:24:42.000000000","message":"Other exception should set this to False also.","commit_id":"d314361fdc190538bc10543d787485d3e4427d9c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"015fa8f3e03d1cfdde3cc5a559c659bd03302c29","unresolved":false,"context_lines":[{"line_number":716,"context_line":""},{"line_number":717,"context_line":"def get_mpu_xml(pedict):"},{"line_number":718,"context_line":"    xml \u003d \u0027\u003cCompleteMultipartUpload\u003e\\n\u0027"},{"line_number":719,"context_line":"    for p in range(1, len(pedict) + 1):"},{"line_number":720,"context_line":"        xml +\u003d \u0027  \u003cPart\u003e\\n\u0027"},{"line_number":721,"context_line":"        xml +\u003d \u0027    \u003cPartNumber\u003e%d\u003c/PartNumber\u003e\\n\u0027 % p"},{"line_number":722,"context_line":"        xml +\u003d \u0027    \u003cETag\u003e%s\u003c/ETag\u003e\\n\u0027 % pedict[p]"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9j7o%3D","line":719,"updated":"2013-12-10 08:24:42.000000000","message":"i prefer do this:\n\nfor pnum, etag in a.iteritems():\n  xml +\u003d ....\n  ...","commit_id":"d314361fdc190538bc10543d787485d3e4427d9c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import tempfile"},{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from boto.exception import BotoServerError"},{"line_number":28,"context_line":"from oslo.config import cfg"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from glance.common import exception"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0c4%3D","line":27,"updated":"2013-12-30 21:28:34.000000000","message":"one small nit here which could be useful later:\n\njust import boto.exception and use it explicitly to catch BotoServerError","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    Upload the upload part into S3 and set returned etag and size"},{"line_number":113,"context_line":"    to its part info."},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":"    part_ok \u003d True"},{"line_number":116,"context_line":"    pnum \u003d part.partnum"},{"line_number":117,"context_line":"    bsize \u003d part.chunks"},{"line_number":118,"context_line":"    msg \u003d (_(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0bI%3D","line":115,"updated":"2013-12-30 21:28:34.000000000","message":"Do you need this variable? \n\nI feel like keeping the default value of part.success to True *here* and setting it to False when  exception occurs should do it as the logic \n\npart.success \u003d part_ok is outside the finally clause.","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    msg \u003d (_(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":119,"context_line":"             \"size\u003d%(bsize)d\") %"},{"line_number":120,"context_line":"           {\u0027pnum\u0027: pnum, \u0027bsize\u0027: bsize})"},{"line_number":121,"context_line":"    LOG.debug(msg)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    try:"},{"line_number":124,"context_line":"        key \u003d part.mpu.upload_part_from_file(part.fp,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0cY%3D","line":121,"updated":"2013-12-30 21:28:34.000000000","message":"This is a nit again however, shouldn\u0027t this LOG be on the info level?","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \u0027err\u0027: e})"},{"line_number":147,"context_line":"        LOG.error(msg)"},{"line_number":148,"context_line":"        part_ok \u003d False"},{"line_number":149,"context_line":"    finally:"},{"line_number":150,"context_line":"        part.fp.close()"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    part.success \u003d part_ok"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0bQ%3D","line":149,"updated":"2013-12-30 21:28:34.000000000","message":"I wonder if we need to do s3_conn.close in this execution chain. I tried to find that in this file and does not seem to be the case. \n\nWon\u0027t we have a bunch of open connections if not closed explicitly or does S3 handle that well?","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        self.s3_store_object_buffer_dir \u003d CONF.s3_store_object_buffer_dir"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        _s3_obj_size \u003d self._option_get(\u0027s3_store_large_object_size\u0027)"},{"line_number":345,"context_line":"        self.s3_store_large_object_size \u003d _s3_obj_size * units.Mi"},{"line_number":346,"context_line":"        _s3_ck_size \u003d self._option_get(\u0027s3_store_large_object_chunk_size\u0027)"},{"line_number":347,"context_line":"        _s3_ck_min \u003d self._option_get(\u0027s3_store_large_object_min_chunk_size\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0aE%3D","line":344,"updated":"2013-12-30 21:28:34.000000000","message":"Either there is not need to use the method self._option_get and use CONF.my_option instead or if you feel please add checks to see if None is not being returned (I guess in line 360, the default would have to be None if it has to be used generically).","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        self.s3_store_large_object_chunk_size \u003d _s3_ck_size * units.Mi"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def _option_get(self, param):"},{"line_number":360,"context_line":"        result \u003d getattr(CONF, param)"},{"line_number":361,"context_line":"        if not result:"},{"line_number":362,"context_line":"            reason \u003d (_(\"Could not find %(param)s in configuration \""},{"line_number":363,"context_line":"                        \"options.\") % {\u0027param\u0027: param})"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0aI%3D","line":360,"updated":"2013-12-30 21:28:34.000000000","message":"This will raise AttributeError if default is not provided. Not sure what default should you keep.\n\nhttp://docs.python.org/2/library/functions.html#getattr","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            key \u003d bucket_obj.new_key(obj_name)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"            # OK, now upload the data into the key"},{"line_number":521,"context_line":"            key.set_contents_from_file(open(temp_file.name, \u0027rb\u0027),"},{"line_number":522,"context_line":"                                       replace\u003dFalse)"},{"line_number":523,"context_line":"            size \u003d key.size"},{"line_number":524,"context_line":"            checksum_hex \u003d checksum.hexdigest()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0ZU%3D","line":521,"updated":"2013-12-30 21:28:34.000000000","message":"Can you please help me understand the need for this \u0027rb\u0027 mode?\n\nI read the below articles to find that it\u0027s better to use r+b instead of rb. What do you think?\n\nhttp://stackoverflow.com/questions/15746954/what-is-the-difference-between-rb-and-rb-modes-in-file-objects\n\nhttp://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":560,"context_line":"                           \u0027offset\u0027: offset,"},{"line_number":561,"context_line":"                           \u0027cstart\u0027: cstart})"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"                part \u003d UploadPart(mpu, open(temp_file.name, \u0027rb\u0027),"},{"line_number":564,"context_line":"                                  offset,"},{"line_number":565,"context_line":"                                  cstart + 1,"},{"line_number":566,"context_line":"                                  crange)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAT3%2F%2F0ck%3D","line":563,"updated":"2013-12-30 21:28:34.000000000","message":"Not a big deal - however, wondering if the correct DS to use here is a dict vs. object/class. Sounds more python way of doing, no?","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4c3d81499dd2fad7f82c47b52b8ba6e4553d938d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Storage backend for S3 or Storage Servers that follow the S3 Protocol\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import boto.exception"},{"line_number":19,"context_line":"import hashlib"},{"line_number":20,"context_line":"import httplib"},{"line_number":21,"context_line":"import math"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUH%2F%2Bayg%3D","line":18,"updated":"2014-01-27 05:08:11.000000000","message":"pls move this to below importing group as a 3rd lib, which near the oslo.config.","commit_id":"be0b70d664f04fb591ca7243366e5be5234a3b18"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4c3d81499dd2fad7f82c47b52b8ba6e4553d938d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"               help\u003d_(\u0027What multipart upload part size, in MB, should S3 use \u0027"},{"line_number":70,"context_line":"                      \u0027when uploading parts. The size must be greater than or \u0027"},{"line_number":71,"context_line":"                      \u0027equal to s3_store_large_object_min_chunk_size.\u0027)),"},{"line_number":72,"context_line":"    cfg.IntOpt(\u0027s3_store_large_object_min_chunk_size\u0027,"},{"line_number":73,"context_line":"               default\u003dDEFAULT_LARGE_OBJECT_MIN_CHUNK_SIZE,"},{"line_number":74,"context_line":"               help\u003d_(\u0027What minimum multipart upload part size, in MB, should \u0027"},{"line_number":75,"context_line":"                      \u0027be specified when uploading parts.\u0027)),"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUH%2F%2Bax8%3D","line":72,"updated":"2014-01-27 05:08:11.000000000","message":"IMO you can remove this option related code from here also, just hard-code the 5MB.\n\nAnd in generally, if we add a new configuration here, we will always add a related option item in  glance-api.conf template also.","commit_id":"be0b70d664f04fb591ca7243366e5be5234a3b18"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4f29ac4b9e576ce67bbe165f059487118ca96ac7","unresolved":false,"context_lines":[{"line_number":491,"context_line":"        LOG.debug(msg)"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        tmpdir \u003d self.s3_store_object_buffer_dir"},{"line_number":494,"context_line":"        temp_file \u003d tempfile.NamedTemporaryFile(dir\u003dtmpdir)"},{"line_number":495,"context_line":"        checksum \u003d hashlib.md5()"},{"line_number":496,"context_line":"        for chunk in utils.chunkreadable(image_file, self.CHUNKSIZE):"},{"line_number":497,"context_line":"            checksum.update(chunk)"}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_b53bd6cf","line":494,"updated":"2014-05-16 20:51:03.000000000","message":"Also, assuming that the disk utilization is taken care of when creating such directories and being dumped into the dir.\n\nIn such cases, we must enforce a try catch (or if else) mechanism to avoid over-utilization.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"8384ba33cd0b4b131853fcc0cbb0639016012f73","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                    chunks.append(psize + 1)"},{"line_number":530,"context_line":"                else:"},{"line_number":531,"context_line":"                    chunks.append(psize)"},{"line_number":532,"context_line":"                extra -\u003d 1"},{"line_number":533,"context_line":"            threads \u003d parts"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"            pool_size \u003d CONF.s3_store_thread_pools"}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_352034f7","line":532,"updated":"2014-05-08 01:39:37.000000000","message":"don\u0027t we need to extra -\u003d 1 only when extra \u003e 0?","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4f29ac4b9e576ce67bbe165f059487118ca96ac7","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                    chunks.append(psize + 1)"},{"line_number":530,"context_line":"                else:"},{"line_number":531,"context_line":"                    chunks.append(psize)"},{"line_number":532,"context_line":"                extra -\u003d 1"},{"line_number":533,"context_line":"            threads \u003d parts"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"            pool_size \u003d CONF.s3_store_thread_pools"}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_521f086c","line":532,"in_reply_to":"7adec928_352034f7","updated":"2014-05-16 20:51:03.000000000","message":"Hmm, nice catch. It does not seem to be used anywhere however, it could be a potential bug if something gets added which uses extra.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4f29ac4b9e576ce67bbe165f059487118ca96ac7","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                                  offset,"},{"line_number":556,"context_line":"                                  cstart + 1,"},{"line_number":557,"context_line":"                                  crange)"},{"line_number":558,"context_line":"                pool.spawn(run_upload, part)"},{"line_number":559,"context_line":"                plist.append(part)"},{"line_number":560,"context_line":"                cstart +\u003d 1"},{"line_number":561,"context_line":"                offset +\u003d crange"}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_753f8e87","line":558,"updated":"2014-05-16 20:51:03.000000000","message":"Wondering if you wish to use spawn_n instead of spawn here? If you do not intend to use the return method then it would be a good idea to just use spawn_n indicating the intent that way.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"8384ba33cd0b4b131853fcc0cbb0639016012f73","unresolved":false,"context_lines":[{"line_number":591,"context_line":"                          \u0027obj_name\u0027: obj_name,"},{"line_number":592,"context_line":"                          \u0027checksum_hex\u0027: checksum_hex})"},{"line_number":593,"context_line":"                return (loc.get_uri(), total_size, checksum_hex, {})"},{"line_number":594,"context_line":"            else:"},{"line_number":595,"context_line":"                # Abort"},{"line_number":596,"context_line":"                bucket_obj.cancel_multipart_upload(obj_name, mpu.id)"},{"line_number":597,"context_line":"                msg \u003d (_(\"Some parts failed to upload to S3. \""}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_9b577902","line":594,"updated":"2014-05-08 01:39:37.000000000","message":"why don\u0027t we fail as soon as a part fails to upload?","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4f29ac4b9e576ce67bbe165f059487118ca96ac7","unresolved":false,"context_lines":[{"line_number":591,"context_line":"                          \u0027obj_name\u0027: obj_name,"},{"line_number":592,"context_line":"                          \u0027checksum_hex\u0027: checksum_hex})"},{"line_number":593,"context_line":"                return (loc.get_uri(), total_size, checksum_hex, {})"},{"line_number":594,"context_line":"            else:"},{"line_number":595,"context_line":"                # Abort"},{"line_number":596,"context_line":"                bucket_obj.cancel_multipart_upload(obj_name, mpu.id)"},{"line_number":597,"context_line":"                msg \u003d (_(\"Some parts failed to upload to S3. \""}],"source_content_type":"text/x-python","patch_set":30,"id":"7adec928_d5db027a","line":594,"in_reply_to":"7adec928_9b577902","updated":"2014-05-16 20:51:03.000000000","message":"One thing which even I\u0027m freaking out about is - there does not seem to be any HTTP error code being returned/used in the add part of the code. \n\nIt would be a good idea to have some kind of upload/download state management based on what the error backend is returning.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad01786ed797297dd584c39b0227a8c4fb1c185d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from glance.common import exception"},{"line_number":30,"context_line":"from glance.common import utils"},{"line_number":31,"context_line":"import glance.openstack.common.log as logging"},{"line_number":32,"context_line":"from glance.openstack.common import threadgroup"},{"line_number":33,"context_line":"from glance.openstack.common import units"},{"line_number":34,"context_line":"import glance.store"},{"line_number":35,"context_line":"import glance.store.base"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_491f665b","line":32,"updated":"2014-06-04 01:13:07.000000000","message":"This line failed your change due to the recent change [0] just merged.\n\n[0] https://github.com/openstack/glance/commit/c3ff558fc0b8eab6117901a746f97a2800d7d02f\n\nYou need a separated change to get theadgroup module back into glance from oslo-inc first, and rebase this change on it.\n\nThanks for your patience! Sorry.","commit_id":"20a1b62c0c06a0b946000d83a57e85a855198697"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"173658357dfe10e6acea6ac2e4daad9a4f33dc2d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                temp_file.write(chunk)"},{"line_number":506,"context_line":"            temp_file.flush()"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"            # OK, now upload the data into the key"},{"line_number":509,"context_line":"            key.set_contents_from_file(open(temp_file.name, \u0027rb\u0027),"},{"line_number":510,"context_line":"                                       replace\u003dFalse)"},{"line_number":511,"context_line":"            size \u003d key.size"}],"source_content_type":"text/x-python","patch_set":36,"id":"1ae5cdf2_84ebda11","line":508,"updated":"2014-06-13 08:35:46.000000000","message":"I prefer to write a log, to tell operator correct info regarding line #147. This confused me when I verify this change in my local. thanks.","commit_id":"8040f51e8c68ca9eb32c83b879a3842abbb46417"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"173658357dfe10e6acea6ac2e4daad9a4f33dc2d","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                        float(self.s3_store_large_object_chunk_size)))"},{"line_number":525,"context_line":"            threads \u003d parts"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"            pool_size \u003d CONF.s3_store_thread_pools"},{"line_number":528,"context_line":"            pool \u003d eventlet.greenpool.GreenPool(size\u003dpool_size)"},{"line_number":529,"context_line":"            mpu \u003d bucket_obj.initiate_multipart_upload(obj_name)"},{"line_number":530,"context_line":"            LOG.info(_(\"Multipart initiate key\u003d%(obj_name)s, \""}],"source_content_type":"text/x-python","patch_set":36,"id":"1ae5cdf2_c456c2cd","line":527,"updated":"2014-06-13 08:35:46.000000000","message":"we need to check this option if valid (in configure_add() fun), i can failed the upload by -N value (400: Client disconnected before sending all data to backend) and 0 value (Error communicating with http://10.20.0.1:9292 timed out).\n\nAnd I\u0027m thinking can glance calculates pool size automatically based on \"parts\" or cpu core count?","commit_id":"8040f51e8c68ca9eb32c83b879a3842abbb46417"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"c32aead5334efee5f892bdde6b348d6bc0bd9235","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                temp_file.write(chunk)"},{"line_number":512,"context_line":"            temp_file.flush()"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"            # OK, now upload the data into the key"},{"line_number":515,"context_line":"            key.set_contents_from_file(open(temp_file.name, \u0027rb\u0027),"},{"line_number":516,"context_line":"                                       replace\u003dFalse)"},{"line_number":517,"context_line":"            size \u003d key.size"}],"source_content_type":"text/x-python","patch_set":37,"id":"1ae5cdf2_79d5ac41","line":514,"updated":"2014-06-19 16:39:12.000000000","message":"I still concerned on this point, pls check my original comment at https://review.openstack.org/#/c/49316/36/glance/store/s3.py\n\nYou can ping me in IRC or mail me if you confused on it.","commit_id":"e47c0007badfe3dd1383a66a00db75c06ffa2583"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    \"\"\""},{"line_number":103,"context_line":"    pnum \u003d part.partnum"},{"line_number":104,"context_line":"    bsize \u003d part.chunks"},{"line_number":105,"context_line":"    msg \u003d (_(\"Uploading upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":106,"context_line":"             \"size\u003d%(bsize)d, key\u003d%(key)s, UploadId\u003d%(UploadId)s\") %"},{"line_number":107,"context_line":"           {\u0027pnum\u0027: pnum,"},{"line_number":108,"context_line":"            \u0027bsize\u0027: bsize,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_5a394bf1","line":105,"updated":"2014-06-24 09:44:22.000000000","message":"_LI(\nref https://wiki.openstack.org/wiki/LoggingStandards#Guidelines","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    except boto.exception.BotoServerError as e:"},{"line_number":120,"context_line":"        status \u003d e.status"},{"line_number":121,"context_line":"        reason \u003d e.reason"},{"line_number":122,"context_line":"        msg \u003d (_(\"Failed to upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":123,"context_line":"                 \"size\u003d%(bsize)d, status\u003d%(status)d, \""},{"line_number":124,"context_line":"                 \"reason\u003d%(reason)s\") %"},{"line_number":125,"context_line":"               {\u0027pnum\u0027: pnum,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_456c10d1","line":122,"updated":"2014-06-24 09:44:22.000000000","message":"_LE(\nditto","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        LOG.error(msg)"},{"line_number":130,"context_line":"        part.success \u003d False"},{"line_number":131,"context_line":"    except Exception as e:"},{"line_number":132,"context_line":"        msg \u003d (_(\"Failed to upload part in S3 partnum\u003d%(pnum)d, \""},{"line_number":133,"context_line":"                 \"size\u003d%(bsize)d due to internal error: %(err)s\") %"},{"line_number":134,"context_line":"               {\u0027pnum\u0027: pnum,"},{"line_number":135,"context_line":"                \u0027bsize\u0027: bsize,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_259e24b9","line":132,"updated":"2014-06-24 09:44:22.000000000","message":"_LE(\nditto","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        msg \u003d (_(\"Uploading an image file to S3 for %s\") %"},{"line_number":484,"context_line":"               _sanitize(loc.get_uri()))"},{"line_number":485,"context_line":"        LOG.info(msg)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        if image_size \u003c self.s3_store_large_object_size:"},{"line_number":488,"context_line":"            key \u003d bucket_obj.new_key(obj_name)"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_25070483","line":485,"updated":"2014-06-24 09:44:22.000000000","message":"I\u0027d keep this as LOG.debug. Can\u0027t see any justification why we should inform admins for every state of the upload. (Needs removing the translation from L483)","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":521,"context_line":"            size \u003d key.size"},{"line_number":522,"context_line":"            checksum_hex \u003d checksum.hexdigest()"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"            LOG.info(_(\"Wrote %(size)d bytes to S3 key named %(obj_name)s \""},{"line_number":525,"context_line":"                       \"with checksum %(checksum_hex)s\") %"},{"line_number":526,"context_line":"                     {\u0027size\u0027: size,"},{"line_number":527,"context_line":"                      \u0027obj_name\u0027: obj_name,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_a5f314e6","line":524,"updated":"2014-06-24 09:44:22.000000000","message":"Same here, rather LOG.debug than LOG.info.","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            pool_size \u003d CONF.s3_store_thread_pools"},{"line_number":538,"context_line":"            pool \u003d eventlet.greenpool.GreenPool(size\u003dpool_size)"},{"line_number":539,"context_line":"            mpu \u003d bucket_obj.initiate_multipart_upload(obj_name)"},{"line_number":540,"context_line":"            LOG.info(_(\"Multipart initiate key\u003d%(obj_name)s, \""},{"line_number":541,"context_line":"                       \"UploadId\u003d%(UploadId)s\") %"},{"line_number":542,"context_line":"                     {\u0027obj_name\u0027: obj_name,"},{"line_number":543,"context_line":"                      \u0027UploadId\u0027: mpu.id})"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_c50020ae","line":540,"updated":"2014-06-24 09:44:22.000000000","message":"ditto","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                         {\u0027obj_name\u0027: obj_name,"},{"line_number":583,"context_line":"                          \u0027UploadId\u0027: mpu.id})"},{"line_number":584,"context_line":"                checksum_hex \u003d checksum.hexdigest()"},{"line_number":585,"context_line":"                LOG.info(_(\"Wrote %(total_size)d bytes to S3 key \""},{"line_number":586,"context_line":"                           \"named %(obj_name)s \""},{"line_number":587,"context_line":"                           \"with checksum %(checksum_hex)s\") %"},{"line_number":588,"context_line":"                         {\u0027total_size\u0027: total_size,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_c51740ed","line":585,"updated":"2014-06-24 09:44:22.000000000","message":"Any chance you could combine these two (this with L580) as one logging message, translate it with _LI( and I think here the info level is ok.","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6e14c8b1eb9480d8d025f1bba45da6b27a22cc37","unresolved":false,"context_lines":[{"line_number":592,"context_line":"            else:"},{"line_number":593,"context_line":"                # Abort"},{"line_number":594,"context_line":"                bucket_obj.cancel_multipart_upload(obj_name, mpu.id)"},{"line_number":595,"context_line":"                msg \u003d (_(\"Some parts failed to upload to S3. \""},{"line_number":596,"context_line":"                         \"Aborted the object key\u003d%s\") % obj_name)"},{"line_number":597,"context_line":"                LOG.error(msg)"},{"line_number":598,"context_line":"                raise glance.store.BackendException(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"1ae5cdf2_c5ee60ed","line":595,"updated":"2014-06-24 09:44:22.000000000","message":"_LE(\nditto","commit_id":"ffbbe49a33ba21afc1f0dc37cd7a41c31ed2ceb5"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ffbf3b2016bef580c976d3d27b8b881b4f07b34e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import httplib"},{"line_number":21,"context_line":"import math"},{"line_number":22,"context_line":"import re"},{"line_number":23,"context_line":"import six"},{"line_number":24,"context_line":"import tempfile"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import boto.exception"}],"source_content_type":"text/x-python","patch_set":42,"id":"1ae5cdf2_a20da191","line":23,"updated":"2014-06-25 05:54:40.000000000","message":"pls move \u0027six\u0027 and \u0027eventlet\u0027 to below import group as a 3rd library.","commit_id":"d758dc70b53316bba331485e98311d2a8fc83ddf"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ffbf3b2016bef580c976d3d27b8b881b4f07b34e","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from glance.common import exception"},{"line_number":31,"context_line":"from glance.common import utils"},{"line_number":32,"context_line":"from glance.openstack.common.gettextutils import _LE"},{"line_number":33,"context_line":"from glance.openstack.common.gettextutils import _LI"},{"line_number":34,"context_line":"import glance.openstack.common.log as logging"},{"line_number":35,"context_line":"from glance.openstack.common import units"}],"source_content_type":"text/x-python","patch_set":42,"id":"1ae5cdf2_e2c6c968","line":32,"updated":"2014-06-25 05:54:40.000000000","message":"By our practice, we like to import module instead of function.\n\nWhat about this: https://review.openstack.org/#/c/95816/14/glance/store/rbd.py","commit_id":"d758dc70b53316bba331485e98311d2a8fc83ddf"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ffbf3b2016bef580c976d3d27b8b881b4f07b34e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                      \"size\u003d%(bsize)d due to internal error: %(err)s\") %"},{"line_number":134,"context_line":"                  {\u0027pnum\u0027: pnum,"},{"line_number":135,"context_line":"                   \u0027bsize\u0027: bsize,"},{"line_number":136,"context_line":"                   \u0027err\u0027: e})"},{"line_number":137,"context_line":"        part.success \u003d False"},{"line_number":138,"context_line":"    finally:"},{"line_number":139,"context_line":"        part.fp.close()"}],"source_content_type":"text/x-python","patch_set":42,"id":"1ae5cdf2_a29a0160","line":136,"updated":"2014-06-25 05:54:40.000000000","message":"To prevent potential UnicodeError issue, I prefer to use exception_to_str() : https://github.com/openstack/glance/blob/master/glance/common/utils.py#L642","commit_id":"d758dc70b53316bba331485e98311d2a8fc83ddf"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ffbf3b2016bef580c976d3d27b8b881b4f07b34e","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                temp_file.write(chunk)"},{"line_number":509,"context_line":"            temp_file.flush()"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"            msg \u003d _(\"Uploading temporary file to S3 \""},{"line_number":512,"context_line":"                    \"for %s\") % _sanitize(loc.get_uri())"},{"line_number":513,"context_line":"            LOG.debug(msg)"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"1ae5cdf2_82e505de","line":511,"updated":"2014-06-25 05:54:40.000000000","message":"Needs removing the translation since its a debug level log.","commit_id":"d758dc70b53316bba331485e98311d2a8fc83ddf"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"d8767d1a759af79fc888e10bf7f15ccea5f8374d","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                      \"size\u003d%(bsize)d due to internal error: %(err)s\") %"},{"line_number":135,"context_line":"                  {\u0027pnum\u0027: pnum,"},{"line_number":136,"context_line":"                   \u0027bsize\u0027: bsize,"},{"line_number":137,"context_line":"                   \u0027err\u0027: exception_to_str(e)})"},{"line_number":138,"context_line":"        part.success \u003d False"},{"line_number":139,"context_line":"    finally:"},{"line_number":140,"context_line":"        part.fp.close()"}],"source_content_type":"text/x-python","patch_set":43,"id":"1ae5cdf2_7310c959","line":137,"updated":"2014-06-25 08:06:25.000000000","message":"utils.exception_to_str(e)","commit_id":"05147dbcb632bca12e3848218275b322b46ece23"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"7a00b10f75eb5959896ebf88e2c9a5cc6a89bf77","unresolved":false,"context_lines":[{"line_number":592,"context_line":"                bucket_obj.cancel_multipart_upload(obj_name, mpu.id)"},{"line_number":593,"context_line":"                LOG.error(_LE(\"Some parts failed to upload to S3. \""},{"line_number":594,"context_line":"                              \"Aborted the object key\u003d%s\") % obj_name)"},{"line_number":595,"context_line":"                raise glance.store.BackendException(msg)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def delete(self, location):"},{"line_number":598,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":43,"id":"1ae5cdf2_f31779ec","line":595,"updated":"2014-06-25 07:41:07.000000000","message":"This is probably not intentional. the msg could come as far as from line 475.","commit_id":"05147dbcb632bca12e3848218275b322b46ece23"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"163a13d194f41eccf47e4dd8ab3f6f3616865c17","unresolved":false,"context_lines":[{"line_number":593,"context_line":"                LOG.error(_LE(\"Some parts failed to upload to S3. \""},{"line_number":594,"context_line":"                              \"Aborted the object key\u003d%s\") % obj_name)"},{"line_number":595,"context_line":"                msg \u003d (_(\"Failed to add image object to S3. \""},{"line_number":596,"context_line":"                         \"key\u003d%(key)s\") % {\u0027key\u0027: obj_name})"},{"line_number":597,"context_line":"                raise glance.store.BackendException(msg)"},{"line_number":598,"context_line":""},{"line_number":599,"context_line":"    def delete(self, location):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1ae5cdf2_9de0fff9","line":596,"updated":"2014-06-25 09:17:24.000000000","message":"nit: can you make those two lines of code be consistent: #594 vs. #596, I mean do \u0027key\u003d%s\u0027 or \u0027key\u003d%(key)s\u0027.","commit_id":"6f8c6b1b1c180946df9788f85c83c957b0f25cc5"}],"glance/tests/unit/test_s3_store.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import hashlib"},{"line_number":21,"context_line":"import StringIO"},{"line_number":22,"context_line":"import xml.etree.ElementTree as ET"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import boto.s3.connection"},{"line_number":25,"context_line":"import stubout"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FN3g%3D","line":22,"updated":"2013-11-12 18:33:16.000000000","message":"I would recommend just importing xml.etree instead of the class itself.","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            key.read \u003d key.data.read"},{"line_number":175,"context_line":"            return key"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    class FakeCMPU:"},{"line_number":178,"context_line":"        \"\"\""},{"line_number":179,"context_line":"        Acts like a ``boto.s3.multipart.CompleteMultiPartUpload``"},{"line_number":180,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FN34%3D","line":177,"updated":"2013-11-12 18:33:16.000000000","message":"wonder if mock would be useful here instead of creating Fakes?","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            return new_key"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        def initiate_multipart_upload(self, key_name, **kwargs):"},{"line_number":214,"context_line":"            mpu \u003d FakeMPU(self, key_name)"},{"line_number":215,"context_line":"            if key_name not in self.mpus:"},{"line_number":216,"context_line":"                self.mpus[key_name] \u003d {}"},{"line_number":217,"context_line":"            self.mpus[key_name][mpu.id] \u003d mpu"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FN3s%3D","line":214,"updated":"2013-11-12 18:33:16.000000000","message":"seems like mock could solve the problem here","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                        key \u003d mpu.complete_key()"},{"line_number":234,"context_line":"                        self.cancel_multipart_upload(key_name, upload_id)"},{"line_number":235,"context_line":"                        self.keys[key_name] \u003d key"},{"line_number":236,"context_line":"                        cmpu \u003d FakeCMPU(self, key_name, key.etag)"},{"line_number":237,"context_line":"                        return cmpu"},{"line_number":238,"context_line":"            return None  # tho raising an exception might be better"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FN3o%3D","line":236,"updated":"2013-11-12 18:33:16.000000000","message":"same here","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"Tests the S3 backend store\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mox"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import hashlib"},{"line_number":23,"context_line":"import StringIO"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9mdM%3D","line":20,"updated":"2013-12-09 19:36:27.000000000","message":"Hate to do this you, however we are moving away from mox to \"mock\" (http://www.voidspace.org.uk/python/mock/) as mox is not supported in python 3. So, can you please change your tests to use that instead?","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"588cedee674eef44b0fa7dc4eba155f4643d02c5","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"Tests the S3 backend store\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import hashlib"},{"line_number":23,"context_line":"import StringIO"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F9jSs%3D","line":20,"updated":"2013-12-12 06:15:50.000000000","message":"move this line to line #27","commit_id":"7faaf1ad579cfb68a400d26de7a29b9978e288a6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"71a45d71dccb2727e6a12cfeffc13edb10921642","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"Tests the S3 backend store\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import hashlib"},{"line_number":23,"context_line":"import StringIO"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAATn%2F9XoM%3D","line":20,"updated":"2013-12-12 06:23:59.000000000","message":"ditto, PS #20","commit_id":"0c4e0d50f9ae77cf92f35ccaec72143843fa7666"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1800c7da277566ef204951e1e9e13b914e952309","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import hashlib"},{"line_number":19,"context_line":"import uuid"},{"line_number":20,"context_line":"import xml.etree.ElementTree"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import boto.s3.connection"},{"line_number":23,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAW3%2F%2FgFs%3D","line":20,"updated":"2014-04-14 07:14:54.000000000","message":"nit: under our practice, I prefer to import module instead of class or function directly.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"5cd68d25921b16793fabc6b770791edf36b5907e","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import hashlib"},{"line_number":19,"context_line":"import uuid"},{"line_number":20,"context_line":"import xml.etree.ElementTree"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import boto.s3.connection"},{"line_number":23,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAXH%2F%2FFJo%3D","line":20,"in_reply_to":"AAAAW3%2F%2FgFs%3D","updated":"2014-04-24 07:02:08.000000000","message":"My bad, ElementTree is module but class.","commit_id":"d68d705d81284c490b85959d4e77e9933f6e98b3"}],"requirements.txt":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"8fc67e2c3ce8c7d99994d9dbae575d40a5b5b197","unresolved":false,"context_lines":[{"line_number":14,"context_line":"WebOb\u003e\u003d1.2.3,\u003c1.3"},{"line_number":15,"context_line":"wsgiref\u003e\u003d0.1.2"},{"line_number":16,"context_line":"argparse"},{"line_number":17,"context_line":"boto\u003e\u003d2.12.0,!\u003d2.13.0"},{"line_number":18,"context_line":"sqlalchemy-migrate\u003e\u003d0.7.2"},{"line_number":19,"context_line":"httplib2"},{"line_number":20,"context_line":"kombu\u003e\u003d2.4.8"}],"source_content_type":"text/plain","patch_set":13,"id":"AAAATn%2F%2FN3M%3D","line":17,"updated":"2013-11-12 18:33:16.000000000","message":"this might have to wait until global requirements are cool with the change","commit_id":"7038bd73c67d6410acb68b1370a2b477fea5ef25"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"5871e4a6fef059917a01b5538cbf73dc17be829c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"WebOb\u003e\u003d1.2.3,\u003c1.3"},{"line_number":15,"context_line":"wsgiref\u003e\u003d0.1.2"},{"line_number":16,"context_line":"argparse"},{"line_number":17,"context_line":"boto\u003e\u003d2.12.0,!\u003d2.13.0"},{"line_number":18,"context_line":"sqlalchemy-migrate\u003e\u003d0.7.2"},{"line_number":19,"context_line":"httplib2"},{"line_number":20,"context_line":"kombu\u003e\u003d2.4.8"}],"source_content_type":"text/plain","patch_set":16,"id":"AAAATn%2F9mdA%3D","line":17,"updated":"2013-12-09 19:36:27.000000000","message":"Do we know what is the status for such a change in global requirements?","commit_id":"8b263921114544efa7ad7b36e8eaf2ed9617b814"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ccdcbc76ccc4d11a438ae60abf96a90af2b920e6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Routes\u003e\u003d1.12.3"},{"line_number":14,"context_line":"WebOb\u003e\u003d1.2.3,\u003c1.3"},{"line_number":15,"context_line":"argparse"},{"line_number":16,"context_line":"boto\u003e\u003d2.12.0,!\u003d2.13.0"},{"line_number":17,"context_line":"sqlalchemy-migrate\u003e\u003d0.7.2"},{"line_number":18,"context_line":"httplib2"},{"line_number":19,"context_line":"kombu\u003e\u003d2.4.8"}],"source_content_type":"text/plain","patch_set":22,"id":"AAAAT3%2F%2F0Y4%3D","line":16,"updated":"2013-12-30 21:28:34.000000000","message":"I believe the global requirements have been updated to match your proposed change above. Can you please omit this and add a dependency for this patch https://review.openstack.org/#/c/63708/ instead so that we can get this in cleanly?","commit_id":"d59f7d15793a56353741b99e7e530c54f5934e31"}]}
