)]}'
{"specs/train/approved/general-purpose-decision-engine-threadpool.rst":[{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"7b61885d4537760888613d4a12f0b0a451ca6a36","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/watcher/+spec/general-purpose-decision-engine-threadpool"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Many I/O operations such as writing to disc or waiting for network responses"},{"line_number":14,"context_line":"take a long amount of time. By leveraging parallelism the time taken to"},{"line_number":15,"context_line":"perform such operations can be drastically reduced. The general purpose"},{"line_number":16,"context_line":"threadpool for the decision engine will allow to perform methods in parallel,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5faad753_050573c2","line":13,"range":{"start_line":13,"start_character":42,"end_line":13,"end_character":43},"updated":"2019-09-10 01:43:18.000000000","message":"nit:disk","commit_id":"9a86b21e8ec39d5e98f7fa671511cdbeb1a47ded"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"3f37fe544719bdc3d693b272091b912b9dcbe6f4","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/watcher/+spec/general-purpose-decision-engine-threadpool"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Many I/O operations such as writing to disc or waiting for network responses"},{"line_number":14,"context_line":"take a long amount of time. By leveraging parallelism the time taken to"},{"line_number":15,"context_line":"perform such operations can be drastically reduced. The general purpose"},{"line_number":16,"context_line":"threadpool for the decision engine will allow to perform methods in parallel,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5faad753_166a8ab2","line":13,"range":{"start_line":13,"start_character":42,"end_line":13,"end_character":43},"in_reply_to":"5faad753_050573c2","updated":"2019-09-10 06:54:52.000000000","message":"Done","commit_id":"9a86b21e8ec39d5e98f7fa671511cdbeb1a47ded"},{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"7b61885d4537760888613d4a12f0b0a451ca6a36","unresolved":false,"context_lines":[{"line_number":134,"context_line":"- The verifying of the completeness of the data model when build with"},{"line_number":135,"context_line":"  parallelization."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Documentation Impact"},{"line_number":138,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5faad753_e5e13700","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":20},"updated":"2019-09-10 01:43:18.000000000","message":"Do we need to provide a document to the deployer?","commit_id":"9a86b21e8ec39d5e98f7fa671511cdbeb1a47ded"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"3f37fe544719bdc3d693b272091b912b9dcbe6f4","unresolved":false,"context_lines":[{"line_number":134,"context_line":"- The verifying of the completeness of the data model when build with"},{"line_number":135,"context_line":"  parallelization."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Documentation Impact"},{"line_number":138,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5faad753_d66392db","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":20},"in_reply_to":"5faad753_e5e13700","updated":"2019-09-10 06:54:52.000000000","message":"Seems like a good idea, done.","commit_id":"9a86b21e8ec39d5e98f7fa671511cdbeb1a47ded"},{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"be02fac376eff69328605657a9a0259debe1b09c","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The documentation will be updated to include usage examples that indicate to"},{"line_number":141,"context_line":"other developers how to best use the threadpool. Additionally, typical use"},{"line_number":142,"context_line":"cases in what situations this threadpool will be most useful will be provided. "},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5faad753_f6b32e4c","line":142,"range":{"start_line":142,"start_character":78,"end_line":142,"end_character":79},"updated":"2019-09-10 06:57:20.000000000","message":"nit:space will +2.","commit_id":"bc2ae871fc82625153d0f6020698530448204510"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"adf70fe20501791b470e4029f21c4cc7635241f4","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The documentation will be updated to include usage examples that indicate to"},{"line_number":141,"context_line":"other developers how to best use the threadpool. Additionally, typical use"},{"line_number":142,"context_line":"cases in what situations this threadpool will be most useful will be provided. "},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5faad753_96051ac5","line":142,"range":{"start_line":142,"start_character":78,"end_line":142,"end_character":79},"in_reply_to":"5faad753_f6b32e4c","updated":"2019-09-10 07:05:08.000000000","message":"Done","commit_id":"bc2ae871fc82625153d0f6020698530448204510"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":34,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Introduce a general purpose threadpool using the `futurist`_ library for which"},{"line_number":37,"context_line":"end users can configure the amount of threads. This will introduce a new class"},{"line_number":38,"context_line":"that uses a singular pattern so it can be used throughout the decision engine."},{"line_number":39,"context_line":"The threadpool will use the GreenThreadPoolExecutor as it does not conflict"},{"line_number":40,"context_line":"with other threadpools used in the decision engine. The singleton will contain"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_9cabc287","line":37,"range":{"start_line":37,"start_character":14,"end_line":37,"end_character":45},"updated":"2019-09-12 07:03:12.000000000","message":"What\u0027s the default? Maybe we can refer to the workers option of Watcher Api, its default is equal to the number of CPUs available.","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"1b7d1dff0b0959867e223ec557b5cd394574df4a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Introduce a general purpose threadpool using the `futurist`_ library for which"},{"line_number":37,"context_line":"end users can configure the amount of threads. This will introduce a new class"},{"line_number":38,"context_line":"that uses a singular pattern so it can be used throughout the decision engine."},{"line_number":39,"context_line":"The threadpool will use the GreenThreadPoolExecutor as it does not conflict"},{"line_number":40,"context_line":"with other threadpools used in the decision engine. The singleton will contain"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3fa7e38b_7480a28c","line":37,"range":{"start_line":37,"start_character":14,"end_line":37,"end_character":45},"in_reply_to":"3fa7e38b_f194b6ea","updated":"2019-09-19 02:01:33.000000000","message":"agree","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"fad5c9e559d9f9ba148b35c92b38a82948f08520","unresolved":false,"context_lines":[{"line_number":34,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Introduce a general purpose threadpool using the `futurist`_ library for which"},{"line_number":37,"context_line":"end users can configure the amount of threads. This will introduce a new class"},{"line_number":38,"context_line":"that uses a singular pattern so it can be used throughout the decision engine."},{"line_number":39,"context_line":"The threadpool will use the GreenThreadPoolExecutor as it does not conflict"},{"line_number":40,"context_line":"with other threadpools used in the decision engine. The singleton will contain"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3fa7e38b_f194b6ea","line":37,"range":{"start_line":37,"start_character":14,"end_line":37,"end_character":45},"in_reply_to":"5faad753_09299299","updated":"2019-09-18 07:27:32.000000000","message":"I would not let the default be determined by something external as this threadpool is supposed to be general purpose so in the future it should also be used by other parts of Watcher. I think just documenting that the user should change it and using 2 as default (same as number of concurrent audits see https://github.com/openstack/watcher/blob/master/watcher/conf/decision_engine.py#L43) will be the best option.","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"d37f7fed00bf9483b5e6d7148944c513c1b02004","unresolved":false,"context_lines":[{"line_number":34,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Introduce a general purpose threadpool using the `futurist`_ library for which"},{"line_number":37,"context_line":"end users can configure the amount of threads. This will introduce a new class"},{"line_number":38,"context_line":"that uses a singular pattern so it can be used throughout the decision engine."},{"line_number":39,"context_line":"The threadpool will use the GreenThreadPoolExecutor as it does not conflict"},{"line_number":40,"context_line":"with other threadpools used in the decision engine. The singleton will contain"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_09299299","line":37,"range":{"start_line":37,"start_character":14,"end_line":37,"end_character":45},"in_reply_to":"5faad753_773aa134","updated":"2019-09-16 03:03:53.000000000","message":"Is it best when the number of threads is the same as the number of nova apis? \nBy default, we can set a conservative value and prompt the user how to improve efficiency.","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Introduce a general purpose threadpool using the `futurist`_ library for which"},{"line_number":37,"context_line":"end users can configure the amount of threads. This will introduce a new class"},{"line_number":38,"context_line":"that uses a singular pattern so it can be used throughout the decision engine."},{"line_number":39,"context_line":"The threadpool will use the GreenThreadPoolExecutor as it does not conflict"},{"line_number":40,"context_line":"with other threadpools used in the decision engine. The singleton will contain"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_773aa134","line":37,"range":{"start_line":37,"start_character":14,"end_line":37,"end_character":45},"in_reply_to":"5faad753_9cabc287","updated":"2019-09-12 08:07:14.000000000","message":"I propose the default to be more conservative say around 4. Suppose Watcher is installed as a service alongside other components on a machine with 32 threads with will now proceed to make 32 concurrent calls to external API\u0027s, especially on smaller clouds this could cause problems. \n\nHowever, I do not know how common it is for components to be installed on \u0027bare metal\u0027 or if it is more typically done by running a component inside a virtual machine. In the last case I think settings the default to the number of CPUs is a very good default value.","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":59,"context_line":"would mean that introducing parallelism in other parts of the decision engine"},{"line_number":60,"context_line":"would again require the design and implementation of yet another threadpool."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Data model impact"},{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_1c5592c6","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":16},"updated":"2019-09-12 07:03:12.000000000","message":"As note in template: If you have\n  nothing to say for a whole section, just write: None","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"would mean that introducing parallelism in other parts of the decision engine"},{"line_number":60,"context_line":"would again require the design and implementation of yet another threadpool."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Data model impact"},{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_1777ad04","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":16},"in_reply_to":"5faad753_1c5592c6","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"REST API impact"},{"line_number":67,"context_line":"---------------"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_dc605aa8","line":66,"range":{"start_line":66,"start_character":0,"end_line":66,"end_character":15},"updated":"2019-09-12 07:03:12.000000000","message":"ditto","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"REST API impact"},{"line_number":67,"context_line":"---------------"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_3772e912","line":66,"range":{"start_line":66,"start_character":0,"end_line":66,"end_character":15},"in_reply_to":"5faad753_dc605aa8","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":67,"context_line":"---------------"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Security impact"},{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_9c5ae2f0","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":15},"updated":"2019-09-12 07:03:12.000000000","message":"ditto","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"---------------"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Security impact"},{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_d762753e","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":15},"in_reply_to":"5faad753_9c5ae2f0","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Notifications impact"},{"line_number":75,"context_line":"--------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_bc5d5eea","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":20},"updated":"2019-09-12 07:03:12.000000000","message":"ditto","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Notifications impact"},{"line_number":75,"context_line":"--------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_f7653146","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":20},"in_reply_to":"5faad753_bc5d5eea","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":75,"context_line":"--------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"Other end user impact"},{"line_number":79,"context_line":"---------------------"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_5c746a68","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":21},"updated":"2019-09-12 07:03:12.000000000","message":"ditto","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"--------------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"Other end user impact"},{"line_number":79,"context_line":"---------------------"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_975cfd7e","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":21},"in_reply_to":"5faad753_5c746a68","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"03dc3a12e265bbdfdc2d0e74f1d70ffd8c7ee1ba","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"   * - Release Name"},{"line_number":161,"context_line":"     - Description"},{"line_number":162,"context_line":"   * - Train"},{"line_number":163,"context_line":"     - Introduced"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_9cf3c20a","line":162,"range":{"start_line":162,"start_character":7,"end_line":162,"end_character":12},"updated":"2019-09-12 07:03:12.000000000","message":"It\u0027s too late for Train, as we talked yesterday, it\u0027s better to postpone to the next release.","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"},{"author":{"_account_id":29911,"name":"Dantali0n","email":"info@dantalion.nl","username":"Dantali0n"},"change_message_id":"498bee62f6cb35aa18da87a9384ea08f3b05214c","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"   * - Release Name"},{"line_number":161,"context_line":"     - Description"},{"line_number":162,"context_line":"   * - Train"},{"line_number":163,"context_line":"     - Introduced"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5faad753_b75fb970","line":162,"range":{"start_line":162,"start_character":7,"end_line":162,"end_character":12},"in_reply_to":"5faad753_9cf3c20a","updated":"2019-09-12 08:07:14.000000000","message":"Done","commit_id":"c1ac55430db43c732b5bf02c9ec4d68baaa3df4f"}]}
