)]}'
{"doc/source/configuration/config-guide.rst":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bf1ebf9c02444f1ef0f290aef62ccacf4a0b58db","unresolved":false,"context_lines":[{"line_number":149,"context_line":"   *\"evaluation_interval \u003d 20\"*, so evaluate action executions every"},{"line_number":150,"context_line":"   20 seconds. When the evaluation runs it will transit all running action"},{"line_number":151,"context_line":"   executions to error if the last heartbeat received is older than *\"20 \\*"},{"line_number":152,"context_line":"   max_missed_heartbeats\"* seconds."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"   - **max_missed_heartbeats**"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5f7c97a3_ff3e5c89","line":152,"range":{"start_line":152,"start_character":3,"end_line":152,"end_character":24},"updated":"2018-05-11 05:50:39.000000000","message":"I think we can use the value of 15 instead of the symbolic name.","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":149,"context_line":"   *\"evaluation_interval \u003d 20\"*, so evaluate action executions every"},{"line_number":150,"context_line":"   20 seconds. When the evaluation runs it will transit all running action"},{"line_number":151,"context_line":"   executions to error if the last heartbeat received is older than *\"20 \\*"},{"line_number":152,"context_line":"   max_missed_heartbeats\"* seconds."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"   - **max_missed_heartbeats**"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"5f7c97a3_c654f555","line":152,"range":{"start_line":152,"start_character":3,"end_line":152,"end_character":24},"in_reply_to":"5f7c97a3_ff3e5c89","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bf1ebf9c02444f1ef0f290aef62ccacf4a0b58db","unresolved":false,"context_lines":[{"line_number":154,"context_line":"   - **max_missed_heartbeats**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    Defines the maximum amount of missed heartbeats to be allowed. If the number"},{"line_number":157,"context_line":"    of missed heartbeats exceeds this number then the related action execution"},{"line_number":158,"context_line":"    will be transited to *\"ERROR\"* state with cause *\"Heartbeat wasn\u0027t received.\"*."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"   - **evaluation_interval**"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5f7c97a3_1f44781a","line":157,"range":{"start_line":157,"start_character":44,"end_line":157,"end_character":45},"updated":"2018-05-11 05:50:39.000000000","message":",","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":154,"context_line":"   - **max_missed_heartbeats**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    Defines the maximum amount of missed heartbeats to be allowed. If the number"},{"line_number":157,"context_line":"    of missed heartbeats exceeds this number then the related action execution"},{"line_number":158,"context_line":"    will be transited to *\"ERROR\"* state with cause *\"Heartbeat wasn\u0027t received.\"*."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"   - **evaluation_interval**"}],"source_content_type":"text/x-rst","patch_set":15,"id":"5f7c97a3_664de1c2","line":157,"range":{"start_line":157,"start_character":44,"end_line":157,"end_character":45},"in_reply_to":"5f7c97a3_1f44781a","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"6ddea5e04c2e705461cbbf2d8392c698ce99c961","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   It is possible that actions stuck in *\"RUNNING\"* state, for example if the"},{"line_number":137,"context_line":"   assigned executor dies or the message that signals the completion of the"},{"line_number":138,"context_line":"   action is lost. This section describes a heartbeat based solution to close"},{"line_number":139,"context_line":"   these forgotten actions executions. The related configuration options are"},{"line_number":140,"context_line":"   ``max_missed_heartbeats`` and ``evaluation_interval``. Note that if either"},{"line_number":141,"context_line":"   of these options are *\"0\"* then the feature won\u0027t be enabled."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5f7c97a3_066b8484","line":139,"range":{"start_line":139,"start_character":19,"end_line":139,"end_character":26},"updated":"2018-06-01 07:31:08.000000000","message":"Minor: actions -\u003e action","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   It is possible that actions stuck in *\"RUNNING\"* state, for example if the"},{"line_number":137,"context_line":"   assigned executor dies or the message that signals the completion of the"},{"line_number":138,"context_line":"   action is lost. This section describes a heartbeat based solution to close"},{"line_number":139,"context_line":"   these forgotten actions executions. The related configuration options are"},{"line_number":140,"context_line":"   ``max_missed_heartbeats`` and ``evaluation_interval``. Note that if either"},{"line_number":141,"context_line":"   of these options are *\"0\"* then the feature won\u0027t be enabled."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5f7c97a3_845c677d","line":139,"range":{"start_line":139,"start_character":19,"end_line":139,"end_character":26},"in_reply_to":"5f7c97a3_066b8484","updated":"2018-06-01 15:17:40.000000000","message":"Done","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"doc/source/main_features.rst":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":334,"context_line":" Defines the maximum number of finished executions."},{"line_number":335,"context_line":" It must be greater or equal to *\"1\"*."},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"Action execution reporting"},{"line_number":338,"context_line":"---------------------------"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"It is possible that actions stuck in *\"RUNNING\"* state, for example if the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"5f7c97a3_fb09c330","line":337,"updated":"2018-05-09 09:53:07.000000000","message":"I think it\u0027s wrong place for this doc because it\u0027s not a main feature. High availability is a main feature. Action execution reporting is a little part of ha.\nMaybe you should move it to the configuration guide?","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":334,"context_line":" Defines the maximum number of finished executions."},{"line_number":335,"context_line":" It must be greater or equal to *\"1\"*."},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"Action execution reporting"},{"line_number":338,"context_line":"---------------------------"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"It is possible that actions stuck in *\"RUNNING\"* state, for example if the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"5f7c97a3_03bc5167","line":337,"in_reply_to":"5f7c97a3_0d88001d","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"d2982daa9b478227d3a746a429d9d6fd57f9406a","unresolved":false,"context_lines":[{"line_number":334,"context_line":" Defines the maximum number of finished executions."},{"line_number":335,"context_line":" It must be greater or equal to *\"1\"*."},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"Action execution reporting"},{"line_number":338,"context_line":"---------------------------"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"It is possible that actions stuck in *\"RUNNING\"* state, for example if the"}],"source_content_type":"text/x-rst","patch_set":9,"id":"5f7c97a3_0d88001d","line":337,"in_reply_to":"5f7c97a3_fb09c330","updated":"2018-05-09 10:46:16.000000000","message":"Agreed, that would be a better location.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":342,"context_line":"action is lost. This section describes a heartbeat based solution to close"},{"line_number":343,"context_line":"these forgotten actions executions."},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"**By default this feature is disabled.**"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"To enable the feature, edit the Mistral configuration file and specify both"},{"line_number":348,"context_line":"``max_missed_heartbeats`` and ``evaluation_interval`` options. Note that if"}],"source_content_type":"text/x-rst","patch_set":9,"id":"5f7c97a3_db6de732","line":345,"updated":"2018-05-09 09:53:07.000000000","message":"Can you specify the reason in the doc? You already mentioned it.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":342,"context_line":"action is lost. This section describes a heartbeat based solution to close"},{"line_number":343,"context_line":"these forgotten actions executions."},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"**By default this feature is disabled.**"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"To enable the feature, edit the Mistral configuration file and specify both"},{"line_number":348,"context_line":"``max_missed_heartbeats`` and ``evaluation_interval`` options. Note that if"}],"source_content_type":"text/x-rst","patch_set":9,"id":"5f7c97a3_e36d9504","line":345,"in_reply_to":"5f7c97a3_db6de732","updated":"2018-05-09 13:46:21.000000000","message":"Rather set your proposed defaults.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"}],"mistral/config.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_a8d4b0be","line":374,"updated":"2018-04-27 12:10:52.000000000","message":"Specify min value","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_ce4f7932","line":374,"in_reply_to":"9f6a8fd7_a8d4b0be","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_c8eec48a","line":375,"updated":"2018-04-27 12:10:52.000000000","message":"Is zero expected as default value?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_5b90f743","line":375,"in_reply_to":"5f7c97a3_2e5aadf2","updated":"2018-05-09 09:53:07.000000000","message":"I just don\u0027t want the workflow can hang in the running state by default. \nI can offer a big default values. For example, max_missed_heartbeats \u003d 20 and evaluation_interval \u003d 15.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_431ec970","line":375,"in_reply_to":"5f7c97a3_5b90f743","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":372,"context_line":"action_heartbeat_opts \u003d ["},{"line_number":373,"context_line":"    cfg.IntOpt("},{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        default\u003d0,"},{"line_number":376,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats allowed.\u0027"},{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_2e5aadf2","line":375,"in_reply_to":"9f6a8fd7_c8eec48a","updated":"2018-05-08 14:06:31.000000000","message":"It wouldn\u0027t be easy to agree on a default value that fits every scenario, so I left it disabled by default.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"},{"line_number":379,"context_line":"    cfg.IntOpt("},{"line_number":380,"context_line":"        \u0027evaluation_interval\u0027,"},{"line_number":381,"context_line":"        default\u003d0,"},{"line_number":382,"context_line":"        help\u003d_(\u0027How often will the action executions be evaluated \u0027"},{"line_number":383,"context_line":"               \u0027(in seconds). For example when evaluation_interval \u003d 10, \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_48d954f2","line":380,"updated":"2018-04-27 12:10:52.000000000","message":"Specify min value","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":377,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":378,"context_line":"    ),"},{"line_number":379,"context_line":"    cfg.IntOpt("},{"line_number":380,"context_line":"        \u0027evaluation_interval\u0027,"},{"line_number":381,"context_line":"        default\u003d0,"},{"line_number":382,"context_line":"        help\u003d_(\u0027How often will the action executions be evaluated \u0027"},{"line_number":383,"context_line":"               \u0027(in seconds). For example when evaluation_interval \u003d 10, \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_eef835c5","line":380,"in_reply_to":"9f6a8fd7_48d954f2","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    ),"},{"line_number":379,"context_line":"    cfg.IntOpt("},{"line_number":380,"context_line":"        \u0027evaluation_interval\u0027,"},{"line_number":381,"context_line":"        default\u003d0,"},{"line_number":382,"context_line":"        help\u003d_(\u0027How often will the action executions be evaluated \u0027"},{"line_number":383,"context_line":"               \u0027(in seconds). For example when evaluation_interval \u003d 10, \u0027"},{"line_number":384,"context_line":"               \u0027evaluate action executions every 10 seconds. When the \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_28e0a096","line":381,"updated":"2018-04-27 12:10:52.000000000","message":"Is zero expected as default value? Why you want to disable this feature by default?\nIf it makes sense to disable this by default then you should update docs. Otherwise user can\u0027t know about this cool feature.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    ),"},{"line_number":379,"context_line":"    cfg.IntOpt("},{"line_number":380,"context_line":"        \u0027evaluation_interval\u0027,"},{"line_number":381,"context_line":"        default\u003d0,"},{"line_number":382,"context_line":"        help\u003d_(\u0027How often will the action executions be evaluated \u0027"},{"line_number":383,"context_line":"               \u0027(in seconds). For example when evaluation_interval \u003d 10, \u0027"},{"line_number":384,"context_line":"               \u0027evaluate action executions every 10 seconds. When the \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_cefd39b2","line":381,"in_reply_to":"9f6a8fd7_28e0a096","updated":"2018-05-08 14:06:31.000000000","message":"Added the missing documentation. Please review.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        min\u003d0,"},{"line_number":376,"context_line":"        default\u003d0,"},{"line_number":377,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats to be allowed.\u0027"},{"line_number":378,"context_line":"               \u0027If set to 0 then this feature won\\\u0027t be enabled.\u0027"},{"line_number":379,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":380,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_36a992de","line":377,"updated":"2018-05-09 09:53:07.000000000","message":"Add space in the end of lines. Otherwise text will be like this: \n\n# How often the action executions are evaluated (in seconds).For\n# example when evaluation_interval \u003d 10, evaluate actionexecutions\n# every 10 seconds. When the evaluation runs it willtransit all\n# running action executions to error if the lastheartbeat received is\n# older than 10 * max_missed_heartbeatsseconds. If set to 0 then this\n# feature won\u0027t be enabled. (integer value)\n# Minimum value: 0","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        \u0027max_missed_heartbeats\u0027,"},{"line_number":375,"context_line":"        min\u003d0,"},{"line_number":376,"context_line":"        default\u003d0,"},{"line_number":377,"context_line":"        help\u003d_(\u0027The maximum amount of missed heartbeats to be allowed.\u0027"},{"line_number":378,"context_line":"               \u0027If set to 0 then this feature won\\\u0027t be enabled.\u0027"},{"line_number":379,"context_line":"               \u0027See evaluation_interval for more details.\u0027)"},{"line_number":380,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_7ef11ccd","line":377,"in_reply_to":"5f7c97a3_36a992de","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":483,"context_line":"PECAN_GROUP \u003d \u0027pecan\u0027"},{"line_number":484,"context_line":"COORDINATION_GROUP \u003d \u0027coordination\u0027"},{"line_number":485,"context_line":"EXECUTION_EXPIRATION_POLICY_GROUP \u003d \u0027execution_expiration_policy\u0027"},{"line_number":486,"context_line":"ACTION_HEARTBEAT \u003d \u0027action_heartbeat\u0027"},{"line_number":487,"context_line":"PROFILER_GROUP \u003d profiler.list_opts()[0][0]"},{"line_number":488,"context_line":"KEYCLOAK_OIDC_GROUP \u003d \"keycloak_oidc\""},{"line_number":489,"context_line":"OPENSTACK_ACTIONS_GROUP \u003d \u0027openstack_actions\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_564e8e6f","line":486,"updated":"2018-05-09 09:53:07.000000000","message":"ACTION_HEARTBEAT -\u003e ACTION_HEARTBEAT_GROUP","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":483,"context_line":"PECAN_GROUP \u003d \u0027pecan\u0027"},{"line_number":484,"context_line":"COORDINATION_GROUP \u003d \u0027coordination\u0027"},{"line_number":485,"context_line":"EXECUTION_EXPIRATION_POLICY_GROUP \u003d \u0027execution_expiration_policy\u0027"},{"line_number":486,"context_line":"ACTION_HEARTBEAT \u003d \u0027action_heartbeat\u0027"},{"line_number":487,"context_line":"PROFILER_GROUP \u003d profiler.list_opts()[0][0]"},{"line_number":488,"context_line":"KEYCLOAK_OIDC_GROUP \u003d \"keycloak_oidc\""},{"line_number":489,"context_line":"OPENSTACK_ACTIONS_GROUP \u003d \u0027openstack_actions\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_9e73d84d","line":486,"in_reply_to":"5f7c97a3_564e8e6f","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        (PECAN_GROUP, pecan_opts),"},{"line_number":560,"context_line":"        (COORDINATION_GROUP, coordination_opts),"},{"line_number":561,"context_line":"        (EXECUTION_EXPIRATION_POLICY_GROUP, execution_expiration_policy_opts),"},{"line_number":562,"context_line":"        (PROFILER_GROUP, profiler_opts),"},{"line_number":563,"context_line":"        (KEYCLOAK_OIDC_GROUP, keycloak_oidc_opts),"},{"line_number":564,"context_line":"        (OPENSTACK_ACTIONS_GROUP, openstack_actions_opts),"},{"line_number":565,"context_line":"        (None, default_group_opts)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_f63c7ac0","line":562,"updated":"2018-05-09 09:53:07.000000000","message":"You should add the group name and options here. Otherwise it will not be present in a generated config file.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        (PECAN_GROUP, pecan_opts),"},{"line_number":560,"context_line":"        (COORDINATION_GROUP, coordination_opts),"},{"line_number":561,"context_line":"        (EXECUTION_EXPIRATION_POLICY_GROUP, execution_expiration_policy_opts),"},{"line_number":562,"context_line":"        (PROFILER_GROUP, profiler_opts),"},{"line_number":563,"context_line":"        (KEYCLOAK_OIDC_GROUP, keycloak_oidc_opts),"},{"line_number":564,"context_line":"        (OPENSTACK_ACTIONS_GROUP, openstack_actions_opts),"},{"line_number":565,"context_line":"        (None, default_group_opts)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_5e0a208a","line":562,"in_reply_to":"5f7c97a3_f63c7ac0","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"d54063f27f98f0e3ed4b3766293d41eae8c09fb2","unresolved":false,"context_lines":[{"line_number":356,"context_line":"               \u0027only the 100 latest finished executions will be preserved. \u0027"},{"line_number":357,"context_line":"               \u0027This means that even unexpired executions are eligible \u0027"},{"line_number":358,"context_line":"               \u0027for deletion, to decrease the number of executions in the \u0027"},{"line_number":359,"context_line":"               \u0027database. The default value is 0. If it is set to 0, \u0027"},{"line_number":360,"context_line":"               \u0027this constraint won\\\u0027t be applied.\u0027)"},{"line_number":361,"context_line":"    ),"},{"line_number":362,"context_line":"    cfg.IntOpt("}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_ee4ebe6d","line":359,"updated":"2018-05-10 12:36:30.000000000","message":"Thanks :)","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"}],"mistral/db/sqlalchemy/migration/alembic_migrations/versions/027_add_last_heartbeat_to_action_execution.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"d54063f27f98f0e3ed4b3766293d41eae8c09fb2","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from alembic import op"},{"line_number":29,"context_line":"from sqlalchemy import Column, DateTime"},{"line_number":30,"context_line":"from mistral.db import utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_ba02456e","line":30,"updated":"2018-05-10 12:36:30.000000000","message":"Change to: from mistral import utils.\nOr you can remove it, because the default value will be NULL in the database anyway.","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from alembic import op"},{"line_number":29,"context_line":"from sqlalchemy import Column, DateTime"},{"line_number":30,"context_line":"from mistral.db import utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_51a757a8","line":30,"in_reply_to":"5f7c97a3_ba02456e","updated":"2018-05-11 11:10:57.000000000","message":"Ohh well... I don\u0027t understand how the migration passed locally...","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"}],"mistral/db/v2/api.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"    )"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"def get_running_expired_actions(expiration_time, limit\u003dNone, columns\u003d(),"},{"line_number":414,"context_line":"                                session\u003dNone):"},{"line_number":415,"context_line":"    return IMPL.get_running_expired_actions("},{"line_number":416,"context_line":"        expiration_time,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_e62bb97f","line":413,"updated":"2018-04-27 12:10:52.000000000","message":"You add limit but you don\u0027t use it. Maybe we should add some config parameter for this case?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":410,"context_line":"    )"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"def get_running_expired_actions(expiration_time, limit\u003dNone, columns\u003d(),"},{"line_number":414,"context_line":"                                session\u003dNone):"},{"line_number":415,"context_line":"    return IMPL.get_running_expired_actions("},{"line_number":416,"context_line":"        expiration_time,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_b3dac1e6","line":413,"in_reply_to":"9f6a8fd7_e62bb97f","updated":"2018-05-08 14:06:31.000000000","message":"Indeed, it was there because of copy-paste.\n\nIt is not necessary to limit the query because the returned set should not be that big. I also removed the columns part as well.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"}],"mistral/db/v2/sqlalchemy/models.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e395babc7786b796daa318339a972213daea8491","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    accepted \u003d sa.Column(sa.Boolean(), default\u003dFalse)"},{"line_number":196,"context_line":"    input \u003d sa.Column(st.JsonLongDictType(), nullable\u003dTrue)"},{"line_number":197,"context_line":"    output \u003d sa.orm.deferred(sa.Column(st.JsonLongDictType(), nullable\u003dTrue))"},{"line_number":198,"context_line":"    last_heartbeat \u003d sa.Column("},{"line_number":199,"context_line":"        sa.DateTime,"},{"line_number":200,"context_line":"        default\u003dlambda: utils.utc_now_sec()"},{"line_number":201,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_c8cb1ba3","line":198,"updated":"2018-05-04 18:09:36.000000000","message":"I guess we should add alembic migration","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"d2982daa9b478227d3a746a429d9d6fd57f9406a","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    output \u003d sa.orm.deferred(sa.Column(st.JsonLongDictType(), nullable\u003dTrue))"},{"line_number":198,"context_line":"    last_heartbeat \u003d sa.Column("},{"line_number":199,"context_line":"        sa.DateTime,"},{"line_number":200,"context_line":"        default\u003dlambda: utils.utc_now_sec()"},{"line_number":201,"context_line":"    )"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_0d04807a","line":200,"range":{"start_line":200,"start_character":8,"end_line":200,"end_character":43},"updated":"2018-05-09 10:46:16.000000000","message":"I have not tested this, but I believe this would work:\n\ndefault\u003dutils.utc_now_sec","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"}],"mistral/engine/base.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        raise NotImplementedError"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @abc.abstractmethod"},{"line_number":135,"context_line":"    def report_running_actions(self, action_ex_ids):"},{"line_number":136,"context_line":"        \"\"\"Receives the heartbeat about the running actions."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        :param action_ex_ids: The action execution ids."}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_669fd84f","line":135,"range":{"start_line":135,"start_character":8,"end_line":135,"end_character":30},"updated":"2018-06-01 07:57:45.000000000","message":"Can you explain the naming? Why \"report\"?","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"d47d15e13a2d9458d528ed58fadfa93212ed1488","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        raise NotImplementedError"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @abc.abstractmethod"},{"line_number":135,"context_line":"    def report_running_actions(self, action_ex_ids):"},{"line_number":136,"context_line":"        \"\"\"Receives the heartbeat about the running actions."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        :param action_ex_ids: The action execution ids."}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_660a7826","line":135,"range":{"start_line":135,"start_character":8,"end_line":135,"end_character":30},"in_reply_to":"5f7c97a3_669fd84f","updated":"2018-06-01 08:33:18.000000000","message":"Send healthcheck \u003d\u003d report. IMHO it\u0027s more succinct-","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        raise NotImplementedError"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @abc.abstractmethod"},{"line_number":135,"context_line":"    def report_running_actions(self, action_ex_ids):"},{"line_number":136,"context_line":"        \"\"\"Receives the heartbeat about the running actions."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        :param action_ex_ids: The action execution ids."}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_f06e3d2a","line":135,"range":{"start_line":135,"start_character":8,"end_line":135,"end_character":30},"in_reply_to":"5f7c97a3_669fd84f","updated":"2018-06-01 15:17:40.000000000","message":"The concept is that, the executor `reports` the actions being currently executed. Have a better recommendation?","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"mistral/engine/default_engine.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"},{"line_number":217,"context_line":"                    # remaining ids."},{"line_number":218,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_268d317b","line":215,"updated":"2018-04-27 12:10:52.000000000","message":"Will be transaction rollback after this exception?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"},{"line_number":217,"context_line":"                    # remaining ids."},{"line_number":218,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_339551e5","line":215,"in_reply_to":"9f6a8fd7_268d317b","updated":"2018-05-08 14:06:31.000000000","message":"It should not rollback, the exception is handled locally.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":210,"context_line":"                try:"},{"line_number":211,"context_line":"                    db_api.update_action_execution("},{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_4a325ea9","line":213,"updated":"2018-05-09 09:53:07.000000000","message":"If you want you can move `u.utc_now_sec()` expression to some variable and pass the variable in every action update. Small optimization not to generate datetime every call.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":210,"context_line":"                try:"},{"line_number":211,"context_line":"                    db_api.update_action_execution("},{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_7ef4bc86","line":213,"in_reply_to":"5f7c97a3_4a325ea9","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"d2982daa9b478227d3a746a429d9d6fd57f9406a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"},{"line_number":217,"context_line":"                    # remaining ids."},{"line_number":218,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_6df41487","line":215,"updated":"2018-05-09 10:46:16.000000000","message":"When would this happen?","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"},{"line_number":217,"context_line":"                    # remaining ids."},{"line_number":218,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_be601403","line":215,"in_reply_to":"5f7c97a3_6df41487","updated":"2018-05-09 13:46:21.000000000","message":"Not sure about it, this change was introduced by my colleague Andras Kovi.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"ea252fef612367e967995855fcb537e3260afc02","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                        exec_id,"},{"line_number":213,"context_line":"                        {\"last_heartbeat\": u.utc_now_sec()}"},{"line_number":214,"context_line":"                    )"},{"line_number":215,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":216,"context_line":"                    # Ignore this error and continue with the"},{"line_number":217,"context_line":"                    # remaining ids."},{"line_number":218,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_4ff107cd","line":215,"in_reply_to":"5f7c97a3_be601403","updated":"2018-05-09 15:03:09.000000000","message":"This can happen practically any time if the execution was deleted from the DB for some reason. The messages from the executor can be kept in the message queue on errors so it is not impossible that the entity is gone from the DB by the tim this update would happen. This is not a fatal error and ignoring it just makes the service more fault tolerant.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            action_ex_id \u003d u.generate_unicode_uuid()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            values \u003d {"},{"line_number":122,"context_line":"                \u0027id\u0027: action_ex_id,"},{"line_number":123,"context_line":"                \u0027name\u0027: action_name,"},{"line_number":124,"context_line":"                \u0027description\u0027: description,"},{"line_number":125,"context_line":"                \u0027input\u0027: action_input,"},{"line_number":126,"context_line":"                \u0027output\u0027: output.to_dict(),"},{"line_number":127,"context_line":"                \u0027state\u0027: state,"},{"line_number":128,"context_line":"                \u0027is_sync\u0027: is_action_sync"},{"line_number":129,"context_line":"            }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"            return db_api.create_action_execution(values)"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_66f6f891","line":129,"range":{"start_line":121,"start_character":12,"end_line":129,"end_character":13},"updated":"2018-06-01 07:57:45.000000000","message":"Not a problem of this patch but in general I don\u0027t like this code because ideally it needs to be encapsulated within Action class, no other entities should know how to create it in DB and with what properties.\n\nAnyway, just an idea for further refactoring..","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"d47d15e13a2d9458d528ed58fadfa93212ed1488","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            action_ex_id \u003d u.generate_unicode_uuid()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            values \u003d {"},{"line_number":122,"context_line":"                \u0027id\u0027: action_ex_id,"},{"line_number":123,"context_line":"                \u0027name\u0027: action_name,"},{"line_number":124,"context_line":"                \u0027description\u0027: description,"},{"line_number":125,"context_line":"                \u0027input\u0027: action_input,"},{"line_number":126,"context_line":"                \u0027output\u0027: output.to_dict(),"},{"line_number":127,"context_line":"                \u0027state\u0027: state,"},{"line_number":128,"context_line":"                \u0027is_sync\u0027: is_action_sync"},{"line_number":129,"context_line":"            }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"            return db_api.create_action_execution(values)"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_ba03c40c","line":129,"range":{"start_line":121,"start_character":12,"end_line":129,"end_character":13},"in_reply_to":"5f7c97a3_66f6f891","updated":"2018-06-01 08:33:18.000000000","message":"I know, we should open a bug for this.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        insecure\u003dTrue"},{"line_number":220,"context_line":"                    )"},{"line_number":221,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":222,"context_line":"                    LOG.debug(\"Action execution heartbeat update failed. {}\""},{"line_number":223,"context_line":"                              .format(exec_id), exc_info\u003dTrue)"},{"line_number":224,"context_line":"                    # Ignore this error and continue with the"},{"line_number":225,"context_line":"                    # remaining ids."}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_663b5837","line":222,"range":{"start_line":222,"start_character":24,"end_line":222,"end_character":29},"updated":"2018-06-01 07:57:45.000000000","message":"Maybe we need to use LOG.exception() method as it also logs the info about exception itself. But that\u0027s not a critical thing.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"d47d15e13a2d9458d528ed58fadfa93212ed1488","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        insecure\u003dTrue"},{"line_number":220,"context_line":"                    )"},{"line_number":221,"context_line":"                except exceptions.DBEntityNotFoundError:"},{"line_number":222,"context_line":"                    LOG.debug(\"Action execution heartbeat update failed. {}\""},{"line_number":223,"context_line":"                              .format(exec_id), exc_info\u003dTrue)"},{"line_number":224,"context_line":"                    # Ignore this error and continue with the"},{"line_number":225,"context_line":"                    # remaining ids."}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_da19e079","line":222,"range":{"start_line":222,"start_character":24,"end_line":222,"end_character":29},"in_reply_to":"5f7c97a3_663b5837","updated":"2018-06-01 08:33:18.000000000","message":"I think exception() should be used in error cases. In this case, the exception is not an error (due to the distributed nature of Mistral), but still useful to log in the DB. Logging the exception may not be necessary after changing the log message.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"mistral/engine/engine_server.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":54,"context_line":"        self._expiration_policy_tg \u003d expiration_policy.setup()"},{"line_number":55,"context_line":"        self._report_handler \u003d action_execution_evaluator.setup()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self._setup_profiler:"},{"line_number":58,"context_line":"            profiler_utils.setup(\u0027mistral-engine\u0027, cfg.CONF.engine.host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_466e5c2f","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":28},"updated":"2018-06-01 07:57:45.000000000","message":"I have a design concern here.\n\nThe name \"report_handler\" is not associated with actions in any way to me. And the line itself looks a little weird: we setup the action execution evaluator and get a report handler as a result for some reason :) Please make it more obvious somehow. I\u0027d suggest we rename \"_report_handler\" to at least \"_action_report_handler\" and may be make a special method to initialize it.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":54,"context_line":"        self._expiration_policy_tg \u003d expiration_policy.setup()"},{"line_number":55,"context_line":"        self._report_handler \u003d action_execution_evaluator.setup()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self._setup_profiler:"},{"line_number":58,"context_line":"            profiler_utils.setup(\u0027mistral-engine\u0027, cfg.CONF.engine.host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_bf516e10","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":28},"in_reply_to":"5f7c97a3_466e5c2f","updated":"2018-06-01 15:17:40.000000000","message":"Done","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"d47d15e13a2d9458d528ed58fadfa93212ed1488","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":54,"context_line":"        self._expiration_policy_tg \u003d expiration_policy.setup()"},{"line_number":55,"context_line":"        self._report_handler \u003d action_execution_evaluator.setup()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self._setup_profiler:"},{"line_number":58,"context_line":"            profiler_utils.setup(\u0027mistral-engine\u0027, cfg.CONF.engine.host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_bad6644e","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":28},"in_reply_to":"5f7c97a3_466e5c2f","updated":"2018-06-01 08:33:18.000000000","message":"We\u0027ll think about better naming. This setup may need to be changed anyway based on the concurrent engines stepping on each others\u0027 foot issue I\u0027ve just found.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"mistral/executors/executor_server.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"4c55c5b70202c8fcfbd8aae99659c9e3259f7918","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def start(self):"},{"line_number":48,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":51,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":52,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_873bc936","line":50,"updated":"2018-05-06 13:29:55.000000000","message":"I don\u0027t understand why you decide to start scheduler in mistral executor. Executor service will handle all delayed calls now.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def start(self):"},{"line_number":48,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":51,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":52,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_794b7658","line":50,"in_reply_to":"5f7c97a3_16e816b2","updated":"2018-05-09 13:46:21.000000000","message":"Indeed, it is not necessary at all. Nice catch.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def start(self):"},{"line_number":48,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":51,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":52,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_16e816b2","line":50,"in_reply_to":"5f7c97a3_462da993","updated":"2018-05-09 09:53:07.000000000","message":"PeriodicTask doesn\u0027t requires the scheduler.\nIf I understand right you can just remove a scheduler here.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def start(self):"},{"line_number":48,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self._scheduler \u003d scheduler.start()"},{"line_number":51,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":52,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_462da993","line":50,"in_reply_to":"5f7c97a3_873bc936","updated":"2018-05-08 14:06:31.000000000","message":"This part is based on engine_server.py. \n\nThe scheduler is there only for the ActionExectionReporter which is a PeriodicTask that requires the scheduler.\n\nWhat would be the recommended way of doing this?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            timeout\u003dtimeout"},{"line_number":118,"context_line":"        )"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        try:"},{"line_number":121,"context_line":"            self._aer.add_action_ex_id(action_ex_id)"},{"line_number":122,"context_line":"            return self.executor.run_action("},{"line_number":123,"context_line":"                action_ex_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_2b5f3a0f","line":120,"updated":"2018-04-27 12:10:52.000000000","message":"Hmm, this code is unreachable :D","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            timeout\u003dtimeout"},{"line_number":118,"context_line":"        )"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        try:"},{"line_number":121,"context_line":"            self._aer.add_action_ex_id(action_ex_id)"},{"line_number":122,"context_line":"            return self.executor.run_action("},{"line_number":123,"context_line":"                action_ex_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_663545da","line":120,"in_reply_to":"9f6a8fd7_2b5f3a0f","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.executor \u003d executor"},{"line_number":41,"context_line":"        self._rpc_server \u003d None"},{"line_number":42,"context_line":"        self._reporter \u003d None"},{"line_number":43,"context_line":"        self._aer \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_266fa028","line":42,"range":{"start_line":42,"start_character":13,"end_line":42,"end_character":22},"updated":"2018-06-01 07:57:45.000000000","message":"I\u0027d be more explicit about naming and mention \"action\" somehow.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.executor \u003d executor"},{"line_number":41,"context_line":"        self._rpc_server \u003d None"},{"line_number":42,"context_line":"        self._reporter \u003d None"},{"line_number":43,"context_line":"        self._aer \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_3f3d5eba","line":42,"range":{"start_line":42,"start_character":13,"end_line":42,"end_character":22},"in_reply_to":"5f7c97a3_266fa028","updated":"2018-06-01 15:17:40.000000000","message":"Removed altogether.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def start(self):"},{"line_number":46,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":49,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        if self._setup_profiler:"},{"line_number":52,"context_line":"            profiler_utils.setup(\u0027mistral-executor\u0027, cfg.CONF.executor.host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_a65c107d","line":49,"range":{"start_line":48,"start_character":8,"end_line":49,"end_character":67},"updated":"2018-06-01 07:57:45.000000000","message":"This is really confusing. At first glance, these two lines are about a similar thing :) The first one is a reporter and another one is called \"_reporter\" too.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def start(self):"},{"line_number":46,"context_line":"        super(ExecutorServer, self).start()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self._aer \u003d action_execution_reporter.ActionExecutionReporter(CONF)"},{"line_number":49,"context_line":"        self._reporter \u003d action_execution_reporter.setup(self._aer)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        if self._setup_profiler:"},{"line_number":52,"context_line":"            profiler_utils.setup(\u0027mistral-executor\u0027, cfg.CONF.executor.host)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_9f77d2a0","line":49,"range":{"start_line":48,"start_character":8,"end_line":49,"end_character":67},"in_reply_to":"5f7c97a3_a65c107d","updated":"2018-06-01 15:17:40.000000000","message":"Removed the variables, only the setup call remained.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"mistral/services/action_execution_checker.py":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"9b5ad96de1469acdd085ee9a4a336ae96b34cc2f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                )"},{"line_number":55,"context_line":"                action_handler.on_action_complete(action_ex, result)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    schedule(interval)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def setup():"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_ca49efb7","line":57,"range":{"start_line":57,"start_character":3,"end_line":57,"end_character":22},"updated":"2018-06-04 07:42:11.000000000","message":"this should be in a finally block to ensure the rescheduling happens in any case","commit_id":"5aa7ed64bc614418edd294c26a4f81cbf01cd8d0"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"64f1cbb62e5e054a3f4c27ded17e7dc14609dbc0","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                )"},{"line_number":55,"context_line":"                action_handler.on_action_complete(action_ex, result)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    schedule(interval)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def setup():"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_8a653720","line":57,"range":{"start_line":57,"start_character":3,"end_line":57,"end_character":22},"in_reply_to":"5f7c97a3_ca49efb7","updated":"2018-06-04 07:47:15.000000000","message":"Done","commit_id":"5aa7ed64bc614418edd294c26a4f81cbf01cd8d0"}],"mistral/services/action_execution_evaluator.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"@db_utils.retry_on_db_error"},{"line_number":59,"context_line":"@action_queue.process"},{"line_number":60,"context_line":"def handle_expired_actions(self, ctx):"},{"line_number":61,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_cbd0fe56","line":59,"updated":"2018-04-27 12:10:52.000000000","message":"Please, rename the self parameter","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"@db_utils.retry_on_db_error"},{"line_number":59,"context_line":"@action_queue.process"},{"line_number":60,"context_line":"def handle_expired_actions(self, ctx):"},{"line_number":61,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a6aefde4","line":59,"in_reply_to":"9f6a8fd7_cbd0fe56","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"4c55c5b70202c8fcfbd8aae99659c9e3259f7918","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003dself.max_missed * self.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_2748b5ca","line":69,"updated":"2018-05-06 13:29:55.000000000","message":"Maybe we will open a transaction on every `on_action_complete` call?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003dself.max_missed * self.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e634f54c","line":69,"in_reply_to":"5f7c97a3_2748b5ca","updated":"2018-05-08 14:06:31.000000000","message":"`on_action_complete` doesn\u0027t open transaction for itself. So we have to open it before calling it.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003dself.max_missed * self.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_59a55ab4","line":69,"in_reply_to":"5f7c97a3_b68e02ce","updated":"2018-05-09 13:46:21.000000000","message":"I think deadlock is not possible in that situation but I might be wrong about it. Simply just one of the transactions will be rolled back, and the other one will succeed.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003dself.max_missed * self.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_b68e02ce","line":69,"in_reply_to":"5f7c97a3_e634f54c","updated":"2018-05-09 09:53:07.000000000","message":"Yep. But any of errors or database conflicts in one `on_action_complete` call can be became a reason to rollback others.\nAnd I fear a database deadlocks in this case. For example, we can extract 10 actions in two mistral engine in different orders.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""},{"line_number":73,"context_line":"                     \"heartbeat wasn\u0027t received: {}\".format(action_exs))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_cbfd5e09","line":70,"updated":"2018-04-27 12:10:52.000000000","message":"What do you think about debug level logging number of find actions?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        if len(action_exs):"},{"line_number":72,"context_line":"            LOG.info(\"Actions executions to transit to error, because\""},{"line_number":73,"context_line":"                     \"heartbeat wasn\u0027t received: {}\".format(action_exs))"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a64a7d24","line":70,"in_reply_to":"9f6a8fd7_cbfd5e09","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                result \u003d mistral_lib.Result("},{"line_number":76,"context_line":"                    error\u003d\"Heartbeat wasn\u0027t received.\""},{"line_number":77,"context_line":"                )"},{"line_number":78,"context_line":"                action_handler.on_action_complete(action_ex, result)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def schedule_setup():"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_88444c76","line":78,"updated":"2018-04-27 12:10:52.000000000","message":"We can complete two actions in parallel transaction here.\nI propose to make a changing state like for task.\nI mean we should use update_on_match https://github.com/openstack/mistral/blob/94e20726b22c697a534a79e1c22d8a61b3eb142d/mistral/db/v2/sqlalchemy/api.py#L147 And if state was not changed then skip complete a action and task here https://github.com/openstack/mistral/blob/94e20726b22c697a534a79e1c22d8a61b3eb142d/mistral/engine/actions.py#L223","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"0ee3f87fe2b43ac805bccb52e70980e751a9caad","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                result \u003d mistral_lib.Result("},{"line_number":76,"context_line":"                    error\u003d\"Heartbeat wasn\u0027t received.\""},{"line_number":77,"context_line":"                )"},{"line_number":78,"context_line":"                action_handler.on_action_complete(action_ex, result)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def schedule_setup():"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_0f8790d9","line":78,"in_reply_to":"9f6a8fd7_88444c76","updated":"2018-05-09 15:38:22.000000000","message":"It is not clear for me what you want to accomplish here. Would this be an optimization?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"def schedule_setup():"},{"line_number":82,"context_line":"    delay \u003d CONF.action_heartbeat.evaluation_interval * 5"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    method_name \u003d \"mistral.services.action_execution_evaluator.setup\""},{"line_number":85,"context_line":"    scheduler.schedule_call("},{"line_number":86,"context_line":"        None,"},{"line_number":87,"context_line":"        method_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_eb50620d","line":84,"updated":"2018-04-27 12:10:52.000000000","message":"Why do you setup evaluator through scheduler?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":81,"context_line":"def schedule_setup():"},{"line_number":82,"context_line":"    delay \u003d CONF.action_heartbeat.evaluation_interval * 5"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    method_name \u003d \"mistral.services.action_execution_evaluator.setup\""},{"line_number":85,"context_line":"    scheduler.schedule_call("},{"line_number":86,"context_line":"        None,"},{"line_number":87,"context_line":"        method_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_9973f24d","line":84,"in_reply_to":"5f7c97a3_1647b67a","updated":"2018-05-09 13:46:21.000000000","message":"Yeah I see your point, but there is an initial delay to make sure when the engine starts, it waits for the executors to send the heartbeats. Otherwise there is a chance that it would close actually running executions by mistake.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":81,"context_line":"def schedule_setup():"},{"line_number":82,"context_line":"    delay \u003d CONF.action_heartbeat.evaluation_interval * 5"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    method_name \u003d \"mistral.services.action_execution_evaluator.setup\""},{"line_number":85,"context_line":"    scheduler.schedule_call("},{"line_number":86,"context_line":"        None,"},{"line_number":87,"context_line":"        method_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_1647b67a","line":84,"in_reply_to":"5f7c97a3_e640750a","updated":"2018-05-09 09:53:07.000000000","message":"As I understand you should just create a threadgroup and return it.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":81,"context_line":"def schedule_setup():"},{"line_number":82,"context_line":"    delay \u003d CONF.action_heartbeat.evaluation_interval * 5"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    method_name \u003d \"mistral.services.action_execution_evaluator.setup\""},{"line_number":85,"context_line":"    scheduler.schedule_call("},{"line_number":86,"context_line":"        None,"},{"line_number":87,"context_line":"        method_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e640750a","line":84,"in_reply_to":"9f6a8fd7_eb50620d","updated":"2018-05-08 14:06:31.000000000","message":"I assumed for periodic tasks scheduler is the way to go.\n\nHow should it be?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.interval \u003d CONF.action_heartbeat.evaluation_interval"},{"line_number":43,"context_line":"        self.max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":44,"context_line":"        self._enabled \u003d self.interval and self.max_missed"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self._enabled:"},{"line_number":47,"context_line":"            _periodic_task \u003d periodic_task.periodic_task("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_4a8ede2e","line":44,"updated":"2018-05-09 09:53:07.000000000","message":"This field doesn\u0027t make sense. It would be a local variable.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.interval \u003d CONF.action_heartbeat.evaluation_interval"},{"line_number":43,"context_line":"        self.max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":44,"context_line":"        self._enabled \u003d self.interval and self.max_missed"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if self._enabled:"},{"line_number":47,"context_line":"            _periodic_task \u003d periodic_task.periodic_task("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_597d5ae5","line":44,"in_reply_to":"5f7c97a3_4a8ede2e","updated":"2018-05-09 13:46:21.000000000","message":"Done","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def handle_expired_actions(evaluator, ctx):"},{"line_number":61,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    LOG.debug(\"Running heartbeat evaluator...\")"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    exp_date \u003d utils.utc_now_sec() - datetime.timedelta("},{"line_number":66,"context_line":"        seconds\u003devaluator.max_missed * evaluator.interval"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_6a787a29","line":63,"updated":"2018-05-09 09:53:07.000000000","message":"Maybe we combine two logs:\nLOG.debug(\"Running heartbeat evaluator...\")\nLOG.debug(\"Found {} running and expired actions.\".format(\n            len(action_exs))\n        )\ninto one?","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def handle_expired_actions(evaluator, ctx):"},{"line_number":61,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    LOG.debug(\"Running heartbeat evaluator...\")"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    exp_date \u003d utils.utc_now_sec() - datetime.timedelta("},{"line_number":66,"context_line":"        seconds\u003devaluator.max_missed * evaluator.interval"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_994bf2ae","line":63,"in_reply_to":"5f7c97a3_6a787a29","updated":"2018-05-09 13:46:21.000000000","message":"The first log message is there to signal the beginning of the scheduled run. So no matter what error happens afterwards, you can count on that log message to be there no matter what:)","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"d54063f27f98f0e3ed4b3766293d41eae8c09fb2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003devaluator.max_missed * evaluator.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        LOG.debug(\"Found {} running and expired actions.\".format("},{"line_number":72,"context_line":"            len(action_exs))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_ae80c6c0","line":69,"updated":"2018-05-10 12:36:30.000000000","message":"I don\u0027t like this transaction in case of multiple mistral engine anyway :)\nThis exception can rollback transaction https://github.com/openstack/mistral/blob/master/mistral/engine/actions.py#L218\nThere is explicit locking if we modify many entities (actions and tasks).\nThe complete one action takes long time (completing action, completing task, scheduling new task). Why we should have a long transaction with completing many actions?  \nBut if other Mistral developers accept this transaction, okay","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        seconds\u003devaluator.max_missed * evaluator.interval"},{"line_number":67,"context_line":"    )"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    with db_api.transaction():"},{"line_number":70,"context_line":"        action_exs \u003d db_api.get_running_expired_actions(exp_date)"},{"line_number":71,"context_line":"        LOG.debug(\"Found {} running and expired actions.\".format("},{"line_number":72,"context_line":"            len(action_exs))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_f190e345","line":69,"in_reply_to":"5f7c97a3_ae80c6c0","updated":"2018-05-11 11:10:57.000000000","message":"I actually tried to open the transactions inside the for cycle, but it failed with \"DetachedInstanceError: Parent instance \u003cActionExecution at 0x7fa8d9d88990\u003e is not bound to a Session; lazy load operation of attribute \u0027task_execution\u0027 cannot proceed\". I guess it would work if I queried the action executions inside each iteration (within the transactions), but it would look weird for me. Feel free to refactor it tho, if you know a good solution.","commit_id":"9c0ee6ad09b5d0a318a9056695fa922df52b1ad7"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"ff174c21b6896b8cda0b777fae0f7baab9677fe4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 - Alcatel-lucent, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"#    you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_e7ba586c","line":1,"updated":"2018-05-11 09:31:16.000000000","message":"2018 - Nokia ? :)","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 - Alcatel-lucent, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"#    you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_e6e491e2","line":1,"in_reply_to":"5f7c97a3_e7ba586c","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"ff174c21b6896b8cda0b777fae0f7baab9677fe4","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":92,"context_line":"    enabled \u003d interval and max_missed"},{"line_number":93,"context_line":"    if not enabled:"},{"line_number":94,"context_line":"        LOG.debug(\"Action heartbeat reporting disabled.\")"},{"line_number":95,"context_line":"        return None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    tg \u003d threadgroup.ThreadGroup()"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_07c0b4e0","line":94,"updated":"2018-05-11 09:31:16.000000000","message":"This code is executed only once maybe change to info?","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":92,"context_line":"    enabled \u003d interval and max_missed"},{"line_number":93,"context_line":"    if not enabled:"},{"line_number":94,"context_line":"        LOG.debug(\"Action heartbeat reporting disabled.\")"},{"line_number":95,"context_line":"        return None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    tg \u003d threadgroup.ThreadGroup()"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_864a7da9","line":94,"in_reply_to":"5f7c97a3_07c0b4e0","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"a10b97a36bd0f3a8a6125c7b66b8f9eacbfd0a5a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ActionExecutionEvaluator(periodic_task.PeriodicTasks):"},{"line_number":37,"context_line":"    \"\"\"The report handler that handles running action executions.\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_a6d170ce","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":30},"updated":"2018-06-01 07:57:45.000000000","message":"Maybe I\u0027m too picky about naming but again, can you explain why it\u0027s called \"Evaluator\"? What does it evaluate? May be call it \"ActionExecutionWatchDog\" or something like this? Or \"ActionExecutionWatcher\" or \"ActionExecutionChecker\".","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"d47d15e13a2d9458d528ed58fadfa93212ed1488","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ActionExecutionEvaluator(periodic_task.PeriodicTasks):"},{"line_number":37,"context_line":"    \"\"\"The report handler that handles running action executions.\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_3ac25486","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":30},"in_reply_to":"5f7c97a3_a6d170ce","updated":"2018-06-01 08:33:18.000000000","message":"Ok.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"c4f4e1104b9556e419d63e4945c4aef1520bef29","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ActionExecutionEvaluator(periodic_task.PeriodicTasks):"},{"line_number":37,"context_line":"    \"\"\"The report handler that handles running action executions.\"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_7f70b6a4","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":30},"in_reply_to":"5f7c97a3_a6d170ce","updated":"2018-06-01 15:17:40.000000000","message":"Removed the whole class, and renamed the file to action_execution_checker.py.","commit_id":"12d831d7a260f25f2c57514a096b31ca1f6c7270"}],"mistral/services/action_execution_reporter.py":[{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"44a0fd9fae04fe2b6e4c4f1c5a6fba5a881592ba","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ActionExecutionReporter(periodic_task.PeriodicTasks):"},{"line_number":29,"context_line":"    \"\"\"The reporter that reports the running action executions.\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, conf):"},{"line_number":32,"context_line":"        super(ActionExecutionReporter, self).__init__(conf)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_44b8d7e3","line":29,"updated":"2018-01-31 12:01:28.000000000","message":"I\u0027d suggest expanding this comment, it doesn\u0027t tell me anything more than the class name. For example, this would tell much much more:\n\n\"This reporter looks for action executions that have stalled. This is likely because the engine that started it has crashed.\"","commit_id":"a7b0c39be93c44c85530036731a102b4466df977"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"44a0fd9fae04fe2b6e4c4f1c5a6fba5a881592ba","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                _periodic_task(report)"},{"line_number":47,"context_line":"            )"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            LOG.debug(\"Action heartbeat reporting disabled.\")"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_action_ex_id(self, action_ex_id):"},{"line_number":52,"context_line":"        # With run-action there is no actions_ex_id assigned"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_648b931e","line":49,"updated":"2018-01-31 12:01:28.000000000","message":"This will only run once on startup, right? I would consider increasing it to INFO.","commit_id":"a7b0c39be93c44c85530036731a102b4466df977"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, conf):"},{"line_number":32,"context_line":"        super(ActionExecutionReporter, self).__init__(conf)"},{"line_number":33,"context_line":"        self._engine_client \u003d rpc.get_engine_client()"},{"line_number":34,"context_line":"        self._running_actions \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        interval \u003d CONF.action_heartbeat.evaluation_interval"},{"line_number":37,"context_line":"        max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_ab490a8c","line":34,"updated":"2018-04-27 12:10:52.000000000","message":"I think we should use a set in this case. removing element is o(n) vs log(n)","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def __init__(self, conf):"},{"line_number":32,"context_line":"        super(ActionExecutionReporter, self).__init__(conf)"},{"line_number":33,"context_line":"        self._engine_client \u003d rpc.get_engine_client()"},{"line_number":34,"context_line":"        self._running_actions \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        interval \u003d CONF.action_heartbeat.evaluation_interval"},{"line_number":37,"context_line":"        max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_06a49156","line":34,"in_reply_to":"9f6a8fd7_ab490a8c","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e749d68a3d83721e623f5d63f61f8f338c9767d9","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_action_ex_id(self, action_ex_id):"},{"line_number":52,"context_line":"        # With run-action there is no actions_ex_id assigned"},{"line_number":53,"context_line":"        if not action_ex_id:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self._running_actions.append(action_ex_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_6a1723a5","line":53,"updated":"2018-05-02 09:09:02.000000000","message":"Maybe the first step will be report about the running action?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"920164e49fc7e62b68d9c2c40f07765e70814f18","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_action_ex_id(self, action_ex_id):"},{"line_number":52,"context_line":"        # With run-action there is no actions_ex_id assigned"},{"line_number":53,"context_line":"        if not action_ex_id:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self._running_actions.append(action_ex_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_4a2fbef5","line":53,"in_reply_to":"5f7c97a3_298f1e24","updated":"2018-05-09 09:53:07.000000000","message":"Noop, I mean only to report about the action_ex_id when it recieved. If we report all actions on every a received action then we can ddos our  mistral engine :)","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2f8dc11b1d4e380605595fae6bab13a3d1463691","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_action_ex_id(self, action_ex_id):"},{"line_number":52,"context_line":"        # With run-action there is no actions_ex_id assigned"},{"line_number":53,"context_line":"        if not action_ex_id:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self._running_actions.append(action_ex_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_79acd633","line":53,"in_reply_to":"5f7c97a3_4a2fbef5","updated":"2018-05-09 13:46:21.000000000","message":"Yes, it was a typo.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_action_ex_id(self, action_ex_id):"},{"line_number":52,"context_line":"        # With run-action there is no actions_ex_id assigned"},{"line_number":53,"context_line":"        if not action_ex_id:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self._running_actions.append(action_ex_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_298f1e24","line":53,"in_reply_to":"9f6a8fd7_6a1723a5","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self._running_actions.remove(action_ex_id)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def report(self, ctx):"},{"line_number":66,"context_line":"    if not self._running_actions:"},{"line_number":67,"context_line":"        return"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_8bca069f","line":65,"updated":"2018-04-27 12:10:52.000000000","message":"Please, rename the self parameter","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self._running_actions.remove(action_ex_id)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def report(self, ctx):"},{"line_number":66,"context_line":"    if not self._running_actions:"},{"line_number":67,"context_line":"        return"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_861e61b8","line":65,"in_reply_to":"9f6a8fd7_8bca069f","updated":"2018-05-08 14:06:31.000000000","message":"Done","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"e38cfabecc715468126c87b7f8aec29970bc266f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if not self._running_actions:"},{"line_number":67,"context_line":"        return"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    LOG.debug(\"Running heartbeat reporter...\")"},{"line_number":70,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":71,"context_line":"    self._engine_client.report_running_actions(self._running_actions)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9f6a8fd7_4b494e30","line":69,"updated":"2018-04-27 12:10:52.000000000","message":"Maybe we will log a action execution id?","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"5f37f7868550d60da83e9b1da95dffa7b02a7175","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if not self._running_actions:"},{"line_number":67,"context_line":"        return"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    LOG.debug(\"Running heartbeat reporter...\")"},{"line_number":70,"context_line":"    auth_ctx.set_ctx(ctx)"},{"line_number":71,"context_line":"    self._engine_client.report_running_actions(self._running_actions)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e90da690","line":69,"in_reply_to":"9f6a8fd7_4b494e30","updated":"2018-05-08 14:06:31.000000000","message":"The info log contains the parameters of all rpc calls.","commit_id":"20554ad05fd285bd5e6e459574cb6f7650446d7d"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"ff174c21b6896b8cda0b777fae0f7baab9677fe4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 - Alcatel-lucent, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"#    you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_0733d415","line":1,"updated":"2018-05-11 09:31:16.000000000","message":"the same","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 - Alcatel-lucent, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"#    you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_a6d219ff","line":1,"in_reply_to":"5f7c97a3_0733d415","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"ff174c21b6896b8cda0b777fae0f7baab9677fe4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":72,"context_line":"    enabled \u003d interval and max_missed"},{"line_number":73,"context_line":"    if not enabled:"},{"line_number":74,"context_line":"        LOG.debug(\"Action heartbeat reporting disabled.\")"},{"line_number":75,"context_line":"        return None"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    tg \u003d threadgroup.ThreadGroup()"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_0278a28d","line":74,"updated":"2018-05-11 09:31:16.000000000","message":"the same","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    max_missed \u003d CONF.action_heartbeat.max_missed_heartbeats"},{"line_number":72,"context_line":"    enabled \u003d interval and max_missed"},{"line_number":73,"context_line":"    if not enabled:"},{"line_number":74,"context_line":"        LOG.debug(\"Action heartbeat reporting disabled.\")"},{"line_number":75,"context_line":"        return None"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    tg \u003d threadgroup.ThreadGroup()"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_66d8811d","line":74,"in_reply_to":"5f7c97a3_0278a28d","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"62b34e91ab28ddb60fc909347f05f544a6d6e516"}],"mistral/tests/unit/engine/test_with_items.py":[{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"d54063f27f98f0e3ed4b3766293d41eae8c09fb2","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from mistral.actions import std_actions"},{"line_number":20,"context_line":"from mistral.config import ACTION_HEARTBEAT_GROUP"},{"line_number":21,"context_line":"from mistral.config import PECAN_GROUP"},{"line_number":22,"context_line":"from mistral.db.v2 import api as db_api"},{"line_number":23,"context_line":"from mistral import exceptions as exc"},{"line_number":24,"context_line":"from mistral.services import workbooks as wb_service"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_8e3aaac9","line":21,"updated":"2018-05-10 12:36:30.000000000","message":"from mistral.config import ACTION_HEARTBEAT_GROUP\nfrom mistral.config import PECAN_GROUP\n-\u003e\nfrom mistral import config\nfrom mistral import config\n\nAnd then use config.ACTION_HEARTBEAT_GROUP and config.PECAN_GROUP\nhttps://docs.openstack.org/hacking/latest/user/hacking.html#imports","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"fccfa3a44140410d195d6b6e24cb9d5ad2be83a6","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from mistral.actions import std_actions"},{"line_number":20,"context_line":"from mistral.config import ACTION_HEARTBEAT_GROUP"},{"line_number":21,"context_line":"from mistral.config import PECAN_GROUP"},{"line_number":22,"context_line":"from mistral.db.v2 import api as db_api"},{"line_number":23,"context_line":"from mistral import exceptions as exc"},{"line_number":24,"context_line":"from mistral.services import workbooks as wb_service"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_7114d344","line":21,"in_reply_to":"5f7c97a3_8e3aaac9","updated":"2018-05-11 11:10:57.000000000","message":"Done","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"},{"author":{"_account_id":23211,"name":"Kupai József","email":"jozsef.kupai@nokia.com","username":"kupsef"},"change_message_id":"2b0905a60930c4820d01858cc4934183c6f8995b","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        # Wait till the delayed on_action_complete is processed."},{"line_number":651,"context_line":"        # 1 is always there to periodically check WF completion."},{"line_number":652,"context_line":"        self._await(lambda: len(db_api.get_delayed_calls()) \u003d\u003d 1)"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        with db_api.transaction():"},{"line_number":655,"context_line":"            task_ex \u003d db_api.get_task_execution(task_ex.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_34996e78","line":652,"updated":"2018-05-10 10:51:37.000000000","message":"These await-s are quite flaky. Not sure how to improve it, but it is definitely not a good idea to depend on the count of the delayed calls. I removed the delayed scheduler call, so it works again.","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"},{"author":{"_account_id":27008,"name":"Vitalii Solodilov","email":"Mcdkr@yandex.ru","username":"mcdoker18"},"change_message_id":"d54063f27f98f0e3ed4b3766293d41eae8c09fb2","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        # Wait till the delayed on_action_complete is processed."},{"line_number":651,"context_line":"        # 1 is always there to periodically check WF completion."},{"line_number":652,"context_line":"        self._await(lambda: len(db_api.get_delayed_calls()) \u003d\u003d 1)"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        with db_api.transaction():"},{"line_number":655,"context_line":"            task_ex \u003d db_api.get_task_execution(task_ex.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_0ef0dafd","line":652,"in_reply_to":"5f7c97a3_34996e78","updated":"2018-05-10 12:36:30.000000000","message":"Agree with you.","commit_id":"36e16394dde19a4239ce046012e1ded8289d3ab4"}]}
