)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":12,"context_line":"(futures, executors) when dealing with asynchronous execution."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"A green thread executor is used instead of using an eventlet green pool"},{"line_number":15,"context_line":"directly. Maximum number of workers is taked from existing workers_pool_size"},{"line_number":16,"context_line":"configuration option, and no tasks are allowed to be enqueued to mimic the"},{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_47cacea2","line":15,"updated":"2016-02-19 16:01:00.000000000","message":"Nitpicks:\n\"Maximum\" -\u003e \"The maximum\"\n\"taked\" -\u003e \"taken\"\n\"from existing\" -\u003e \"from the existing\"","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":12,"context_line":"(futures, executors) when dealing with asynchronous execution."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"A green thread executor is used instead of using an eventlet green pool"},{"line_number":15,"context_line":"directly. Maximum number of workers is taked from existing workers_pool_size"},{"line_number":16,"context_line":"configuration option, and no tasks are allowed to be enqueued to mimic the"},{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_7ae11dd0","line":15,"in_reply_to":"bae84128_47cacea2","updated":"2016-02-22 09:04:32.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":16,"context_line":"configuration option, and no tasks are allowed to be enqueued to mimic the"},{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_87f976cb","line":19,"updated":"2016-02-19 16:01:00.000000000","message":"\"Periodic\" -\u003e \"The periodic\"","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":16,"context_line":"configuration option, and no tasks are allowed to be enqueued to mimic the"},{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_dae829b7","line":19,"in_reply_to":"bae84128_87f976cb","updated":"2016-02-22 09:04:32.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"},{"line_number":23,"context_line":"as the generic decorator can be used there as well."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_676f1293","line":20,"updated":"2016-02-19 16:01:00.000000000","message":"\"the it\" -\u003e \"that executor\"","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":17,"context_line":"previous behaviour (might be lifted later)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"},{"line_number":23,"context_line":"as the generic decorator can be used there as well."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_baeba5af","line":20,"in_reply_to":"bae84128_676f1293","updated":"2016-02-22 09:04:32.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"},{"line_number":23,"context_line":"as the generic decorator can be used there as well."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_87e7b611","line":21,"updated":"2016-02-19 16:01:00.000000000","message":"Typo: \"on\" -\u003e \"one\"","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Periodic tasks worker is using the same executor, and its main loop thread is"},{"line_number":20,"context_line":"also running on the it. For this reason minimum value for workers_pool_size is"},{"line_number":21,"context_line":"now 3: periodic task main loop, keep alive thread and at least on thread for"},{"line_number":22,"context_line":"other tasks. A special decorator for driver-periodic tasks is now deprecated,"},{"line_number":23,"context_line":"as the generic decorator can be used there as well."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bae84128_1ad3b105","line":21,"in_reply_to":"bae84128_87e7b611","updated":"2016-02-22 09:04:32.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"bd8b776ea6d8778e7e5e6d0c04481cd4f0d050fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"bae84128_b8f6d4f6","updated":"2016-02-23 09:59:45.000000000","message":"nit: some lines longer than 75Ch","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"doc/source/dev/architecture.rst":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"47bc0c3cb0b3f895f4c13fa6d29b9987db312137","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"Here the ``spacing`` argument is a period in seconds for a given periodic task."},{"line_number":101,"context_line":"For example \u0027spacing\u003d5\u0027 means every 5 seconds."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Message Routing"}],"source_content_type":"text/x-rst","patch_set":15,"id":"bae84128_a2e333d8","line":101,"updated":"2016-02-23 15:08:48.000000000","message":"Also \"enabled\" parameter should be documented.","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76435e5832f156fee7dd82d84ee0d5a76c3be5d5","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"Here the ``spacing`` argument is a period in seconds for a given periodic task."},{"line_number":101,"context_line":"For example \u0027spacing\u003d5\u0027 means every 5 seconds."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Message Routing"}],"source_content_type":"text/x-rst","patch_set":15,"id":"bae84128_dd0e188b","line":101,"in_reply_to":"bae84128_a2e333d8","updated":"2016-02-23 15:10:14.000000000","message":"I don\u0027t want to copy the whole futurist documentation, to be honest :)","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8e094bc2c8b4242830dedcee3dff913cb22e364a","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"Here the ``spacing`` argument is a period in seconds for a given periodic task."},{"line_number":101,"context_line":"For example \u0027spacing\u003d5\u0027 means every 5 seconds."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Message Routing"}],"source_content_type":"text/x-rst","patch_set":15,"id":"bae84128_58e21630","line":101,"in_reply_to":"bae84128_dd0e188b","updated":"2016-02-23 15:17:57.000000000","message":"ok","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"etc/ironic/ironic.conf.sample":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"3db539c03e665424694e045bb30196c064045cdf","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# Options defined in ironic.common.service"},{"line_number":118,"context_line":"#"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# Deprecated and has not effect. (integer value)"},{"line_number":121,"context_line":"#periodic_interval\u003d60"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"# Name of this node. This can be an opaque identifier. It is"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"5a5ae5dd_6bfda36d","line":120,"updated":"2016-02-09 17:39:00.000000000","message":"Typo: \"not\" -\u003e \"no\"","commit_id":"9f418cc78c8ff72ee6b18c532f5c840c4a2e5452"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b8c9dda6513c13fd5d3b4efaed1c338b179f6012","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# Options defined in ironic.common.service"},{"line_number":118,"context_line":"#"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# Default interval for running driver periodic tasks. (integer"},{"line_number":121,"context_line":"# value)"},{"line_number":122,"context_line":"#periodic_interval\u003d60"},{"line_number":123,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":16,"id":"bae84128_85acf28c","line":120,"updated":"2016-02-24 15:28:04.000000000","message":"Nit if you push another: \"default interval (in seconds) for...\"","commit_id":"3429e3824c060071e59a117c19c95659c78e4c8b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"feb9165b09333ede2731a3866b46024aafde65a9","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# Options defined in ironic.common.service"},{"line_number":118,"context_line":"#"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# Default interval for running driver periodic tasks. (integer"},{"line_number":121,"context_line":"# value)"},{"line_number":122,"context_line":"#periodic_interval\u003d60"},{"line_number":123,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":16,"id":"bae84128_50d466ea","line":120,"in_reply_to":"bae84128_85acf28c","updated":"2016-02-24 15:43:51.000000000","message":"++\n\nWould also be good if the message indicated that this option is deprecated and marked to be removed.\n\n...\n\nMaybe it\u0027s something that the config generation should do tho. (/me looks into it)","commit_id":"3429e3824c060071e59a117c19c95659c78e4c8b"}],"ironic/common/service.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"3db539c03e665424694e045bb30196c064045cdf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"service_opts \u003d ["},{"line_number":41,"context_line":"    cfg.IntOpt(\u0027periodic_interval\u0027,"},{"line_number":42,"context_line":"               default\u003d60,"},{"line_number":43,"context_line":"               help\u003d_(\u0027Deprecated and has not effect.\u0027)),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027host\u0027,"},{"line_number":45,"context_line":"               default\u003dsocket.getfqdn(),"},{"line_number":46,"context_line":"               help\u003d_(\u0027Name of this node. This can be an opaque identifier. \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a5ae5dd_2b6d6b32","line":43,"updated":"2016-02-09 17:39:00.000000000","message":"Typo: \"not\" -\u003e \"no\"","commit_id":"9f418cc78c8ff72ee6b18c532f5c840c4a2e5452"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"service_opts \u003d ["},{"line_number":41,"context_line":"    cfg.IntOpt(\u0027periodic_interval\u0027,"},{"line_number":42,"context_line":"               default\u003d60,"},{"line_number":43,"context_line":"               help\u003d_(\u0027Deprecated and has no effect.\u0027)),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027host\u0027,"},{"line_number":45,"context_line":"               default\u003dsocket.getfqdn(),"},{"line_number":46,"context_line":"               help\u003d_(\u0027Name of this node. This can be an opaque identifier. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_79121664","line":43,"updated":"2016-02-19 15:55:07.000000000","message":"We should pass the \"deprecated_for_removal\u003dTrue\" parameter here to indicate that this configuration option is deprecated and will be removed in the future.\n\nhttps://github.com/openstack/oslo.config/blob/3c609a2cb1952cec23f9f1f128dab965d947476e/oslo_config/cfg.py#L659-L660","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"service_opts \u003d ["},{"line_number":41,"context_line":"    cfg.IntOpt(\u0027periodic_interval\u0027,"},{"line_number":42,"context_line":"               default\u003d60,"},{"line_number":43,"context_line":"               help\u003d_(\u0027Deprecated and has no effect.\u0027)),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027host\u0027,"},{"line_number":45,"context_line":"               default\u003dsocket.getfqdn(),"},{"line_number":46,"context_line":"               help\u003d_(\u0027Name of this node. This can be an opaque identifier. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_cf1714ec","line":43,"in_reply_to":"bae84128_79121664","updated":"2016-02-19 16:01:18.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"service_opts \u003d ["},{"line_number":41,"context_line":"    cfg.IntOpt(\u0027periodic_interval\u0027,"},{"line_number":42,"context_line":"               default\u003d60,"},{"line_number":43,"context_line":"               help\u003d_(\u0027Deprecated and has no effect.\u0027),"},{"line_number":44,"context_line":"               deprecated_for_removal\u003dTrue),"},{"line_number":45,"context_line":"    cfg.StrOpt(\u0027host\u0027,"},{"line_number":46,"context_line":"               default\u003dsocket.getfqdn(),"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_d0c19de5","line":43,"updated":"2016-02-24 14:25:27.000000000","message":"This will also need to be changed when using it in driver_periodic_task.","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"service_opts \u003d ["},{"line_number":41,"context_line":"    cfg.IntOpt(\u0027periodic_interval\u0027,"},{"line_number":42,"context_line":"               default\u003d60,"},{"line_number":43,"context_line":"               help\u003d_(\u0027Deprecated and has no effect.\u0027),"},{"line_number":44,"context_line":"               deprecated_for_removal\u003dTrue),"},{"line_number":45,"context_line":"    cfg.StrOpt(\u0027host\u0027,"},{"line_number":46,"context_line":"               default\u003dsocket.getfqdn(),"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_59b2d94c","line":43,"in_reply_to":"bae84128_d0c19de5","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f7056099631a81f26c0375187f51ae518db65e26","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.conductor \u003d cdr"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Start periodic tasks"},{"line_number":156,"context_line":"        self._periodic_tasks_worker \u003d self._executor.submit("},{"line_number":157,"context_line":"            self._periodic_tasks.start, allow_empty\u003dTrue)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        # NOTE(lucasagomes): If the conductor server dies abruptly"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_ee81bec4","line":156,"updated":"2016-01-07 20:50:21.000000000","message":"Interesting (since it uses the same executor that its running on to do more work), \n\nDid u want to make sure \u0027CONF.conductor.workers_pool_size \u003e 2\u0027 before doing this (just incase), and raise some kind of error, seems like bad things will happen if its \u003c\u003d 2\n\nAlthough i guess rejection.reject_when_reached will blowup right here if its \u003c\u003d2, maybe that\u0027s fine, but I\u0027m guessing u could just do a check earlier and throw a better exception message?","commit_id":"be713081ce91ac02a7607870ee669302d70637e2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"17c8e79202a8bc380a6d4fcc177a4c590b696ec2","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.conductor \u003d cdr"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Start periodic tasks"},{"line_number":156,"context_line":"        self._periodic_tasks_worker \u003d self._executor.submit("},{"line_number":157,"context_line":"            self._periodic_tasks.start, allow_empty\u003dTrue)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        # NOTE(lucasagomes): If the conductor server dies abruptly"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_e63690b3","line":156,"in_reply_to":"fa69d971_ee81bec4","updated":"2016-01-08 09:47:19.000000000","message":"Yeah, I was thinking about it. Will probably do.","commit_id":"be713081ce91ac02a7607870ee669302d70637e2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"conductor_opts \u003d ["},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":44,"context_line":"               default\u003d100,"},{"line_number":45,"context_line":"               help\u003d_(\u0027The size of the workers greenthread pool. \u0027"},{"line_number":46,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":47,"context_line":"                      \u0027itself for handling heart beats and periodic tasks.\u0027)),"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_9cf6e8d5","line":44,"updated":"2016-02-19 15:55:07.000000000","message":"Instead of checking the minimum value required as in L89 we could just use the \"min\" parameter for IntOpt [0]. Also see comment at L89 (tl;dr I think min should be bigger than 2. Not sure how much exactly but I would say 5 to 10 workers minimum)\n\n[0] https://github.com/openstack/oslo.config/blob/3c609a2cb1952cec23f9f1f128dab965d947476e/oslo_config/cfg.py#L1129","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"30acb25d2e20559df3edaa3174133fcc65ff8b23","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"conductor_opts \u003d ["},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":44,"context_line":"               default\u003d100,"},{"line_number":45,"context_line":"               help\u003d_(\u0027The size of the workers greenthread pool. \u0027"},{"line_number":46,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":47,"context_line":"                      \u0027itself for handling heart beats and periodic tasks.\u0027)),"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_ed34a0df","line":44,"in_reply_to":"bae84128_8fcb4c72","updated":"2016-02-19 16:23:20.000000000","message":"Gotcha, fair enough then","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"conductor_opts \u003d ["},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":44,"context_line":"               default\u003d100,"},{"line_number":45,"context_line":"               help\u003d_(\u0027The size of the workers greenthread pool. \u0027"},{"line_number":46,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":47,"context_line":"                      \u0027itself for handling heart beats and periodic tasks.\u0027)),"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_8fcb4c72","line":44,"in_reply_to":"bae84128_9cf6e8d5","updated":"2016-02-19 16:01:18.000000000","message":"Good catch about \"min\". As to the value, I\u0027ve run the whole inspector gate locally with workers_pool_size\u003d3, and it passed. So while it\u0027s not recommended, it\u0027s definitely possible.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param driver_name: name of the driver."},{"line_number":75,"context_line":"        :returns: the driver; an instance of a class which implements"},{"line_number":76,"context_line":"                  :class:`ironic.drivers.base.BaseDriver`."},{"line_number":77,"context_line":"        :raises: DriverNotFound if the driver is not loaded."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_7cab248a","line":77,"updated":"2016-02-19 15:55:07.000000000","message":"nit: raises RuntimeError","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"30acb25d2e20559df3edaa3174133fcc65ff8b23","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param driver_name: name of the driver."},{"line_number":75,"context_line":"        :returns: the driver; an instance of a class which implements"},{"line_number":76,"context_line":"                  :class:`ironic.drivers.base.BaseDriver`."},{"line_number":77,"context_line":"        :raises: DriverNotFound if the driver is not loaded."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_8d3eb4b6","line":77,"in_reply_to":"bae84128_2fa160aa","updated":"2016-02-19 16:23:20.000000000","message":"oh sorry, yeah. Tho it has no docstring (*sadface*) so I think you can leave it out","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param driver_name: name of the driver."},{"line_number":75,"context_line":"        :returns: the driver; an instance of a class which implements"},{"line_number":76,"context_line":"                  :class:`ironic.drivers.base.BaseDriver`."},{"line_number":77,"context_line":"        :raises: DriverNotFound if the driver is not loaded."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_2fa160aa","line":77,"in_reply_to":"bae84128_7cab248a","updated":"2016-02-19 16:01:18.000000000","message":"you probably meant init_host(), but it does not have a docstring","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if CONF.conductor.workers_pool_size \u003c\u003d 2:"},{"line_number":87,"context_line":"            raise RuntimeError(_(\u0027Value for workers_pool_size should be \u0027"},{"line_number":88,"context_line":"                                 \u0027greater than 2, as conductor itself uses \u0027"},{"line_number":89,"context_line":"                                 \u00272 threads.\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if self._started:"},{"line_number":92,"context_line":"            raise RuntimeError(_(\u0027Attempt to start an already running \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_5cf8e0e5","line":89,"updated":"2016-02-19 15:55:07.000000000","message":"If workers_pool_size is set to 2 will ironic be usable? I don\u0027t think so, because we depend on a couple of async tasks and we will need workers available.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"30acb25d2e20559df3edaa3174133fcc65ff8b23","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if CONF.conductor.workers_pool_size \u003c\u003d 2:"},{"line_number":87,"context_line":"            raise RuntimeError(_(\u0027Value for workers_pool_size should be \u0027"},{"line_number":88,"context_line":"                                 \u0027greater than 2, as conductor itself uses \u0027"},{"line_number":89,"context_line":"                                 \u00272 threads.\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if self._started:"},{"line_number":92,"context_line":"            raise RuntimeError(_(\u0027Attempt to start an already running \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_ed62e0d7","line":89,"in_reply_to":"bae84128_0f8d7c31","updated":"2016-02-19 16:23:20.000000000","message":"Yeah, if 3 worked with inspector I think we can leave it as a minimum.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if CONF.conductor.workers_pool_size \u003c\u003d 2:"},{"line_number":87,"context_line":"            raise RuntimeError(_(\u0027Value for workers_pool_size should be \u0027"},{"line_number":88,"context_line":"                                 \u0027greater than 2, as conductor itself uses \u0027"},{"line_number":89,"context_line":"                                 \u00272 threads.\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if self._started:"},{"line_number":92,"context_line":"            raise RuntimeError(_(\u0027Attempt to start an already running \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_0f8d7c31","line":89,"in_reply_to":"bae84128_5cf8e0e5","updated":"2016-02-19 16:01:18.000000000","message":"2 is not allowed here, and it worked for me with 3 - see above. I\u0027m not against requiring a bigger value, but dunno what it should be.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c74888042c94681742b1169fcde7ac7dadcd4a","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if CONF.conductor.workers_pool_size \u003c\u003d 2:"},{"line_number":87,"context_line":"            raise RuntimeError(_(\u0027Value for workers_pool_size should be \u0027"},{"line_number":88,"context_line":"                                 \u0027greater than 2, as conductor itself uses \u0027"},{"line_number":89,"context_line":"                                 \u00272 threads.\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if self._started:"},{"line_number":92,"context_line":"            raise RuntimeError(_(\u0027Attempt to start an already running \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_576a6081","line":89,"in_reply_to":"bae84128_ed62e0d7","updated":"2016-02-20 02:39:20.000000000","message":"Up to u guys, less threads just means less things that should be scheduled can be scheduled if they overlap, if they don\u0027t overlap there schedules then it doesn\u0027t matter, but if they do then it will just slow down (since there will be a backlog for the thread to process once it finishes).\n\nMight be a good idea to figure out how many async tasks possible, if they (may) overlap and figure out how many of those there are and then set the min at that.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                CONF.conductor.workers_pool_size):"},{"line_number":147,"context_line":"            LOG.warning(_LW(\u0027This conductor has %(tasks)d periodic tasks \u0027"},{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_b9c49e92","line":149,"updated":"2016-02-19 16:01:00.000000000","message":"It\u0027s not obvious to me from this message how seriously to take the warning. What happens if a scheduled job is due to start but no workers are available? Is the NoFreeConductorWorker exception caught somewhere and logged, or does it bring the whole process down?","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c74888042c94681742b1169fcde7ac7dadcd4a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                CONF.conductor.workers_pool_size):"},{"line_number":147,"context_line":"            LOG.warning(_LW(\u0027This conductor has %(tasks)d periodic tasks \u0027"},{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_f7261467","line":149,"in_reply_to":"bae84128_8fffcc33","updated":"2016-02-20 02:39:20.000000000","message":"All that happens is the schedule maintained at https://github.com/openstack/futurist/blob/master/futurist/periodics.py#L214 will just get processed more slowly, that\u0027s all. If any of those threads run forever and never return, that\u0027s a different story altogether but if they return (and at least one is free), then that schedule will just get processed more slowly that it could have processed with more threads.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7cf001b582f1a884f8ab543c0eed58efc1b3a7bd","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                CONF.conductor.workers_pool_size):"},{"line_number":147,"context_line":"            LOG.warning(_LW(\u0027This conductor has %(tasks)d periodic tasks \u0027"},{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_8fffcc33","line":149,"in_reply_to":"bae84128_b9c49e92","updated":"2016-02-19 16:03:25.000000000","message":"it\u0027s retried by futurist, so it\u0027s possible to work under such conditions (as I said above I even tried)","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        self._periodic_tasks \u003d periodics.PeriodicWorker("},{"line_number":154,"context_line":"            self._periodic_task_callables,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_3ceebc8b","line":151,"updated":"2016-02-19 15:55:07.000000000","message":"I wonder whether we should refuse to start if this is the case. I mean, will Ironic be usable if all the workers are jammed? Perhaps refusing to start the service and tell the operator to increase the number of workers ? WDYT?","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        self._periodic_tasks \u003d periodics.PeriodicWorker("},{"line_number":154,"context_line":"            self._periodic_task_callables,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_afa3b09d","line":151,"in_reply_to":"bae84128_3ceebc8b","updated":"2016-02-19 16:01:18.000000000","message":"We don\u0027t need to dedicate the whole thread for every periodic task we have. Also this number is driver-dependent, so it may happen that conductor will stop loading after e.g. inspection is enabled.","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c74888042c94681742b1169fcde7ac7dadcd4a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                            \u0027enabled, but only %(workers)d task workers \u0027"},{"line_number":149,"context_line":"                            \u0027allowed by [conductor]workers_pool_size option\u0027),"},{"line_number":150,"context_line":"                        {\u0027tasks\u0027: len(self._periodic_task_callables),"},{"line_number":151,"context_line":"                         \u0027workers\u0027: CONF.conductor.workers_pool_size})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        self._periodic_tasks \u003d periodics.PeriodicWorker("},{"line_number":154,"context_line":"            self._periodic_task_callables,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_17e57808","line":151,"in_reply_to":"bae84128_afa3b09d","updated":"2016-02-20 02:39:20.000000000","message":"Right see above, there isn\u0027t a 1:1 mapping of periodic task to thread, there is just a schedule maintained (see above) and a loop that runs sending off functions that are scheduled to run to an executor and otherwise that loop idles/sleeps waiting for the next thing to run (which is determined by the schedule maintained).\n\nLoop is literally at https://github.com/openstack/futurist/blob/master/futurist/periodics.py#L579 (def _run)","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"57c74888042c94681742b1169fcde7ac7dadcd4a","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                self._periodic_task_callables.append((member, args, {}))"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def _on_periodic_tasks_stop(self, fut):"},{"line_number":256,"context_line":"        result \u003d fut.result()"},{"line_number":257,"context_line":"        failure \u003d result[2] if result is not None else None"},{"line_number":258,"context_line":"        if failure is None:"},{"line_number":259,"context_line":"            LOG.info(_LI(\u0027Successfully shut down periodic tasks\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_b7880c24","line":256,"updated":"2016-02-20 02:39:20.000000000","message":"Typically this will raise if its an exception, I guess this code handles exceptions differently?\n\nhttps://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result\n\n\u0027\u0027If the call raised, this method will raise the same exception.\u0027\u0027\n\nSo perhaps u wanted a try/except block here?\n\n  try:\n    _result \u003d fut.result()\n    ...\n  except RuntimeError:\n     ...\n\nAlso doesn\u0027t seem like start() returns anything so unsure how result[2] works here...","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                self._periodic_task_callables.append((member, args, {}))"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def _on_periodic_tasks_stop(self, fut):"},{"line_number":256,"context_line":"        result \u003d fut.result()"},{"line_number":257,"context_line":"        failure \u003d result[2] if result is not None else None"},{"line_number":258,"context_line":"        if failure is None:"},{"line_number":259,"context_line":"            LOG.info(_LI(\u0027Successfully shut down periodic tasks\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_da830903","line":256,"in_reply_to":"bae84128_b7880c24","updated":"2016-02-22 09:04:32.000000000","message":"Yeah, I\u0027ve confused it with something else..","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        Spawns a greenthread if there are free slots in pool, otherwise raises"},{"line_number":291,"context_line":"        exception. Execution control returns immediately to the caller."}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_19e2ead5","line":288,"updated":"2016-02-19 16:01:00.000000000","message":"s/greenthread/future?","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"731a6d988258c0d3436ac203ec8554748398f930","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        Spawns a greenthread if there are free slots in pool, otherwise raises"},{"line_number":291,"context_line":"        exception. Execution control returns immediately to the caller."}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_7a8c7d35","line":288,"in_reply_to":"bae84128_19e2ead5","updated":"2016-02-22 09:04:32.000000000","message":"This creates a green thread, but returns a Future :)","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self._keepalive_evt \u003d threading.Event()"},{"line_number":99,"context_line":"        \"\"\"Event for the keepalive thread.\"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        # TODO(dtantsur): make it configurable?"},{"line_number":102,"context_line":"        rejection_func \u003d rejection.reject_when_reached("},{"line_number":103,"context_line":"            CONF.conductor.workers_pool_size)"},{"line_number":104,"context_line":"        self._executor \u003d futurist.GreenThreadPoolExecutor("}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_30f28906","line":101,"updated":"2016-02-24 14:25:27.000000000","message":"Make the rejection function configurable? Curious what people would want to change that to...","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self._keepalive_evt \u003d threading.Event()"},{"line_number":99,"context_line":"        \"\"\"Event for the keepalive thread.\"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        # TODO(dtantsur): make it configurable?"},{"line_number":102,"context_line":"        rejection_func \u003d rejection.reject_when_reached("},{"line_number":103,"context_line":"            CONF.conductor.workers_pool_size)"},{"line_number":104,"context_line":"        self._executor \u003d futurist.GreenThreadPoolExecutor("}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_798a3d65","line":101,"in_reply_to":"bae84128_30f28906","updated":"2016-02-24 14:40:58.000000000","message":"I meant the threshold, if e.g. people want to allow enqueueing tasks","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"bd8b776ea6d8778e7e5e6d0c04481cd4f0d050fa","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            LOG.error(msg, self.host)"},{"line_number":125,"context_line":"            raise exception.NoDriversLoaded(conductor\u003dself.host)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Collect driver-specific periodic tasks."},{"line_number":128,"context_line":"        # Conductor periodic tasks accept context argument, driver periodic"},{"line_number":129,"context_line":"        # tasks accept this manager and context. We have to ensure that the"},{"line_number":130,"context_line":"        # same driver interface class is not traversed twice, otherwise"},{"line_number":131,"context_line":"        # we\u0027ll have several instances of the same task."},{"line_number":132,"context_line":"        LOG.debug(\u0027Collecting periodic tasks\u0027)"},{"line_number":133,"context_line":"        self._periodic_task_callables \u003d []"},{"line_number":134,"context_line":"        periodic_task_classes \u003d set()"},{"line_number":135,"context_line":"        self._collect_periodic_tasks(self, (admin_context,))"},{"line_number":136,"context_line":"        for driver_obj in driver_factory.drivers().values():"},{"line_number":137,"context_line":"            self._collect_periodic_tasks(driver_obj, (self, admin_context))"},{"line_number":138,"context_line":"            for iface_name in (driver_obj.core_interfaces +"},{"line_number":139,"context_line":"                               driver_obj.standard_interfaces +"},{"line_number":140,"context_line":"                               [\u0027vendor\u0027]):"},{"line_number":141,"context_line":"                iface \u003d getattr(driver_obj, iface_name, None)"},{"line_number":142,"context_line":"                if iface and iface.__class__ not in periodic_task_classes:"},{"line_number":143,"context_line":"                    self._collect_periodic_tasks(iface, (self, admin_context))"},{"line_number":144,"context_line":"                    periodic_task_classes.add(iface.__class__)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        if (len(self._periodic_task_callables) \u003e"},{"line_number":147,"context_line":"                CONF.conductor.workers_pool_size):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_7fa8b68d","line":144,"range":{"start_line":127,"start_character":1,"end_line":144,"end_character":62},"updated":"2016-02-23 09:59:45.000000000","message":"why not merge this recursion with the self._collect_periodic_task() which atm just calls inspect.getmembers?","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"bd8b776ea6d8778e7e5e6d0c04481cd4f0d050fa","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            if self._mapped_to_this_conductor(*result[:2]):"},{"line_number":283,"context_line":"                yield result"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_c2cda9b8","line":285,"updated":"2016-02-23 09:59:45.000000000","message":"Is this lock necessary? It seems to me it should be the job of self._executor to sanitize calls to its resources (https://github.com/openstack/futurist/blob/master/futurist/_futures.py#L376)","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            if self._mapped_to_this_conductor(*result[:2]):"},{"line_number":283,"context_line":"                yield result"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_d9d2695b","line":285,"in_reply_to":"bae84128_7201f237","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"901d8b86cc5a557daac0fdd7fb6bfa5b0caf7248","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            if self._mapped_to_this_conductor(*result[:2]):"},{"line_number":283,"context_line":"                yield result"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f2950233","line":285,"in_reply_to":"bae84128_c2cda9b8","updated":"2016-02-23 16:38:08.000000000","message":"Good question. It may not be needed anymore, unsure though why it was initially needed in the first place (that might want to be answered/investigated before doing anything like removing this line).","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"383ca3e7a4bbe60b0d9e3cb0f890f7da373fd1cd","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            if self._mapped_to_this_conductor(*result[:2]):"},{"line_number":283,"context_line":"                yield result"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @lockutils.synchronized(WORKER_SPAWN_lOCK, \u0027ironic-\u0027)"},{"line_number":286,"context_line":"    def _spawn_worker(self, func, *args, **kwargs):"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        \"\"\"Create a greenthread to run func(*args, **kwargs)."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_7201f237","line":285,"in_reply_to":"bae84128_f2950233","updated":"2016-02-23 16:44:37.000000000","message":"Not sure about the background, but my impression was that execute() might not be thread-safe.","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"ironic/drivers/base.py":[{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"bd8b776ea6d8778e7e5e6d0c04481cd4f0d050fa","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"            def task(self, manager, context):"},{"line_number":1129,"context_line":"                # do some job"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"    :param kwargs: arguments to pass to @periodic_task.periodic_task"},{"line_number":1132,"context_line":"    \"\"\""},{"line_number":1133,"context_line":"    LOG.warning(_LW(\u0027driver_periodic_task decorator is deprecated, please \u0027"},{"line_number":1134,"context_line":"                    \u0027use futurist.periodics.periodic directly\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_82f56158","line":1131,"range":{"start_line":1131,"start_character":40,"end_line":1131,"end_character":68},"updated":"2016-02-23 09:59:45.000000000","message":"Nit: change to @periodics.periodic","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"            def task(self, manager, context):"},{"line_number":1129,"context_line":"                # do some job"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"    :param kwargs: arguments to pass to @periodic_task.periodic_task"},{"line_number":1132,"context_line":"    \"\"\""},{"line_number":1133,"context_line":"    LOG.warning(_LW(\u0027driver_periodic_task decorator is deprecated, please \u0027"},{"line_number":1134,"context_line":"                    \u0027use futurist.periodics.periodic directly\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f9cbeda1","line":1131,"range":{"start_line":1131,"start_character":40,"end_line":1131,"end_character":68},"in_reply_to":"bae84128_82f56158","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":1146,"context_line":"                        \u0027futurist.periodics.periodic and are ignored: %s\u0027),"},{"line_number":1147,"context_line":"                    \u0027, \u0027.join(kwargs))"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    return periodics.periodic(**new_kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_153db7dc","line":1149,"updated":"2016-02-24 14:25:27.000000000","message":"As `spacing` is a required argument for futurist, and wasn\u0027t required in the past here, we\u0027re going to break any tasks that don\u0027t pass it.\n\nWe should default it to periodic_interval, and drop support for this method and that config at the same time.","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":1146,"context_line":"                        \u0027futurist.periodics.periodic and are ignored: %s\u0027),"},{"line_number":1147,"context_line":"                    \u0027, \u0027.join(kwargs))"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"    return periodics.periodic(**new_kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_99bd8104","line":1149,"in_reply_to":"bae84128_153db7dc","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"ironic/tests/unit/conductor/test_base_manager.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"            @periodics.periodic(spacing\u003d42)"},{"line_number":118,"context_line":"            def task(self, context):"},{"line_number":119,"context_line":"                pass"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        obj \u003d Driver()"},{"line_number":122,"context_line":"        get_mock.return_value \u003d mock.Mock(obj\u003dobj)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f60ada1e","line":119,"updated":"2016-02-24 14:25:27.000000000","message":"Maybe we also want to leave in a test for driver_periodic_task until we drop it?","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"            @periodics.periodic(spacing\u003d42)"},{"line_number":118,"context_line":"            def task(self, context):"},{"line_number":119,"context_line":"                pass"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        obj \u003d Driver()"},{"line_number":122,"context_line":"        get_mock.return_value \u003d mock.Mock(obj\u003dobj)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_596bf9b6","line":119,"in_reply_to":"bae84128_f60ada1e","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    def test_warning_on_low_workers_pool(self, log_mock):"},{"line_number":160,"context_line":"        CONF.set_override(\u0027workers_pool_size\u0027, 3, \u0027conductor\u0027)"},{"line_number":161,"context_line":"        self._start_service()"},{"line_number":162,"context_line":"        self.assertTrue(log_mock.warning.called)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @mock.patch.object(eventlet.greenpool.GreenPool, \u0027waitall\u0027)"},{"line_number":165,"context_line":"    def test_del_host_waits_on_workerpool(self, wait_mock):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_76452a41","line":162,"updated":"2016-02-24 14:25:27.000000000","message":"Do we want a test for this config being set less than 3? (or did I miss it?)","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    def test_warning_on_low_workers_pool(self, log_mock):"},{"line_number":160,"context_line":"        CONF.set_override(\u0027workers_pool_size\u0027, 3, \u0027conductor\u0027)"},{"line_number":161,"context_line":"        self._start_service()"},{"line_number":162,"context_line":"        self.assertTrue(log_mock.warning.called)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @mock.patch.object(eventlet.greenpool.GreenPool, \u0027waitall\u0027)"},{"line_number":165,"context_line":"    def test_del_host_waits_on_workerpool(self, wait_mock):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_d976e9a2","line":162,"in_reply_to":"bae84128_76452a41","updated":"2016-02-24 14:40:58.000000000","message":"it\u0027s handled by oslo.config for us","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"df7efea163a85d1560ccee13e6f8c15008a67ea5","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":1163,"context_line":"            driver_internal_info\u003d{\u0027is_whole_disk_image\u0027: False})"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"        self._start_service()"},{"line_number":1166,"context_line":"        self.service.do_node_tear_down(self.context, node.uuid)"},{"line_number":1167,"context_line":"        self._stop_service()"},{"line_number":1168,"context_line":"        node.refresh()"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_4f5dc4e8","line":1165,"updated":"2016-02-19 16:01:00.000000000","message":"Why wasn\u0027t this needed before?","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7cf001b582f1a884f8ab543c0eed58efc1b3a7bd","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":1163,"context_line":"            driver_internal_info\u003d{\u0027is_whole_disk_image\u0027: False})"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"        self._start_service()"},{"line_number":1166,"context_line":"        self.service.do_node_tear_down(self.context, node.uuid)"},{"line_number":1167,"context_line":"        self._stop_service()"},{"line_number":1168,"context_line":"        node.refresh()"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_4f5f8472","line":1165,"in_reply_to":"bae84128_4f5dc4e8","updated":"2016-02-19 16:03:25.000000000","message":"it was on line 1179 in the upper function","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"}],"ironic/tests/unit/conductor/test_task_manager.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"ab3ce79beb74403fba251e101d092d400e718b01","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        thread \u003d pool.spawn(func)"},{"line_number":679,"context_line":"        q1.get()"},{"line_number":680,"context_line":"        thread.link(link_callback)"},{"line_number":681,"context_line":"        q2.put(None)"},{"line_number":682,"context_line":"        pool.waitall()"},{"line_number":683,"context_line":"        link_callback.assert_called_once_with(thread)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_35b39b0b","line":680,"updated":"2016-02-24 14:00:41.000000000","message":"Because we do not use thread and link() method directly this test class should be modified or removed.","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        thread \u003d pool.spawn(func)"},{"line_number":679,"context_line":"        q1.get()"},{"line_number":680,"context_line":"        thread.link(link_callback)"},{"line_number":681,"context_line":"        q2.put(None)"},{"line_number":682,"context_line":"        pool.waitall()"},{"line_number":683,"context_line":"        link_callback.assert_called_once_with(thread)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_190e91e4","line":680,"in_reply_to":"bae84128_35b39b0b","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}],"releasenotes/notes/futurist-e9c55699f479f97a.yaml":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_fc81f490","line":2,"updated":"2016-02-19 15:55:07.000000000","message":"s/\u003e//","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_0f09fc95","line":2,"in_reply_to":"bae84128_fc81f490","updated":"2016-02-19 16:01:18.000000000","message":"it was there already, I don\u0027t think I should delete it..","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"},{"line_number":6,"context_line":"    sequentially in one green thread."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_bc25acc3","line":3,"updated":"2016-02-19 15:55:07.000000000","message":"pehaps it should have a dash (\u0027-\u0027) prefixing it as others paragraphes ?","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"},{"line_number":6,"context_line":"    sequentially in one green thread."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_aff8d07d","line":3,"in_reply_to":"bae84128_bc25acc3","updated":"2016-02-19 16:01:18.000000000","message":"no, that\u0027s why we have \u003e above","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"},{"line_number":6,"context_line":"    sequentially in one green thread."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - Configuration option \"workers_pool_size\" can no longer be less or equal"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_4f81444a","line":5,"range":{"start_line":5,"start_character":40,"end_line":5,"end_character":67},"updated":"2016-02-19 15:55:07.000000000","message":"s/in different green threads, not/and not \n\n(maybe ?)","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7b317d6b8a252ad66369564337da3d4d1d528f2e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"},{"line_number":6,"context_line":"    sequentially in one green thread."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - Configuration option \"workers_pool_size\" can no longer be less or equal"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_4f7304b2","line":5,"range":{"start_line":5,"start_character":21,"end_line":5,"end_character":27},"updated":"2016-02-19 15:55:07.000000000","message":"truly","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1616fb8e133d54da1ab2077a27e710763b6656c2","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    This release features switch to Oslo Futurist library for asynchronous"},{"line_number":4,"context_line":"    thread execution and periodic tasks. Main benefit is that periodic tasks"},{"line_number":5,"context_line":"    are now executed truely in parallel in different green threads, not"},{"line_number":6,"context_line":"    sequentially in one green thread."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - Configuration option \"workers_pool_size\" can no longer be less or equal"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"bae84128_8ff50c85","line":5,"range":{"start_line":5,"start_character":40,"end_line":5,"end_character":67},"in_reply_to":"bae84128_4f81444a","updated":"2016-02-19 16:01:18.000000000","message":"Done","commit_id":"3b5879c07414c3cfadb14c96fa660da800c9c98b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1b0fb37a4f1cf508e3bb23021b159f3e1c51330e","unresolved":false,"context_lines":[{"line_number":8,"context_line":"  - Configuration option \"workers_pool_size\" can no longer be less or equal"},{"line_number":9,"context_line":"    to 2. Please set it to greater value (the default is 100) before update."},{"line_number":10,"context_line":"deprecations:"},{"line_number":11,"context_line":"  - Configuration option \"periodic_interval\" is deprecated and has no effect."},{"line_number":12,"context_line":"  - Using \"driver_periodic_task\" decorator is deprecated. Please update your"},{"line_number":13,"context_line":"    out-of-tree drivers to use \"periodics.periodic\" decorator from Futurist"},{"line_number":14,"context_line":"    library."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_b04a1953","line":11,"updated":"2016-02-24 14:25:27.000000000","message":"This will need to change when we use it in driver_periodic_task","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4a60c3cdacdffd2ecfc708d2f8d807901522fbd2","unresolved":false,"context_lines":[{"line_number":8,"context_line":"  - Configuration option \"workers_pool_size\" can no longer be less or equal"},{"line_number":9,"context_line":"    to 2. Please set it to greater value (the default is 100) before update."},{"line_number":10,"context_line":"deprecations:"},{"line_number":11,"context_line":"  - Configuration option \"periodic_interval\" is deprecated and has no effect."},{"line_number":12,"context_line":"  - Using \"driver_periodic_task\" decorator is deprecated. Please update your"},{"line_number":13,"context_line":"    out-of-tree drivers to use \"periodics.periodic\" decorator from Futurist"},{"line_number":14,"context_line":"    library."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bae84128_b9a685be","line":11,"in_reply_to":"bae84128_b04a1953","updated":"2016-02-24 14:40:58.000000000","message":"Done","commit_id":"3d664b014f7a2b64a5505d3a7ece9503aeb0f93d"}]}
