)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"539f2f39eb7e5ce9fa37cdfbc1ae8a1d505fe113","unresolved":false,"context_lines":[{"line_number":11,"context_line":"and convert the new format to old format where the atomic"},{"line_number":12,"context_line":"actions needs to be used."},{"line_number":13,"context_line":"Blueprint: improve-atomic-actions"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I8aecd5bad319aa61d5f8a20a2c2fe9bacdc0e81a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1a1ced50_2e9ca668","line":14,"updated":"2017-03-20 18:19:17.000000000","message":"add yourself as co-author","commit_id":"6a03599816de97318d86d34fc1fd9fec0ed71308"}],"rally-jobs/plugins/rally_profile.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"7074bba9cd49f1f56cd1607431582109b205bfa2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            for _ in range(number_of_atomics):"},{"line_number":48,"context_line":"                with atomic.ActionTimer(self, tmp_name):"},{"line_number":49,"context_line":"                    pass"},{"line_number":50,"context_line":"        started_at \u003d self._atomic_actions[-1][\"started_at\"]"},{"line_number":51,"context_line":"        finished_at \u003d self._atomic_actions[-1][\"finished_at\"]"},{"line_number":52,"context_line":"        self._atomic_actions \u003d [{\"name\": calc_atomic_name,"},{"line_number":53,"context_line":"                                 \"started_at\": started_at,"},{"line_number":54,"context_line":"                                 \"finished_at\": finished_at,"},{"line_number":55,"context_line":"                                 \"children\": []}]"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_d0f16e96","line":55,"range":{"start_line":50,"start_character":8,"end_line":55,"end_character":49},"updated":"2017-03-13 09:25:00.000000000","message":"While we are here, let\u0027s remove using inner stuff of atomics. We can achive it using ActionTimerMixin[*] instance at L48 instead of self.  \n\n[*] https://github.com/openstack/rally/blob/master/rally/task/atomic.py#L22","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"},{"author":{"_account_id":21528,"name":"chenhb","email":"chen.haibing1@zte.com.cn","username":"chenhb"},"change_message_id":"8bcaac24d7f0aa7e12d5ff0a92a1f14e99558e7f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            for _ in range(number_of_atomics):"},{"line_number":48,"context_line":"                with atomic.ActionTimer(self, tmp_name):"},{"line_number":49,"context_line":"                    pass"},{"line_number":50,"context_line":"        started_at \u003d self._atomic_actions[-1][\"started_at\"]"},{"line_number":51,"context_line":"        finished_at \u003d self._atomic_actions[-1][\"finished_at\"]"},{"line_number":52,"context_line":"        self._atomic_actions \u003d [{\"name\": calc_atomic_name,"},{"line_number":53,"context_line":"                                 \"started_at\": started_at,"},{"line_number":54,"context_line":"                                 \"finished_at\": finished_at,"},{"line_number":55,"context_line":"                                 \"children\": []}]"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_dd76e2a2","line":55,"range":{"start_line":50,"start_character":8,"end_line":55,"end_character":49},"in_reply_to":"9a30ddce_d0f16e96","updated":"2017-03-13 10:50:39.000000000","message":"great!","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"}],"rally/plugins/common/sla/max_average_duration_per_atomic.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"539f2f39eb7e5ce9fa37cdfbc1ae8a1d505fe113","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def add_iteration(self, iteration):"},{"line_number":48,"context_line":"        if not iteration.get(\"error\"):"},{"line_number":49,"context_line":"            iteration[\"atomic_actions\"] \u003d objects.Task.convert_atomic_actions("},{"line_number":50,"context_line":"                iteration[\"atomic_actions\"])"},{"line_number":51,"context_line":"            for action, value in iteration[\"atomic_actions\"].items():"},{"line_number":52,"context_line":"                self.avg_comp_by_action[action].add(value)"},{"line_number":53,"context_line":"                result \u003d self.avg_comp_by_action[action].result()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_4eef2287","line":50,"range":{"start_line":49,"start_character":12,"end_line":50,"end_character":44},"updated":"2017-03-20 18:19:17.000000000","message":"it shows that change of atomics structure is done in a backward incompatible way. Any external plugin can be broken by this change, we need to find the way to avoid such case.\n\nLet\u0027s simulate both, new and old formats for SLA. To do it, we can implement some wrapper for atomic actions like bellow and put it to https://github.com/openstack/rally/blob/master/rally/task/sla.py#L53-L60\n\n        class WrapperForAtomicActions(dict):\n            def __init__(self, atomic_actions):\n                self.__atomic_actions \u003d atomic_actions\n                self.__old_atomic_actions \u003d objects.Task.convert_atomic_actions(self.__atomic_actions)\n\n            def items(self):\n                LOG.warn(\"Atomic actions format is changed. It is a list now.\")\n                return self.__old_atomic_actions\n\n            def get(self, name, default\u003dNone):\n                LOG.warn(\"Atomic actions format is changed. It is a list now.\")\n                return self.__old_atomic_actions.get(name, default)\n\n            def __iter__(self):\n                return self.__atomic_actions\n\n            def __len__(self):\n                return len(self.__atomic_actions)\n\n            def __getattr__(self, name, default\u003dNone):\n                return getattr(self.__atomic_actions, name, default)\n\n            def __getitem__(self, item):\n                if isinstance(item, int):\n                    # it is a call to list:\n                    return self.__atomic_actions[item]\n                else:\n                    LOG.warn(\"...\") \n                    return self.__old_atomic_actions[item]","commit_id":"6a03599816de97318d86d34fc1fd9fec0ed71308"}],"rally/task/runner.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"fb24d66f329432b6fa84ab67bc53b43da9ceef5b","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                           \"action\": action,"},{"line_number":278,"context_line":"                           \"type\": type(action[key])})"},{"line_number":279,"context_line":"                    return False"},{"line_number":280,"context_line":"            if action[\"children\"]:"},{"line_number":281,"context_line":"                actions_list.extend(action[\"children\"])"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        for e in result[\"error\"]:"},{"line_number":284,"context_line":"            if not isinstance(e, str):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_65867cdc","line":281,"range":{"start_line":280,"start_character":12,"end_line":281,"end_character":55},"updated":"2017-03-10 09:58:40.000000000","message":"not sure that we need to merge children with main list.","commit_id":"acceb797278f922a041d5bce4623ebb5e077b0af"},{"author":{"_account_id":21528,"name":"chenhb","email":"chen.haibing1@zte.com.cn","username":"chenhb"},"change_message_id":"d4c3a169643fe3f0777bd30324bf9951a6696a5a","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                           \"action\": action,"},{"line_number":278,"context_line":"                           \"type\": type(action[key])})"},{"line_number":279,"context_line":"                    return False"},{"line_number":280,"context_line":"            if action[\"children\"]:"},{"line_number":281,"context_line":"                actions_list.extend(action[\"children\"])"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        for e in result[\"error\"]:"},{"line_number":284,"context_line":"            if not isinstance(e, str):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_850b4c23","line":281,"range":{"start_line":280,"start_character":12,"end_line":281,"end_character":55},"in_reply_to":"9a30ddce_65867cdc","updated":"2017-03-11 06:38:50.000000000","message":"@Andrey, because here we need to check every action, i deeply copy an actions list, use this list instead of recursive process. :)","commit_id":"acceb797278f922a041d5bce4623ebb5e077b0af"}],"rally/task/service.py":[{"author":{"_account_id":22960,"name":"Hai Shi","email":"shihai1992@gmail.com","username":"haishi"},"change_message_id":"3dbd1f42f0363b5cd23ef710804fad8a5b5e2332","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_643d67c3","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":31},"updated":"2017-03-13 09:35:50.000000000","message":"@Andrey If we start to support inner atomics, can we remove \u0027no_atomic\u0027?","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"51e6806222c5f7e148e8a5d3ca11871f0c7a9819","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_e7d5d91b","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":31},"in_reply_to":"9a30ddce_643d67c3","updated":"2017-03-13 10:06:19.000000000","message":"yes, after this patch, we will able to remove all these workarounds","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"},{"author":{"_account_id":21528,"name":"chenhb","email":"chen.haibing1@zte.com.cn","username":"chenhb"},"change_message_id":"222ecc78c2f826804d6522db0c9e9d0c93e0f465","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_9dc38a37","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":31},"in_reply_to":"9a30ddce_e7d5d91b","updated":"2017-03-13 11:01:05.000000000","message":"@Andrey, About converting to old format, do we need to convert the children actions? I have converted children actions to main actions, it is like to be unnecessary.","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"},{"author":{"_account_id":22960,"name":"Hai Shi","email":"shihai1992@gmail.com","username":"haishi"},"change_message_id":"bfbae696664e36eaab84e8e7db1fbd6499cddfa6","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a30ddce_1df23a06","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":31},"in_reply_to":"9a30ddce_e7d5d91b","updated":"2017-03-13 10:52:49.000000000","message":"Wow, it would be more clear.","commit_id":"c9dc603b266c7ad0d1b2508eecbf382f6b60b5b0"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"539f2f39eb7e5ce9fa37cdfbc1ae8a1d505fe113","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    func.require_impl \u003d True"},{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"},{"line_number":72,"context_line":"        pass"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def append(self, value):"},{"line_number":75,"context_line":"        pass"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class _ServiceWithoutAtomic(object):"},{"line_number":79,"context_line":"    def __init__(self, service):"},{"line_number":80,"context_line":"        self._service \u003d service"},{"line_number":81,"context_line":"        self._atomic_actions \u003d _DevNullList()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def atomic_actions(self):"},{"line_number":84,"context_line":"        return self._atomic_actions"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __getattr__(self, name):"},{"line_number":87,"context_line":"        return getattr(self._service, name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __str__(self):"},{"line_number":90,"context_line":"        return \"\u0027%s\u0027 without atomic actions\" % self._service.__name__"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __repr__(self):"},{"line_number":93,"context_line":"        return \"\u003c%s\u003e\" % str(self)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def method_wrapper(func):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_cecf927d","line":93,"range":{"start_line":66,"start_character":0,"end_line":93,"end_character":33},"updated":"2017-03-20 18:19:17.000000000","message":"it looks like we can remove that stuff now","commit_id":"6a03599816de97318d86d34fc1fd9fec0ed71308"},{"author":{"_account_id":21528,"name":"chenhb","email":"chen.haibing1@zte.com.cn","username":"chenhb"},"change_message_id":"dfb36fc9374e5975121ba1075a8371377f4a5cbd","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    func.require_impl \u003d True"},{"line_number":64,"context_line":"    return func"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"# TODO(andreykurilin): remove _DevNullDict and _ServiceWithoutAtomic when we"},{"line_number":68,"context_line":"#   start support inner atomics"},{"line_number":69,"context_line":"class _DevNullList(list):"},{"line_number":70,"context_line":"    \"\"\"Do not keep anything.\"\"\""},{"line_number":71,"context_line":"    def __setitem__(self, key, value):"},{"line_number":72,"context_line":"        pass"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def append(self, value):"},{"line_number":75,"context_line":"        pass"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class _ServiceWithoutAtomic(object):"},{"line_number":79,"context_line":"    def __init__(self, service):"},{"line_number":80,"context_line":"        self._service \u003d service"},{"line_number":81,"context_line":"        self._atomic_actions \u003d _DevNullList()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def atomic_actions(self):"},{"line_number":84,"context_line":"        return self._atomic_actions"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __getattr__(self, name):"},{"line_number":87,"context_line":"        return getattr(self._service, name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __str__(self):"},{"line_number":90,"context_line":"        return \"\u0027%s\u0027 without atomic actions\" % self._service.__name__"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __repr__(self):"},{"line_number":93,"context_line":"        return \"\u003c%s\u003e\" % str(self)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def method_wrapper(func):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a1ced50_202ca501","line":93,"range":{"start_line":66,"start_character":0,"end_line":93,"end_character":33},"in_reply_to":"1a1ced50_cecf927d","updated":"2017-03-21 03:22:06.000000000","message":"yep. no_atomic is not used in any scenario now, we can remove this class in this patch. :)","commit_id":"6a03599816de97318d86d34fc1fd9fec0ed71308"}]}
