)]}'
{"specs/liberty/reload-file-based-pipeline-configuration.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ded7be8678a2310f54e3673b2d9b385141e9aa5","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"When ceilometer agent restarts, during initialization it reads the"},{"line_number":38,"context_line":"entry_points and creates and loads all pollster objects corresponding to"},{"line_number":39,"context_line":"meters present in setup.cfg."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"There are disadvantages with this implementation:"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_20d145ce","line":39,"updated":"2015-06-05 11:02:44.000000000","message":"This description above raises a very interesting point:\n\nentry_points are controlling the extensions that are being loaded into a polling agent\n\nAs far as I can tell this loading of extensions is done before the pipeline.yaml is consulted to see if this agent even needs a particular agent to handle the polling configuration defined by the pipeline. This seems rather wasteful.\n\nIf the end game in these changes is to have pollsters that are only doing specific jobs then they should only load the extension they need.\n\nThis suggests that there is considerable confusion and conflation between entry_points and pipeline.yaml in defining some not entirely related things. Do we have an opportunity to clean this stuff up? Some of the functionality under consideration is:\n\n* defining what a pollster can poll\n* defining what a pollster will poll\n* defining the transformations a pollster will do\n\nKeeping these things as separate as possible is probably a good idea.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"511cb7c8c15addc52d90540e987142ebca636752","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"When ceilometer agent restarts, during initialization it reads the"},{"line_number":38,"context_line":"entry_points and creates and loads all pollster objects corresponding to"},{"line_number":39,"context_line":"meters present in setup.cfg."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"There are disadvantages with this implementation:"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_62829602","line":39,"in_reply_to":"3afb71cf_20d145ce","updated":"2015-06-05 16:16:08.000000000","message":"cdent: I agree with above points, this sounds like refactoring the polling agent to use the pipeline conf to decide which pollster extensions to load and thereby, poll.\n\nI think we can address this in this implementation or address it separately. Am curious to know what other folks think.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"677b84b24152cddb8d785fc93e1d14d21c0d3798","unresolved":false,"context_lines":[{"line_number":71,"context_line":"Next steps for notification agent:"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"3. Existing listeners are stopped to allow for graceful termination."},{"line_number":74,"context_line":"4. Configure new listeners with the changed pipeline configuration."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Next steps for HA notification agent:"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_7d4de998","line":74,"updated":"2015-06-10 17:01:37.000000000","message":"I\u0027m wondering, With the declarative data collection approach we\u0027re looking into, i wonder how this will be impacted. Since we wont really have direct extensions to load any more. All the extensions are loaded dynamically based on yaml definitions.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"03bff6007b12dc98f445556dfc758c9af3226cc8","unresolved":false,"context_lines":[{"line_number":76,"context_line":"Next steps for HA notification agent:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"3. Pipeline listeners(pipeline sink-based internal queue listener) are"},{"line_number":79,"context_line":"   gracefully terminated."},{"line_number":80,"context_line":"4. Pipeline listeners are re-configured with new pipeline."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_38a6b810","line":79,"updated":"2015-06-09 05:13:45.000000000","message":"there\u0027s an additional item we should be wary of. to handle coordination, we create a separate queue for each pipeline. we need to ensure we clear out the pipeline queue before we kill it so we don\u0027t lose datapoints... i don\u0027t know if there\u0027s a way to figure out if queue is empty tbh.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"95e619e9aff2a7ce93707b8d17f4941afe3e3c5c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"Next steps for HA notification agent:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"3. Pipeline listeners(pipeline sink-based internal queue listener) are"},{"line_number":79,"context_line":"   gracefully terminated."},{"line_number":80,"context_line":"4. Pipeline listeners are re-configured with new pipeline."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_61757f62","line":79,"in_reply_to":"3afb71cf_38a6b810","updated":"2015-06-09 16:23:19.000000000","message":"gordc: The oslo listeners have a stop and wait method that can be used for graceful termination, the notification agent already seems to use it (https://github.com/openstack/ceilometer/blob/master/ceilometer/notification.py#L204)\n\nhttps://github.com/openstack/oslo.messaging/blob/master/oslo_messaging/server.py#L124, \nhttps://github.com/openstack/oslo.messaging/blob/master/oslo_messaging/server.py#L135","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"03bff6007b12dc98f445556dfc758c9af3226cc8","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"   This means we\u0027re allowing any kind of error levels due to the fact file"},{"line_number":96,"context_line":"   might be changed for one agent, and not changed for another one in the"},{"line_number":97,"context_line":"   same coordination group."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"2. File polling by separate daemon - Each agent uses a separate daemon"},{"line_number":100,"context_line":"   that polls the pipeline.yaml for changes. On detecting a change, it signals"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_f842603d","line":97,"updated":"2015-06-09 05:13:45.000000000","message":"is this an alternative or just the proposal?","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"677b84b24152cddb8d785fc93e1d14d21c0d3798","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"   This means we\u0027re allowing any kind of error levels due to the fact file"},{"line_number":96,"context_line":"   might be changed for one agent, and not changed for another one in the"},{"line_number":97,"context_line":"   same coordination group."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"2. File polling by separate daemon - Each agent uses a separate daemon"},{"line_number":100,"context_line":"   that polls the pipeline.yaml for changes. On detecting a change, it signals"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_084fd537","line":97,"in_reply_to":"3afb71cf_c1daf34b","updated":"2015-06-10 17:01:37.000000000","message":"Looks like this is same as the proposal. Why not move the pros and cons as part of the proposal above, instead of repeating it here. This is not really an alternative imo.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"95e619e9aff2a7ce93707b8d17f4941afe3e3c5c","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"   This means we\u0027re allowing any kind of error levels due to the fact file"},{"line_number":96,"context_line":"   might be changed for one agent, and not changed for another one in the"},{"line_number":97,"context_line":"   same coordination group."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"2. File polling by separate daemon - Each agent uses a separate daemon"},{"line_number":100,"context_line":"   that polls the pipeline.yaml for changes. On detecting a change, it signals"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_c1daf34b","line":97,"in_reply_to":"3afb71cf_f842603d","updated":"2015-06-09 16:23:19.000000000","message":"Yes, this is the proposal, just listed here to compare the pros/cons with other variants.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ded7be8678a2310f54e3673b2d9b385141e9aa5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"   File synchronization within coordination group is deployer responsibility"},{"line_number":123,"context_line":"   Same as Approach 1"},{"line_number":124,"context_line":"   Using SIGHUP a potential loophole? (since anyone can send a SIGHUP and have"},{"line_number":125,"context_line":"   the agent reload its configuration)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"4. Use automated deployment tools - Puppet, Chef, Ansible to change pipeline"},{"line_number":128,"context_line":"   definitions. While this automates changing pipeline definitions across"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_a0b9b530","line":125,"updated":"2015-06-05 11:02:44.000000000","message":"Is option 3 the same as 2, just without implementing the file polling daemon?","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"511cb7c8c15addc52d90540e987142ebca636752","unresolved":false,"context_lines":[{"line_number":122,"context_line":"   File synchronization within coordination group is deployer responsibility"},{"line_number":123,"context_line":"   Same as Approach 1"},{"line_number":124,"context_line":"   Using SIGHUP a potential loophole? (since anyone can send a SIGHUP and have"},{"line_number":125,"context_line":"   the agent reload its configuration)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"4. Use automated deployment tools - Puppet, Chef, Ansible to change pipeline"},{"line_number":128,"context_line":"   definitions. While this automates changing pipeline definitions across"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_57d19acc","line":125,"in_reply_to":"3afb71cf_a0b9b530","updated":"2015-06-05 16:16:08.000000000","message":"cdent: Yes, almost. The assumption in option 3 is that the config file has changed and the agent needs to be notified to pick up the changes.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"2f5ad040041bf842cb92a1b1aba8bab1b7e9fb64","unresolved":false,"context_lines":[{"line_number":134,"context_line":"   Cons:"},{"line_number":135,"context_line":"   Is looking like the only pure admins approach. Will be more tricky for everyone"},{"line_number":136,"context_line":"   not familiar with these tools (devs, DevOps, etc.)"},{"line_number":137,"context_line":"   Not in ceilometer scope."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"5. Use a combination of 3. and 4 - Use configuration management tool to automate"},{"line_number":140,"context_line":"   the change in pipeline configuration across multiple remote agent nodes. Do"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_e887d9b2","line":137,"updated":"2015-06-10 17:13:07.000000000","message":"Also, giving this alternative another thought. In most cases admin doesnt mind restarting services when there is a config change. So would it make sense to keep the proposed approach out of ceilometer and let dev ops handle it? \n\nI definitely see the appeal of having this. But is it worth adding this complexity into ceilo? this is more a question than anything.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ded7be8678a2310f54e3673b2d9b385141e9aa5","unresolved":false,"context_lines":[{"line_number":150,"context_line":"6. Use oslo.config to reload pipeline config - oslo.config has a method -"},{"line_number":151,"context_line":"   reload_config_files that can reload all config files, so doesnt seem like"},{"line_number":152,"context_line":"   it can reload just one specific file. oslo.config views all of the config files"},{"line_number":153,"context_line":"   as a single data store, so it doesn\u0027t have a way to load just one of them again."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_e068cdbc","line":153,"updated":"2015-06-05 11:02:44.000000000","message":"I think this option can be removed as an alternative as it sounds like it won\u0027t work. I think, too, that it is important to distinguish between files which are oslo config by nature (usually having a .conf extension) and other files, such as pipeline.yaml which are a different sort of beast.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"511cb7c8c15addc52d90540e987142ebca636752","unresolved":false,"context_lines":[{"line_number":150,"context_line":"6. Use oslo.config to reload pipeline config - oslo.config has a method -"},{"line_number":151,"context_line":"   reload_config_files that can reload all config files, so doesnt seem like"},{"line_number":152,"context_line":"   it can reload just one specific file. oslo.config views all of the config files"},{"line_number":153,"context_line":"   as a single data store, so it doesn\u0027t have a way to load just one of them again."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_17dc42e3","line":153,"in_reply_to":"3afb71cf_e068cdbc","updated":"2015-06-05 16:16:08.000000000","message":"Sure, i will remove it.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"677b84b24152cddb8d785fc93e1d14d21c0d3798","unresolved":false,"context_lines":[{"line_number":236,"context_line":"https://review.openstack.org/#/c/119077/ (central and compute agents merge)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"Testing"},{"line_number":239,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"Documentation Impact"},{"line_number":242,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3afb71cf_0899157c","line":239,"updated":"2015-06-10 17:01:37.000000000","message":"Add a few lines about  adding unit tests/functional test coverage here.","commit_id":"799615192a156820aabaf8c4483307744235b0a5"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"57f5d1aed5e65198903a2c94e6ba663b15aed2d8","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"3. Existing listeners are stopped to allow for graceful termination."},{"line_number":80,"context_line":"4. Configure new listeners with the changed pipeline configuration."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Next steps for HA notification agent:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"3. Pipeline listeners(pipeline sink-based internal queue listener) are"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_6b3ac0e8","line":81,"updated":"2015-06-10 19:00:46.000000000","message":"prad: I think there is a separation between this and the declarative notification work since we are just stopping and starting the listeners (as part of reloading the new pipeline) and not trying to load new extensions. So, i think that the change to the way extensions get loaded should not affect the listener restarts.","commit_id":"a53cd5d3255c8abcb5bd5103da1727ce10a8bcb9"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"57f5d1aed5e65198903a2c94e6ba663b15aed2d8","unresolved":false,"context_lines":[{"line_number":139,"context_line":"   Is looking like the only pure admins approach. Will be more tricky for everyone"},{"line_number":140,"context_line":"   not familiar with these tools (devs, DevOps, etc.)"},{"line_number":141,"context_line":"   Not in ceilometer scope."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"4. Use a combination of 2 and 3 - Use configuration management tool to automate"},{"line_number":144,"context_line":"   the change in pipeline configuration across multiple remote agent nodes. Do"},{"line_number":145,"context_line":"   not restart any processes though. Agents on each node poll the pipeline file"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_6baac086","line":142,"updated":"2015-06-10 19:00:46.000000000","message":"prad: This is not really a ceilometer solution. It is a generic solution to address config changes and listed here to cover all the variants. Also, note that Variant 4 derives from this.","commit_id":"a53cd5d3255c8abcb5bd5103da1727ce10a8bcb9"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"441a5a4eb6750840fbbcb2b4f46d3a20590b377e","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"1. Each agent daemon polls local pipeline configuration file"},{"line_number":68,"context_line":"   at configurable interval."},{"line_number":69,"context_line":"2. The agents will reload and validate the configuration."},{"line_number":70,"context_line":"3. If validation succeeds, the new configuration is used."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Next steps for central-agent and compute-agent:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1af86dd1_95ce0259","line":69,"updated":"2015-06-12 08:23:07.000000000","message":"Do you plan some check if file changed for performance?","commit_id":"db876a8f111f25e3445ee4c0686b4b70d589c3a1"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"441a5a4eb6750840fbbcb2b4f46d3a20590b377e","unresolved":false,"context_lines":[{"line_number":69,"context_line":"2. The agents will reload and validate the configuration."},{"line_number":70,"context_line":"3. If validation succeeds, the new configuration is used."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Next steps for central-agent and compute-agent:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"3. For polling agent, determine which pollsters are needed based on new"},{"line_number":75,"context_line":"   configuration and need to run at what frequency (polling interval)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1af86dd1_551d2abc","line":72,"updated":"2015-06-12 08:23:07.000000000","message":"You can add ipmi-agent here, which run on compute node to poll IPMI data.","commit_id":"db876a8f111f25e3445ee4c0686b4b70d589c3a1"},{"author":{"_account_id":13560,"name":"Rohit Jaiswal","email":"rohit.jaiswal@gmail.com","username":"rjaiswal"},"change_message_id":"ddd919353046e627d2fbefa54a41edee938d7289","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"1. Each agent daemon polls local pipeline configuration file"},{"line_number":68,"context_line":"   at configurable interval."},{"line_number":69,"context_line":"2. The agents will reload and validate the configuration."},{"line_number":70,"context_line":"3. If validation succeeds, the new configuration is used."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Next steps for central-agent, compute-agent and ipmi-agent:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1af86dd1_238dcb31","line":69,"updated":"2015-06-12 15:10:43.000000000","message":"@gzhai: Yes, the plan is to find the last modified time of the file to check if it was modified followed by hashing the file contents and compare with the last recorded hash to determine if there was a change. Then the file contents are read and validated for yaml well-formed-ness and validity of sources/sinks before using it further.","commit_id":"af77707be7fce45972f0903b25ebb0dc9d6ef8c4"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"a0b39bb063e784b349a14517c8b1a1aab6d63527","unresolved":false,"context_lines":[{"line_number":214,"context_line":"Work Items"},{"line_number":215,"context_line":"----------"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"- Implement timer to poll pipeline configuration file"},{"line_number":218,"context_line":"- Implement graceful termination of pollsters and listeners"},{"line_number":219,"context_line":"- Implement reconfiguring and reloading of pollsters in polling-agent"},{"line_number":220,"context_line":"- Implement reconfiguring and reloading of listeners in notification-agent"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_a8d706be","line":217,"updated":"2015-06-16 08:48:15.000000000","message":"do you want to implement a separated timer to detect the configuration file ? how about poll it before polling pollsters ? I mean like this implementation[1]\n\n[1] https://review.openstack.org/#/c/140232/5/ceilometer/agent/base.py","commit_id":"af77707be7fce45972f0903b25ebb0dc9d6ef8c4"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"bdd1074d09a6bc461a0cd99a59c9b837ab7016ed","unresolved":false,"context_lines":[{"line_number":214,"context_line":"Work Items"},{"line_number":215,"context_line":"----------"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"- Implement timer to poll pipeline configuration file"},{"line_number":218,"context_line":"- Implement graceful termination of pollsters and listeners"},{"line_number":219,"context_line":"- Implement reconfiguring and reloading of pollsters in polling-agent"},{"line_number":220,"context_line":"- Implement reconfiguring and reloading of listeners in notification-agent"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_63511fd8","line":217,"in_reply_to":"fa32b979_a8d706be","updated":"2015-06-16 08:56:15.000000000","message":"liusheng, i think there needs to be a separate timer for notification agent case.","commit_id":"af77707be7fce45972f0903b25ebb0dc9d6ef8c4"}]}
