)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05ce196d30d82cad1a09efdd1e8f786b388346a8","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Instead of just storing our event data indexed by the composite"},{"line_number":14,"context_line":"event key, we should just store the name and tag distinctly so"},{"line_number":15,"context_line":"that there is no question about now to dissect the two from the"},{"line_number":16,"context_line":"key later. This is all internal record-keeping inside of the"},{"line_number":17,"context_line":"compute manager, so we can change it to whatever we want."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bf659307_462e73fb","line":15,"range":{"start_line":15,"start_character":32,"end_line":15,"end_character":35},"updated":"2018-04-02 19:20:15.000000000","message":"how","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"}],"nova/compute/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b3744f35851f3d45d8c5a8c39ffefdfe28496e72","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                          \u0027instance %(instance_uuid)s\u0027,"},{"line_number":404,"context_line":"                          {\u0027event\u0027: event_name,"},{"line_number":405,"context_line":"                           \u0027instance_uuid\u0027: instance_uuid})"},{"line_number":406,"context_line":"                name, tag \u003d objects.InstanceExternalEvent.parse_key(event_name)"},{"line_number":407,"context_line":"                event \u003d objects.InstanceExternalEvent("},{"line_number":408,"context_line":"                    instance_uuid\u003dinstance_uuid,"},{"line_number":409,"context_line":"                    name\u003dname, status\u003d\u0027failed\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_d7f7938a","line":406,"updated":"2018-04-02 13:58:52.000000000","message":"IMHO, depending on known-keys isn\u0027t the best plan. We can change the information we store here at will, so why not just store the name and tag as a tuple instead of smashed together? Then we can cleanly always cancel.","commit_id":"9888eaf87b2d4eb860cd2fe5d473a38e5db5ed8b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea27b948fd3a48ee63ba68b3a25d6d7251969586","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                          \u0027instance %(instance_uuid)s\u0027,"},{"line_number":404,"context_line":"                          {\u0027event\u0027: event_name,"},{"line_number":405,"context_line":"                           \u0027instance_uuid\u0027: instance_uuid})"},{"line_number":406,"context_line":"                name, tag \u003d objects.InstanceExternalEvent.parse_key(event_name)"},{"line_number":407,"context_line":"                event \u003d objects.InstanceExternalEvent("},{"line_number":408,"context_line":"                    instance_uuid\u003dinstance_uuid,"},{"line_number":409,"context_line":"                    name\u003dname, status\u003d\u0027failed\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_6b2ee292","line":406,"in_reply_to":"bf659307_3a791693","updated":"2018-04-02 17:09:07.000000000","message":"No, we\u0027re processing an internally-stashed structure of data here. It looks like this:\n\n {\u0027$instance_uuid\u0027: (\u0027network-vif-plugged-$uuid\u0027, eventlet.Event())}\n\nWhen we get the objects.InstanceExternalEvent over RPC, we look up the corresponding eventlet event and .send() the object event to the waiting thread. In this cancel method, we\u0027re basically making up fake event objects so that we can set their status to \u0027failed\u0027 and send those to the waiting threads as if neutron was sending a failed event via the API.\n\nSo, there\u0027s no RPC here, this is all internal-to-compute data structure stuff (self._events from line 396)","commit_id":"9888eaf87b2d4eb860cd2fe5d473a38e5db5ed8b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6773d836c2b5547bfbae12811c344a59dfbfdcb8","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                          \u0027instance %(instance_uuid)s\u0027,"},{"line_number":404,"context_line":"                          {\u0027event\u0027: event_name,"},{"line_number":405,"context_line":"                           \u0027instance_uuid\u0027: instance_uuid})"},{"line_number":406,"context_line":"                name, tag \u003d objects.InstanceExternalEvent.parse_key(event_name)"},{"line_number":407,"context_line":"                event \u003d objects.InstanceExternalEvent("},{"line_number":408,"context_line":"                    instance_uuid\u003dinstance_uuid,"},{"line_number":409,"context_line":"                    name\u003dname, status\u003d\u0027failed\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_3a791693","line":406,"in_reply_to":"bf659307_d7f7938a","updated":"2018-04-02 14:29:56.000000000","message":"Wouldn\u0027t that involve a change in the over-the-wire format of the InstanceExternalEvent object?","commit_id":"9888eaf87b2d4eb860cd2fe5d473a38e5db5ed8b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05ce196d30d82cad1a09efdd1e8f786b388346a8","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            # NOTE(danms): We have historically returned the raw internal"},{"line_number":391,"context_line":"            # format here, which is {event.key: [events, ...])} so just"},{"line_number":392,"context_line":"            # trivially convert it here."},{"line_number":393,"context_line":"            return {\u0027%s-%s\u0027 % k: e"},{"line_number":394,"context_line":"                    for k, e in self._events.pop(instance.uuid, {}).items()}"},{"line_number":395,"context_line":"        return _clear_events()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_c6dda3e0","line":393,"range":{"start_line":393,"start_character":20,"end_line":393,"end_character":27},"updated":"2018-04-02 19:20:15.000000000","message":"Assuming the thing about None is copacetic, doesn\u0027t this result in a behavior change?  What would previously return \u0027event-name\u0027 will now return \u0027event-name-None\u0027?\n\n(Do we care?)","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be2da14f164dded505530fd2a37d0ab1859eeb33","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            # NOTE(danms): We have historically returned the raw internal"},{"line_number":391,"context_line":"            # format here, which is {event.key: [events, ...])} so just"},{"line_number":392,"context_line":"            # trivially convert it here."},{"line_number":393,"context_line":"            return {\u0027%s-%s\u0027 % k: e"},{"line_number":394,"context_line":"                    for k, e in self._events.pop(instance.uuid, {}).items()}"},{"line_number":395,"context_line":"        return _clear_events()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_210b2924","line":393,"range":{"start_line":393,"start_character":20,"end_line":393,"end_character":27},"in_reply_to":"bf659307_c6dda3e0","updated":"2018-04-02 19:44:46.000000000","message":"It\u0027s only used in a log message below, so I think it\u0027s fine. It actually took me a sec to remember that the tag was optional when I was reading tests that didn\u0027t provide one. Those also used names with dashes which would mean things could interpret that as name\u003d\"network-vif\",tag\u003d\"plugged\" so I think logging -None is actually probably more clear.","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05ce196d30d82cad1a09efdd1e8f786b388346a8","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        :param instance: The instance for which an event is expected"},{"line_number":452,"context_line":"        :param event_names: A list of event names. Each element is a"},{"line_number":453,"context_line":"                            tuple of strings to indicate (name, tag),"},{"line_number":454,"context_line":"                            where name is required, but tag may be None."},{"line_number":455,"context_line":"        :param deadline: Maximum number of seconds we should wait for all"},{"line_number":456,"context_line":"                         of the specified events to arrive."},{"line_number":457,"context_line":"        :param error_callback: A function to be called if an event arrives"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_86756bfc","line":454,"range":{"start_line":454,"start_character":67,"end_line":454,"end_character":71},"updated":"2018-04-02 19:20:15.000000000","message":"oh?","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be2da14f164dded505530fd2a37d0ab1859eeb33","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        :param instance: The instance for which an event is expected"},{"line_number":452,"context_line":"        :param event_names: A list of event names. Each element is a"},{"line_number":453,"context_line":"                            tuple of strings to indicate (name, tag),"},{"line_number":454,"context_line":"                            where name is required, but tag may be None."},{"line_number":455,"context_line":"        :param deadline: Maximum number of seconds we should wait for all"},{"line_number":456,"context_line":"                         of the specified events to arrive."},{"line_number":457,"context_line":"        :param error_callback: A function to be called if an event arrives"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_412bbd81","line":454,"range":{"start_line":454,"start_character":67,"end_line":454,"end_character":71},"in_reply_to":"bf659307_86756bfc","updated":"2018-04-02 19:44:46.000000000","message":"Yeah, it allowed this before if you provided None there, and implied it if you had no tag in the event name if you passed it as a string.","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ec937261d95e0cb88b71bc1b9cc2b70acca1e33a","unresolved":false,"context_lines":[{"line_number":365,"context_line":"            return None"},{"line_number":366,"context_line":"        elif result is no_matching_event_sentinel:"},{"line_number":367,"context_line":"            LOG.debug(\u0027No event matching %(event)s in %(events)s\u0027,"},{"line_number":368,"context_line":"                      {\u0027event\u0027: event.key,"},{"line_number":369,"context_line":"                       \u0027events\u0027: self._events.get(instance.uuid, {}).keys()},"},{"line_number":370,"context_line":"                      instance\u003dinstance)"},{"line_number":371,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_0c67b553","line":368,"range":{"start_line":368,"start_character":32,"end_line":368,"end_character":41},"updated":"2018-04-09 15:10:18.000000000","message":"Update this?","commit_id":"d9369d034cb0694def2510885ddfb9b039cbad49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8c6d53ab465a61afede6daec9ee1eedef604c6ab","unresolved":false,"context_lines":[{"line_number":365,"context_line":"            return None"},{"line_number":366,"context_line":"        elif result is no_matching_event_sentinel:"},{"line_number":367,"context_line":"            LOG.debug(\u0027No event matching %(event)s in %(events)s\u0027,"},{"line_number":368,"context_line":"                      {\u0027event\u0027: event.key,"},{"line_number":369,"context_line":"                       \u0027events\u0027: self._events.get(instance.uuid, {}).keys()},"},{"line_number":370,"context_line":"                      instance\u003dinstance)"},{"line_number":371,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_af331813","line":368,"range":{"start_line":368,"start_character":32,"end_line":368,"end_character":41},"in_reply_to":"bf659307_0c67b553","updated":"2018-04-09 17:34:55.000000000","message":"Although just for simple logging, the key property is probably sufficient:\n\n    @staticmethod\n    def make_key(name, tag\u003dNone):\n        if tag is not None:\n            return \u0027%s-%s\u0027 % (name, tag)\n        else:\n            return name\n\n    @property\n    def key(self):\n        return self.make_key(self.name, self.tag)","commit_id":"d9369d034cb0694def2510885ddfb9b039cbad49"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ec937261d95e0cb88b71bc1b9cc2b70acca1e33a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            # NOTE(danms): We have historically returned the raw internal"},{"line_number":391,"context_line":"            # format here, which is {event.key: [events, ...])} so just"},{"line_number":392,"context_line":"            # trivially convert it here."},{"line_number":393,"context_line":"            return {\u0027%s-%s\u0027 % k: e"},{"line_number":394,"context_line":"                    for k, e in self._events.pop(instance.uuid, {}).items()}"},{"line_number":395,"context_line":"        return _clear_events()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_0c50155e","line":393,"range":{"start_line":393,"start_character":20,"end_line":393,"end_character":31},"updated":"2018-04-09 15:10:18.000000000","message":"A little confusing but k is the (name, tag) tuple so it makes sense.","commit_id":"d9369d034cb0694def2510885ddfb9b039cbad49"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"45f308322015b5744d3d7d8db52b416368517e0f","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            # NOTE(danms): We have historically returned the raw internal"},{"line_number":391,"context_line":"            # format here, which is {event.key: [events, ...])} so just"},{"line_number":392,"context_line":"            # trivially convert it here."},{"line_number":393,"context_line":"            return {\u0027%s-%s\u0027 % k: e"},{"line_number":394,"context_line":"                    for k, e in self._events.pop(instance.uuid, {}).items()}"},{"line_number":395,"context_line":"        return _clear_events()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_f22fb385","line":393,"range":{"start_line":393,"start_character":20,"end_line":393,"end_character":31},"in_reply_to":"bf659307_0c50155e","updated":"2018-04-09 17:41:20.000000000","message":"FWIW, I went off into the weeds on this one too.","commit_id":"d9369d034cb0694def2510885ddfb9b039cbad49"}],"nova/objects/external_event.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a3c2d6d6bc734d3c0e8bb7c243784244f1506f5a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        for known_name in EVENT_NAMES:"},{"line_number":65,"context_line":"            if event_key.startswith(known_name):"},{"line_number":66,"context_line":"                return known_name, event_key.lstrip(known_name)"},{"line_number":67,"context_line":"        # Just take a best guess and hope the tag doesn\u0027t have dashes."},{"line_number":68,"context_line":"        return tuple(event_key.rsplit(\u0027-\u0027, 1))"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf659307_d18fadca","line":66,"range":{"start_line":66,"start_character":35,"end_line":66,"end_character":63},"updated":"2018-03-31 22:23:38.000000000","message":"If known_name doesn\u0027t end with a dash, but the event_key was dash-joined, this will start with a dash, which doesn\u0027t look like a backward-compatible change.\n\n[Later] Oh, snap, I know why this is working.\n\nS.lstrip([chars]) -\u003e string or unicode\n\nReturn a copy of the string S with leading whitespace removed.\nIf chars is given and not None, remove characters in chars instead.\nIf chars is unicode, S will be converted to unicode before stripping\n\nSo it\u0027s only because all the strings in EVENT_NAMES all happen to have hyphens that this will work.  Probably not what you intended.","commit_id":"d556381b462435e51846f204bca20b799ec0ed67"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1db86c4f290c36f5d5d71d7e3f6b254d28ac4896","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        for known_name in EVENT_NAMES:"},{"line_number":65,"context_line":"            if event_key.startswith(known_name):"},{"line_number":66,"context_line":"                return known_name, event_key.lstrip(known_name)"},{"line_number":67,"context_line":"        # Just take a best guess and hope the tag doesn\u0027t have dashes."},{"line_number":68,"context_line":"        return tuple(event_key.rsplit(\u0027-\u0027, 1))"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf659307_2211f952","line":66,"range":{"start_line":66,"start_character":35,"end_line":66,"end_character":63},"in_reply_to":"bf659307_2c7c921d","updated":"2018-04-01 14:01:35.000000000","message":"Yeah, didn\u0027t realize chars was each character in there, thought it was just a prefix string, which sucks.","commit_id":"d556381b462435e51846f204bca20b799ec0ed67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebdb3b42bc5170f601672fb2d9f2b2190ff0042d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        for known_name in EVENT_NAMES:"},{"line_number":65,"context_line":"            if event_key.startswith(known_name):"},{"line_number":66,"context_line":"                return known_name, event_key.lstrip(known_name)"},{"line_number":67,"context_line":"        # Just take a best guess and hope the tag doesn\u0027t have dashes."},{"line_number":68,"context_line":"        return tuple(event_key.rsplit(\u0027-\u0027, 1))"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf659307_2c7c921d","line":66,"range":{"start_line":66,"start_character":35,"end_line":66,"end_character":63},"in_reply_to":"bf659307_d18fadca","updated":"2018-04-01 01:00:36.000000000","message":"AHA, here\u0027s a case where it broke, because the UUID started with \u0027f\u0027, which is *also* in \u0027network-vif-unplugged\u0027.\n\nhttp://logs.openstack.org/59/558059/1/check/openstack-tox-py35/e1aade6/testr_results.html.gz","commit_id":"d556381b462435e51846f204bca20b799ec0ed67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"417140ba4560ee1b58fa6e030fd7b76480829bf2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                # split will return a 2-item list where the first is an empty"},{"line_number":67,"context_line":"                # string and the second is the tag (uuid) but prefixed with the"},{"line_number":68,"context_line":"                # dash separator from make_key, so we need to start at index 1"},{"line_number":69,"context_line":"                return known_name, event_key.split(known_name)[1][1:]"},{"line_number":70,"context_line":"        # Just take a best guess and hope the tag doesn\u0027t have dashes."},{"line_number":71,"context_line":"        return tuple(event_key.rsplit(\u0027-\u0027, 1))"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_62e931b5","line":69,"updated":"2018-04-01 15:39:25.000000000","message":"This is aight, taking the chance that known_name doesn\u0027t appear in the tag.  Other things that would work:\n\n event_key.replace(known_name + \u0027-\u0027, \u0027\u0027, 1)\n\n event_key[len(known_name)+1:]","commit_id":"9888eaf87b2d4eb860cd2fe5d473a38e5db5ed8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2387f1be5a37440b0698d18b59917ec546993290","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                # split will return a 2-item list where the first is an empty"},{"line_number":67,"context_line":"                # string and the second is the tag (uuid) but prefixed with the"},{"line_number":68,"context_line":"                # dash separator from make_key, so we need to start at index 1"},{"line_number":69,"context_line":"                return known_name, event_key.split(known_name)[1][1:]"},{"line_number":70,"context_line":"        # Just take a best guess and hope the tag doesn\u0027t have dashes."},{"line_number":71,"context_line":"        return tuple(event_key.rsplit(\u0027-\u0027, 1))"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_b0f7908b","line":69,"in_reply_to":"bf659307_62e931b5","updated":"2018-04-01 22:20:00.000000000","message":"Yeah I thought about event_key[len(known_name)+1:] but...meh. This has been broken since kilo so apparently this isn\u0027t that big of a deal, and we know what these event names are pretty much.","commit_id":"9888eaf87b2d4eb860cd2fe5d473a38e5db5ed8b"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05ce196d30d82cad1a09efdd1e8f786b388346a8","unresolved":false,"context_lines":[{"line_number":2594,"context_line":"        inst_obj \u003d objects.Instance(uuid\u003duuids.instance)"},{"line_number":2595,"context_line":"        result \u003d self.compute.instance_events.clear_events_for_instance("},{"line_number":2596,"context_line":"            inst_obj)"},{"line_number":2597,"context_line":"        self.assertEqual(result, {\u0027test-event-None\u0027: event})"},{"line_number":2598,"context_line":"        lock_name_mock.assert_called_once_with(inst_obj)"},{"line_number":2599,"context_line":""},{"line_number":2600,"context_line":"    def test_instance_events_lock_name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_e653076a","line":2597,"range":{"start_line":2597,"start_character":34,"end_line":2597,"end_character":51},"updated":"2018-04-02 19:20:15.000000000","message":"This is a behavior change.","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be2da14f164dded505530fd2a37d0ab1859eeb33","unresolved":false,"context_lines":[{"line_number":2594,"context_line":"        inst_obj \u003d objects.Instance(uuid\u003duuids.instance)"},{"line_number":2595,"context_line":"        result \u003d self.compute.instance_events.clear_events_for_instance("},{"line_number":2596,"context_line":"            inst_obj)"},{"line_number":2597,"context_line":"        self.assertEqual(result, {\u0027test-event-None\u0027: event})"},{"line_number":2598,"context_line":"        lock_name_mock.assert_called_once_with(inst_obj)"},{"line_number":2599,"context_line":""},{"line_number":2600,"context_line":"    def test_instance_events_lock_name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_212489ae","line":2597,"range":{"start_line":2597,"start_character":34,"end_line":2597,"end_character":51},"in_reply_to":"bf659307_e653076a","updated":"2018-04-02 19:44:46.000000000","message":"Um yes, but.. so? We use the result in precisely one place.. for logging.","commit_id":"a04b371087ae44c2c1a028d5299c42d6862fbd22"}]}
