)]}'
{"id":"openstack%2Fpython-keystoneclient~238001","triplet_id":"openstack%2Fpython-keystoneclient~master~I493199164694a17319a47525647a574363342fe6","project":"openstack/python-keystoneclient","branch":"master","topic":"bug/1508424","hashtags":[],"change_id":"I493199164694a17319a47525647a574363342fe6","subject":"Fix token lock race condition","status":"ABANDONED","created":"2015-10-21 11:42:31.000000000","updated":"2015-10-22 05:53:57.000000000","total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"meta_rev_id":"6222657238fc7c26c3bcea63c18e870859e57e7d","_number":238001,"virtual_id_number":238001,"owner":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"actions":{},"labels":{"Verified":{"recommended":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"all":[{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},{"value":1,"date":"2015-10-21 13:25:52.000000000","_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":1,"default_value":0,"optional":true},"Code-Review":{"approved":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"recommended":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"disliked":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":3,"name":"Jenkins","username":"jenkins"},{"value":2,"date":"2015-10-21 13:41:08.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},{"value":1,"date":"2015-10-21 13:14:48.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},{"value":-1,"date":"2015-10-21 15:00:56.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},{"value":-1,"date":"2015-10-21 18:16:06.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},{"value":-1,"date":"2015-10-21 14:10:02.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","value":-1,"default_value":0,"optional":true},"Workflow":{"rejected":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"all":[{"date":"2015-10-21 13:38:56.000000000","_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},{"value":-1,"date":"2015-10-22 05:53:26.000000000","permitted_voting_range":{"min":-1,"max":0},"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2015-10-21 11:47:09.000000000","updated_by":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"reviewer":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"state":"REVIEWER"},{"updated":"2015-10-21 11:47:17.000000000","updated_by":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"reviewer":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"state":"REVIEWER"},{"updated":"2015-10-21 13:14:48.000000000","updated_by":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"reviewer":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"state":"REVIEWER"},{"updated":"2015-10-21 13:25:52.000000000","updated_by":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"reviewer":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"state":"REVIEWER"},{"updated":"2015-10-21 13:38:56.000000000","updated_by":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"reviewer":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"state":"REVIEWER"},{"updated":"2015-10-21 13:41:08.000000000","updated_by":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"reviewer":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"state":"REVIEWER"},{"updated":"2015-10-21 14:10:02.000000000","updated_by":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"reviewer":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"state":"REVIEWER"},{"updated":"2015-10-21 15:00:56.000000000","updated_by":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"reviewer":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"state":"REVIEWER"},{"updated":"2015-10-21 18:16:06.000000000","updated_by":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"reviewer":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"state":"REVIEWER"}],"messages":[{"id":"8b0b756d4b18c963111f76dc8cc6fcfbbb1203e1","author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"date":"2015-10-21 11:42:31.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"590868449c996f3b25de6f5f496ffb25338cbc91","author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"date":"2015-10-21 12:07:00.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"a3f50de07b79528ef3305f7876138284b6c7dbc6","author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"date":"2015-10-21 13:14:48.000000000","message":"Patch Set 2: Code-Review+1","accounts_in_message":[],"_revision_number":2},{"id":"a6dcb7376dd5d2b30f2c4a310fcba1a5d66d893a","author":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"date":"2015-10-21 13:25:52.000000000","message":"Patch Set 2: Verified+1\n\nBuild succeeded (check pipeline).\n\n- gate-python-keystoneclient-python26 http://logs.openstack.org/01/238001/2/check/gate-python-keystoneclient-python26/8798b6b/ : SUCCESS in 2m 14s\n- gate-python-keystoneclient-pep8 http://logs.openstack.org/01/238001/2/check/gate-python-keystoneclient-pep8/3b3d8bc/ : SUCCESS in 2m 27s\n- gate-python-keystoneclient-docs http://docs-draft.openstack.org/01/238001/2/check/gate-python-keystoneclient-docs/f32f2eb//doc/build/html/ : SUCCESS in 3m 05s\n- gate-python-keystoneclient-python27 http://logs.openstack.org/01/238001/2/check/gate-python-keystoneclient-python27/5a2d43c/ : SUCCESS in 2m 57s\n- gate-python-keystoneclient-python34 http://logs.openstack.org/01/238001/2/check/gate-python-keystoneclient-python34/1ac2dfc/ : SUCCESS in 3m 10s\n- gate-tempest-dsvm-neutron-src-python-keystoneclient http://logs.openstack.org/01/238001/2/check/gate-tempest-dsvm-neutron-src-python-keystoneclient/067e796/ : SUCCESS in 1h 18m 41s\n- gate-keystoneclient-dsvm-functional http://logs.openstack.org/01/238001/2/check/gate-keystoneclient-dsvm-functional/893b909/ : SUCCESS in 21m 38s\n- gate-python-keystoneclient-tox-bandit http://logs.openstack.org/01/238001/2/check/gate-python-keystoneclient-tox-bandit/0042160/ : SUCCESS in 2m 35s","accounts_in_message":[],"_revision_number":2},{"id":"6db013fea514e4977afd4560be9d16e38eaf72c5","author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"date":"2015-10-21 13:41:08.000000000","message":"Patch Set 2: Code-Review+2\n\nThis makes sense based on the lock usage in get_access(), but I\u0027m also wondering if the BaseIdentityPlugin is simply misbehaving in the first place? It seems it should release it\u0027s lock before re-authenticating.","accounts_in_message":[],"_revision_number":2},{"id":"54149334c2dd6bbc40c02edbbf3d91a739c5e9b2","author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"date":"2015-10-21 14:10:02.000000000","message":"Patch Set 2: Code-Review-1\n\nI\u0027m not sure about this. This change makes the lock reentrant, but is that what we really want? Does this mean the auth posts may happen multiple times now?\n\nIMO it would make more sense to see what actually caused this new recursion and fix that.","accounts_in_message":[],"_revision_number":2},{"id":"5fe4a3a3acfafcfc6d26f0beab597ea6866177be","author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"date":"2015-10-21 15:00:56.000000000","message":"Patch Set 2: Code-Review-1\n\nThis needs a unit test.","accounts_in_message":[],"_revision_number":2},{"id":"7fa5c6b5c25466a4bc445e9ba073175cf04b78b1","author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"date":"2015-10-21 15:48:30.000000000","message":"Patch Set 2:\n\nBrant: I don\u0027t think it\u0027s fair to demand tests here when you didn\u0027t require any here: https://review.openstack.org/#/c/221738/","accounts_in_message":[],"_revision_number":2},{"id":"7af7f5f39fdba2cea829875299178feaf11abae4","author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"date":"2015-10-21 18:03:16.000000000","message":"Patch Set 2:\n\nI\u0027ve been trying to write a testcase for this and haven\u0027t had any luck.\n\nHere\u0027s the code that the commit message says is being called[1]. Note that it will only invalidate() and then get_headers() and cause the deadlock if authenticated\u003dTrue. authenticated can be passed in as False to the method to indicate that the request doesn\u0027t require authentication, and in the case of a request to get a token, authenticated is going to be False.\n\nFor example, in the case of the v3 plugins the call is session.post(token_url, ..., authenticated\u003dFalse), see[2].\n\nSo the problem is likely that whatever plugin you\u0027re using isn\u0027t calling the Session.post() with authenticated\u003dFalse rather than that this lock needs to be reentrant.\n\n[1] http://git.openstack.org/cgit/openstack/python-keystoneclient/tree/keystoneclient/session.py#n389\n\n[2] http://git.openstack.org/cgit/openstack/python-keystoneclient/tree/keystoneclient/auth/identity/v3/base.py#n189","accounts_in_message":[],"_revision_number":2},{"id":"ecfaf2518f9be5b35164c7deecc6308135a54302","author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"date":"2015-10-21 18:07:16.000000000","message":"Patch Set 2:\n\nDolph - the bug fixed in https://review.openstack.org/#/c/221738/ required multiple threads, which we don\u0027t have any existing tests for. Testcases for that would be nice but since we don\u0027t have existing multithreading tests I don\u0027t think it\u0027s worth it. The bug fixed here involves a single thread and we have lots of tests for that already.","accounts_in_message":[],"_revision_number":2},{"id":"388b1346b83117b6a84118103179ebc91b08181a","author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"date":"2015-10-21 18:16:06.000000000","message":"Patch Set 2: Code-Review-1\n\nI agree with Brant, the plugins in python-keystoneclient seems to be calling Session.post() with authenticated set to False. This should not trigger the invalidate() call. If possible, can we put the thread dump or traceback in the bug?","accounts_in_message":[],"_revision_number":2},{"id":"7c4f4c31c0edbdb19aaabc4d33d91ad2eaa32e7f","author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"date":"2015-10-22 05:53:26.000000000","message":"Patch Set 2: Workflow-1\n\nI have dump the backtrace and as you expect authenticated is False, the loop doesn\u0027t occurs like I have thought. I have to dig more :(","accounts_in_message":[],"_revision_number":2},{"id":"131a79576c118bc9a5c6b3fb20363ce2e784430c","author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"date":"2015-10-22 05:53:57.000000000","message":"Abandoned","accounts_in_message":[],"_revision_number":2}],"current_revision_number":2,"current_revision":"64a29be86b4b4cb26ecf416c6dca9f7af736e276","revisions":{"59caad10b639d37f8fb39470a45fe25d3f7820cd":{"kind":"REWORK","_number":1,"created":"2015-10-21 11:42:31.000000000","uploader":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"ref":"refs/changes/01/238001/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-keystoneclient","ref":"refs/changes/01/238001/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/1"}}},"commit":{"parents":[{"commit":"6588ad5fb5a3162aa2204ca38fb5a89a1f940985","subject":"Updated from global requirements","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/6588ad5fb5a3162aa2204ca38fb5a89a1f940985"}]}],"author":{"name":"Mehdi Abaakouk","email":"sileht@redhat.com","date":"2015-10-21 11:23:48.000000000","tz":0},"committer":{"name":"Mehdi Abaakouk","email":"sileht@redhat.com","date":"2015-10-21 11:42:29.000000000","tz":120},"subject":"Fix token lock race condition","message":"Fix token lock race condition\n\nBaseIdentityPlugin.get_access can be called recursively,\nbut the code is protected by a lock, so when this recursion occurs.\nThe lock hang the running thread.\n\nThe recursion occurs when:\n* if needed, BaseIdentityPlugin.get_access() calls BaseIdentityPlugin.get_auth_ref()\n* then the auth plugin uses Session.post(), that can calls (in case of 401)\n  BaseIdentityPlugin.invalidate() and then\n  BaseIdentityPlugin.get_headers()\n* The last one, do BaseIdentityPlugin.get_access() again to get a new\n  valid token. With a normal Lock() it stuck here.\n\nThis changes uses a RLock instead of a Lock to fix this.\n\nChange-Id: I493199164694a17319a47525647a574363342fe6\nCloses-bug: #1508424\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/59caad10b639d37f8fb39470a45fe25d3f7820cd"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/59caad10b639d37f8fb39470a45fe25d3f7820cd"}]},"branch":"refs/heads/master"},"64a29be86b4b4cb26ecf416c6dca9f7af736e276":{"kind":"NO_CODE_CHANGE","_number":2,"created":"2015-10-21 12:07:00.000000000","uploader":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"ref":"refs/changes/01/238001/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-keystoneclient","ref":"refs/changes/01/238001/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-keystoneclient refs/changes/01/238001/2"}}},"commit":{"parents":[{"commit":"6588ad5fb5a3162aa2204ca38fb5a89a1f940985","subject":"Updated from global requirements","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/6588ad5fb5a3162aa2204ca38fb5a89a1f940985"}]}],"author":{"name":"Mehdi Abaakouk","email":"sileht@redhat.com","date":"2015-10-21 11:23:48.000000000","tz":0},"committer":{"name":"Mehdi Abaakouk","email":"sileht@redhat.com","date":"2015-10-21 11:43:54.000000000","tz":120},"subject":"Fix token lock race condition","message":"Fix token lock race condition\n\nBaseIdentityPlugin.get_access can be called recursively,\nbut the code is protected by a Lock(), so when this recursion occurs.\nThe lock hangs the running thread.\n\nThe recursion occurs when:\n* if needed, BaseIdentityPlugin.get_access() calls BaseIdentityPlugin.get_auth_ref()\n* then the auth plugin uses Session.post(), that can calls (in case of 401)\n  BaseIdentityPlugin.invalidate() and then\n  BaseIdentityPlugin.get_headers()\n* The last one, does BaseIdentityPlugin.get_access() again to get a new\n  valid token. With a normal Lock() it stuck here.\n\nThis changes uses a RLock instead of a Lock to fix this.\n\nChange-Id: I493199164694a17319a47525647a574363342fe6\nCloses-bug: #1508424\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/64a29be86b4b4cb26ecf416c6dca9f7af736e276"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-keystoneclient/commit/64a29be86b4b4cb26ecf416c6dca9f7af736e276"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[],"submit_requirements":[]}
