)]}'
{"CHANGELOG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8a300347723dbf0ebdcbe1859ad42dddef4acf59","unresolved":false,"context_lines":[{"line_number":1,"context_line":"swift (2.10.1, stable release update)"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"    * Closed a bug where ssync may have written bad fragment data in"},{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_438e5028","line":5,"range":{"start_line":4,"start_character":26,"end_line":5,"end_character":68},"updated":"2016-11-21 20:13:27.000000000","message":"I can see that being necessary, but was it sufficient? What about bit-flips in transit? Shouldn\u0027t we be verifying etags?\n\nOr are we just going to rely on the validate-on-read behavior? Wouldn\u0027t it be better not to wait?","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":1,"context_line":"swift (2.10.1, stable release update)"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"    * Closed a bug where ssync may have written bad fragment data in"},{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_41534517","line":5,"range":{"start_line":4,"start_character":26,"end_line":5,"end_character":68},"in_reply_to":"5a74a57a_3a16b0a7","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":1,"context_line":"swift (2.10.1, stable release update)"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"    * Closed a bug where ssync may have written bad fragment data in"},{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_6154c1fd","line":5,"range":{"start_line":4,"start_character":26,"end_line":5,"end_character":68},"in_reply_to":"7a77a97e_438e5028","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c270a11d2f586d745a11b25d954757c478c95a20","unresolved":false,"context_lines":[{"line_number":1,"context_line":"swift (2.10.1, stable release update)"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"    * Closed a bug where ssync may have written bad fragment data in"},{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"5a74a57a_3a16b0a7","line":5,"range":{"start_line":4,"start_character":26,"end_line":5,"end_character":68},"in_reply_to":"7a77a97e_438e5028","updated":"2016-11-24 10:03:41.000000000","message":"Yes we should check etags but that requires a non-trivial change to support footers or similar [1]\n\nI think this wording is ok, it claims to close *a* bug, not *all* bugs.\n\n[1] https://bugs.launchpad.net/swift/+bug/1632839","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c270a11d2f586d745a11b25d954757c478c95a20","unresolved":false,"context_lines":[{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * Fixed a rare infinite loop in `swift-ring-builder` while placing parts."},{"line_number":10,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"5a74a57a_95e877e4","line":7,"updated":"2016-11-24 10:03:41.000000000","message":"nit: strictly speaking, the auditor doesn\u0027t make a request in the http sense, which is the sense we mostly use \"request\". s/on read requests/when read/","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":4,"context_line":"      some circumstances. A check was added to ensure the correct number"},{"line_number":5,"context_line":"      of bytes is written for a fragment before finalizing the write."},{"line_number":6,"context_line":"      Also, erasure coded fragment metadata will now be validated on read"},{"line_number":7,"context_line":"      requests and, if bad data is found, the fragment will be quarantined."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * Fixed a rare infinite loop in `swift-ring-builder` while placing parts."},{"line_number":10,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_214e496f","line":7,"in_reply_to":"5a74a57a_95e877e4","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c270a11d2f586d745a11b25d954757c478c95a20","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * Fixed a rare infinite loop in `swift-ring-builder` while placing parts."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"5a74a57a_d5baef22","line":11,"updated":"2016-11-24 10:03:41.000000000","message":"nit: it\u0027s not suppressed (which to me implies it occurs but is silently ignored). The KeyError in question no longer gets raised. So s/Suppressed/Fixed/ maybe?","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * Fixed a rare infinite loop in `swift-ring-builder` while placing parts."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_a142593c","line":11,"in_reply_to":"5a74a57a_d5baef22","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8a300347723dbf0ebdcbe1859ad42dddef4acf59","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_03f1b8cd","line":14,"updated":"2016-11-21 20:13:27.000000000","message":"...we probably should have put something like this in drive-audit.conf-sample. Oh well.","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_21756997","line":14,"in_reply_to":"7a77a97e_03f1b8cd","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":16896,"name":"Ondřej Nový","email":"novy@ondrej.org","username":"onovy"},"change_message_id":"ee680d2231785f315bd2da37c2b28574bf0a6233","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_ae10eba9","line":14,"in_reply_to":"7a77a97e_03f1b8cd","updated":"2016-11-21 20:36:08.000000000","message":"oh well\u003d\nhttps://github.com/openstack/swift/blob/stable/newton/etc/drive-audit.conf-sample#L2\n?","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_0146ad4e","line":14,"in_reply_to":"7a77a97e_ae10eba9","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a856a077876b05159dc8610c31449c0f85ecdeb0","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_ee082330","line":14,"in_reply_to":"7a77a97e_ae10eba9","updated":"2016-11-21 20:45:33.000000000","message":"Sorry, I meant the description. Something like\n\n\u003e This is used to set the owner of the drive-audit recon cache.\n\nWe could still totally add it to master. Not sure it\u0027d be worth the extra commit to get it on stable.\n\nReally, I should have brought this up during either of the two reviews that added it, but I wasn\u0027t thinking.","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * Suppressed the KeyError message when auditor finds an expired object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    * Added a \"user\" option to the drive-audit config file. Its value is"},{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_e148d15e","line":14,"in_reply_to":"7a77a97e_ee082330","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8a300347723dbf0ebdcbe1859ad42dddef4acf59","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_83594891","line":17,"updated":"2016-11-21 20:13:27.000000000","message":"Maybe worth calling out why this was necessary? \"This will prevent excessive IO when...\"","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      used to set the owner of the drive-audit recon cache."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    * Throttle update_auditor_status calls so it updates no more than once"},{"line_number":17,"context_line":"      per minute."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_417a6589","line":17,"in_reply_to":"7a77a97e_83594891","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8a300347723dbf0ebdcbe1859ad42dddef4acf59","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    * Added a configurable URL base to staticweb."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"swift (2.10.0, OpenStack Newton)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_439490e7","line":21,"updated":"2016-11-21 20:13:27.000000000","message":"Again, maybe worth calling out why this was necessary. Currently, this kinda reads as though it\u0027s a new feature, rather than providing a way to address a bug encountered in the wild.","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    * Added a configurable URL base to staticweb."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"swift (2.10.0, OpenStack Newton)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_219c89bf","line":21,"in_reply_to":"7a77a97e_439490e7","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@redhat.com","username":"cschwede"},"change_message_id":"41c455baf6733a11657354fdd7230c8adfa789d7","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    * Added a configurable URL base to staticweb."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"swift (2.10.0, OpenStack Newton)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"7a77a97e_7236a3b5","line":21,"in_reply_to":"7a77a97e_439490e7","updated":"2016-11-22 08:30:04.000000000","message":"I agree; it would be nice if this and the \"Throttle...\" entry above are a bit more detailed. Or at least marking these as \"Fixed bugs\"? Granted, nearly everything in this changelog is a fixed bug...","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"edd5b42e5edec33bfa22f6acf504145407b5b209","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    * Daemons using InternalClient can now be properly killed with SIGTERM."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    * Added a configurable URL base to staticweb."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"swift (2.10.0, OpenStack Newton)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"3a71b18c_015dcd14","line":21,"in_reply_to":"7a77a97e_7236a3b5","updated":"2016-12-10 00:43:48.000000000","message":"Done","commit_id":"9fbf0f1fe57f36904cbaeb742cb7413033926e8a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"75f3682dd4f59eebac6e187948ac9773c0cca899","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      replication of this partition runs, replication of suffix is completed"},{"line_number":13,"context_line":"      on first and each 10th run of replicator. Rsync runs on each new"},{"line_number":14,"context_line":"      suffix because destination does not return hash of new suffix although"},{"line_number":15,"context_line":"      suffix content is in the same state. This bug was introduced in 2.7.0"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * Fixed non-deterministic suffix updates in hashes.pkl where a partition"},{"line_number":18,"context_line":"      may be updated much less often than expected."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"3a71b18c_1d8ee92d","line":15,"updated":"2016-12-12 11:50:07.000000000","message":"Much of this describes the bug but using present tense so there is a danger that it is read as a description of how things now work. Further, the statement \"replication of suffix is completed on first and each 10th run of replicator\" wasn\u0027t true.\n\nSuggestion:\n\n\"Fixed regression in consolidate_hashes that occured when a new file was stored to new suffix to a not empty partition. This bug was introduced in 2.7.0 and could cause an increase in rsync replication stats during and after upgrade, due to inconsistent hashing of partition suffixes.\"","commit_id":"61495afdc736a816cd6045202c9d429f5af459ed"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"42aed658043838d70ad13151a96d9608ed67a3f0","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      replication of this partition runs, replication of suffix is completed"},{"line_number":13,"context_line":"      on first and each 10th run of replicator. Rsync runs on each new"},{"line_number":14,"context_line":"      suffix because destination does not return hash of new suffix although"},{"line_number":15,"context_line":"      suffix content is in the same state. This bug was introduced in 2.7.0"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    * Fixed non-deterministic suffix updates in hashes.pkl where a partition"},{"line_number":18,"context_line":"      may be updated much less often than expected."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"1a6eadb0_5fac7eed","line":15,"in_reply_to":"3a71b18c_1d8ee92d","updated":"2016-12-12 17:38:12.000000000","message":"Done","commit_id":"61495afdc736a816cd6045202c9d429f5af459ed"}]}
