)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"7407c7c384d0e59b7a6d3add1776d13890b77835","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There were few comments on the"},{"line_number":10,"context_line":"day of the merge, this patch set fixes all"},{"line_number":11,"context_line":"comments"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I6f6807fa12dbb495cc263cfade69bbe0b9498392"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dada55a8_feb3a508","line":11,"updated":"2016-07-18 01:04:17.000000000","message":"Please add a full stop at the end of this line.","commit_id":"7c8e0d2def313a1964047a5626eaceb69c23b64e"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"6b79ad87405217410a860ef08893563138aed607","unresolved":false,"context_lines":[{"line_number":9,"context_line":"There were few comments on the"},{"line_number":10,"context_line":"day of the merge, this patch set fixes all"},{"line_number":11,"context_line":"comments"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I6f6807fa12dbb495cc263cfade69bbe0b9498392"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dada55a8_df7b1f28","line":12,"updated":"2016-07-22 18:20:30.000000000","message":"Can you be a little more specific? This body and title are very vague. It might also be helpful to add a link to the patch you are referencing.","commit_id":"7c8e0d2def313a1964047a5626eaceb69c23b64e"}],"cinder/volume/drivers/coprhd/helpers/commoncoprhdapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f0fe64fdfca28bd0bbfc4a7131837abcb530d767","unresolved":false,"context_lines":[{"line_number":407,"context_line":"# Timeout handler for synchronous operations"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"def timeout_handler():"},{"line_number":411,"context_line":"    global IS_TASK_TIMEOUT"},{"line_number":412,"context_line":"    IS_TASK_TIMEOUT \u003d True"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"# Blocks the operation until the task is complete/error out/timeout"},{"line_number":416,"context_line":"def block_until_complete(component_type,"},{"line_number":417,"context_line":"                         resource_uri,"},{"line_number":418,"context_line":"                         task_id,"},{"line_number":419,"context_line":"                         ipAddr,"},{"line_number":420,"context_line":"                         port,"},{"line_number":421,"context_line":"                         synctimeout\u003d0):"},{"line_number":422,"context_line":"    global IS_TASK_TIMEOUT"},{"line_number":423,"context_line":"    IS_TASK_TIMEOUT \u003d False"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    if not synctimeout:"},{"line_number":426,"context_line":"        synctimeout \u003d TASK_TIMEOUT"},{"line_number":427,"context_line":"    t \u003d threading.Timer(synctimeout, timeout_handler)"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"    t.start()"},{"line_number":430,"context_line":"    while True:"},{"line_number":431,"context_line":"        out \u003d get_task_by_resourceuri_and_taskId("},{"line_number":432,"context_line":"            component_type, resource_uri, task_id, ipAddr, port)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        if out:"},{"line_number":435,"context_line":"            if out[\"state\"] \u003d\u003d \"ready\":"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"                    # cancel the timer and return"},{"line_number":438,"context_line":"                t.cancel()"},{"line_number":439,"context_line":"                break"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"            # if the status of the task is \u0027error\u0027 then cancel the timer"},{"line_number":442,"context_line":"            # and raise exception"},{"line_number":443,"context_line":"            if out[\"state\"] \u003d\u003d \"error\":"},{"line_number":444,"context_line":"                # cancel the timer"},{"line_number":445,"context_line":"                t.cancel()"},{"line_number":446,"context_line":"                if (\"service_error\" in out and"},{"line_number":447,"context_line":"                        \"details\" in out[\"service_error\"]):"},{"line_number":448,"context_line":"                    error_message \u003d out[\"service_error\"][\"details\"]"},{"line_number":449,"context_line":"                raise CoprHdError(CoprHdError.VALUE_ERR,"},{"line_number":450,"context_line":"                                  (_(\"Task: %(task_id)s\""},{"line_number":451,"context_line":"                                     \" is failed with\""},{"line_number":452,"context_line":"                                     \" error: %(error_message)s\") %"},{"line_number":453,"context_line":"                                   {\u0027task_id\u0027: task_id,"},{"line_number":454,"context_line":"                                    \u0027error_message\u0027: error_message"},{"line_number":455,"context_line":"                                    }))"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        if IS_TASK_TIMEOUT:"},{"line_number":458,"context_line":"            IS_TASK_TIMEOUT \u003d False"},{"line_number":459,"context_line":"            raise CoprHdError(CoprHdError.TIME_OUT,"},{"line_number":460,"context_line":"                              (_(\"Task did not complete in %d secs.\""},{"line_number":461,"context_line":"                                 \" Operation timed out. Task in CoprHD\""},{"line_number":462,"context_line":"                                 \" will continue\") % synctimeout))"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    return"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"def get_task_by_resourceuri_and_taskId(component_type, resource_uri,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_5ff3a19e","line":464,"range":{"start_line":410,"start_character":0,"end_line":464,"end_character":10},"updated":"2016-07-28 10:55:48.000000000","message":"I believe this code is still race-condition-prone and dangerous when running it in multiple greenthreads (which we do). Why not simply track time on your own using oslo [1]? It is that simple:\n\n t \u003d timeutils.StopWatch(duration\u003dsynctimeout)\n\n while not t.elapsed:\n     # do stuff\n else:\n     raise CoprHdError(CoprHdError.TIME_OUT,\n                       (_(\"Task did not complete in %d secs.\"\n                          \" Operation timed out. Task in CoprHD\"\n                          \" will continue\") % synctimeout))\n\n[1] http://docs.openstack.org/developer/oslo.utils/examples/timeutils.html#tracking-durations-with-a-stopwatch","commit_id":"8c1085d367f3fedb38bdb97691b99ff5e30e6819"}]}
