)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d06d7836c2d3d7734ae08ebd403bb857cbb0969d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"retries reaches its max and logs an incorrect error message"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This commit changes the error message to a better one."},{"line_number":13,"context_line":"Something along the lines of logging the current state"},{"line_number":14,"context_line":"and contrasting that with  what the correct state should"},{"line_number":15,"context_line":"be."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ic2400c905acbedb18193bd1459d81c05bef2ff52"},{"line_number":18,"context_line":"Closes-Bug: #1404331"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a061dce_10b443cf","line":15,"range":{"start_line":13,"start_character":0,"end_line":15,"end_character":3},"updated":"2016-04-05 15:52:57.000000000","message":"You don\u0027t actually do this.","commit_id":"45be3d64143abbb097f995f54d7f3b54725097cd"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"55374b45ed4d5fc14aa52518303d29fd617b16df","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":156,"context_line":"            # above."},{"line_number":157,"context_line":"            msg \u003d (_(\"Error contacting Ironic server for \""},{"line_number":158,"context_line":"                     \"\u0027%(method)s\u0027. Attempt %(attempt)d of %(total)d\") %"},{"line_number":159,"context_line":"                        {\u0027method\u0027: method,"},{"line_number":160,"context_line":"                         \u0027attempt\u0027: attempt,"},{"line_number":161,"context_line":"                         \u0027total\u0027: num_attempts})"},{"line_number":162,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":163,"context_line":"                msg \u003d (_(\"Could not update node in invalid state %s; expected\""},{"line_number":164,"context_line":"                         \" %s\" % (ironic_states.ERROR, ironic_states.ACTIVE )))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_b0a7c2a5","line":161,"range":{"start_line":157,"start_character":0,"end_line":161,"end_character":48},"updated":"2016-03-18 23:32:53.000000000","message":"If adding a new msg like this patch, the original msg should be moved to line 167 for its code readability.","commit_id":"c70daf064ee4191ed8e183bb6949d66763486020"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065a8b6ae3b71494116ca298664df7a7fcd87958","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":156,"context_line":"            # above."},{"line_number":157,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":158,"context_line":"                msg \u003d (_(\"Could not update node in invalid state %(invalid)s;\""},{"line_number":159,"context_line":"                         \"expected %(expected)s\") %"},{"line_number":160,"context_line":"                             {\u0027invalid\u0027: ironic_states.ERROR,"},{"line_number":161,"context_line":"                              \u0027expected\u0027: ironic_states.ACTIVE})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_74ce8f5b","line":158,"range":{"start_line":158,"start_character":77,"end_line":158,"end_character":78},"updated":"2016-03-21 13:22:13.000000000","message":"You need a space between the ; and \"expected\".","commit_id":"abe57fb56d9b9e53b90855d2476768e795f22e3d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"065a8b6ae3b71494116ca298664df7a7fcd87958","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":158,"context_line":"                msg \u003d (_(\"Could not update node in invalid state %(invalid)s;\""},{"line_number":159,"context_line":"                         \"expected %(expected)s\") %"},{"line_number":160,"context_line":"                             {\u0027invalid\u0027: ironic_states.ERROR,"},{"line_number":161,"context_line":"                              \u0027expected\u0027: ironic_states.ACTIVE})"},{"line_number":162,"context_line":"                LOG.error(msg)"},{"line_number":163,"context_line":"                raise exception.NovaException(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_1460f334","line":160,"range":{"start_line":160,"start_character":41,"end_line":160,"end_character":60},"updated":"2016-03-21 13:22:13.000000000","message":"How do you know that the failure is due to a node being in an invalid state? It seems this logging is making assumptions about what\u0027s being called and the state of things, which might be OK for the bug that was reported but I\u0027m not sure makes sense in other scenarios.","commit_id":"abe57fb56d9b9e53b90855d2476768e795f22e3d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bf3cf092525cf224bd5f4953c56081676ad17293","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":158,"context_line":"                msg \u003d (_(\"Could not update node in invalid state %(invalid)s;\""},{"line_number":159,"context_line":"                         \"expected %(expected)s\") %"},{"line_number":160,"context_line":"                             {\u0027invalid\u0027: ironic_states.ERROR,"},{"line_number":161,"context_line":"                              \u0027expected\u0027: ironic_states.ACTIVE})"},{"line_number":162,"context_line":"                LOG.error(msg)"},{"line_number":163,"context_line":"                raise exception.NovaException(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da0c15f0_766e6e97","line":160,"range":{"start_line":160,"start_character":41,"end_line":160,"end_character":60},"in_reply_to":"fa0719c6_1460f334","updated":"2016-03-26 13:17:04.000000000","message":"This does not seem correct. Now we only retry on connection failures here, it has nothing to do with the node state. The conflict retry logic has moved to ironicclient itself.","commit_id":"abe57fb56d9b9e53b90855d2476768e795f22e3d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2c5748898244a4ed9d7f504f458ded8726731364","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":160,"context_line":"            # above."},{"line_number":161,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":162,"context_line":"                msg \u003d (_(\"Abort contacting Ironic server for \""},{"line_number":163,"context_line":"                         \"\u0027%(method)s\u0027. Max retries of %(total)d exceeded\") %"},{"line_number":164,"context_line":"                            {\u0027method\u0027: method,"},{"line_number":165,"context_line":"                             \u0027total\u0027: num_attempts})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_2ecf9180","line":162,"range":{"start_line":162,"start_character":23,"end_line":162,"end_character":25},"updated":"2016-04-05 02:04:13.000000000","message":"This msg is passed to LOG.error(), so it is necessary to put \"_LE(\" instead of \"_(\".","commit_id":"fcf66c3f0a9b7e3d2249637a25f1e3b8695804a8"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"2b2644ad5ad9f035f5f29f3ca58c196cef1bd8b3","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":160,"context_line":"            # above."},{"line_number":161,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":162,"context_line":"                msg \u003d (_(\"Abort contacting Ironic server for \""},{"line_number":163,"context_line":"                         \"\u0027%(method)s\u0027. Max retries of %(total)d exceeded\") %"},{"line_number":164,"context_line":"                            {\u0027method\u0027: method,"},{"line_number":165,"context_line":"                             \u0027total\u0027: num_attempts})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_59f3ad9e","line":162,"range":{"start_line":162,"start_character":23,"end_line":162,"end_character":25},"in_reply_to":"9a061dce_2ecf9180","updated":"2016-04-05 03:07:49.000000000","message":"According to oslo i18n guide, it is no problem.\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#choosing-a-marker-function","commit_id":"fcf66c3f0a9b7e3d2249637a25f1e3b8695804a8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f34a4e310a9caa13e977fa61824331c4341a790e","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":160,"context_line":"            # above."},{"line_number":161,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":162,"context_line":"                msg \u003d (_(\"Abort contacting Ironic server for \""},{"line_number":163,"context_line":"                         \"\u0027%(method)s\u0027. Max retries of %(total)d exceeded\") %"},{"line_number":164,"context_line":"                            {\u0027method\u0027: method,"},{"line_number":165,"context_line":"                             \u0027total\u0027: num_attempts})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_37698626","line":162,"range":{"start_line":162,"start_character":23,"end_line":162,"end_character":25},"in_reply_to":"9a061dce_59f3ad9e","updated":"2016-04-05 14:13:42.000000000","message":"msg is then passed to raise, so it must be _() actually. however, I don\u0027t see point in this change. Also \"abort contacting\" sounds weird to me.","commit_id":"fcf66c3f0a9b7e3d2249637a25f1e3b8695804a8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d06d7836c2d3d7734ae08ebd403bb857cbb0969d","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            # We want to perform this logic for all exception cases listed"},{"line_number":160,"context_line":"            # above."},{"line_number":161,"context_line":"            if attempt \u003d\u003d num_attempts:"},{"line_number":162,"context_line":"                msg \u003d (_(\"Abort contact of Ironic server for \""},{"line_number":163,"context_line":"                         \"\u0027%(method)s\u0027. Max retries of %(total)d exceeded\") %"},{"line_number":164,"context_line":"                            {\u0027method\u0027: method,"},{"line_number":165,"context_line":"                             \u0027total\u0027: num_attempts})"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_50219bb3","line":162,"updated":"2016-04-05 15:52:57.000000000","message":"We only get here if retry_excs was hit, which is service unavailable or connection refused.\n\nTherefore, I think the error message would make more sense as something like this:\n\n \"Timed out attempting to connect to Ironic endpoint at \n  %(endpoint)s after %(total)s attempts.\" %\n {\u0027endpoint\u0027: CONF.ironic.api_endpoint, \u0027total\u0027: num_attempts}","commit_id":"45be3d64143abbb097f995f54d7f3b54725097cd"}]}
