{"action":"created","comment":{"url":"https://api.github.com/repos/google/ggrc-core/pulls/comments/214079135","pull_request_review_id":151055651,"id":214079135,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNDA3OTEzNQ==","diff_hunk":"@@ -39,38 +40,52 @@ def insert_select_acls(select_statement):\n   acl_table = all_models.AccessControlList.__table__\n   inserter = acl_table.insert().prefix_with(\"IGNORE\")\n \n-  last_error = None\n-  for _ in range(PROPAGATION_RETRIES):\n-    try:\n-      last_error = None\n-      db.session.execute(\n-          inserter.from_select(\n-              [\n-                  acl_table.c.person_id,\n-                  acl_table.c.ac_role_id,\n-                  acl_table.c.object_id,\n-                  acl_table.c.object_type,\n-                  acl_table.c.created_at,\n-                  acl_table.c.modified_by_id,\n-                  acl_table.c.updated_at,\n-                  acl_table.c.parent_id,\n-                  acl_table.c.parent_id_nn,\n-              ],\n-              select_statement\n-          )\n-      )\n-      db.session.plain_commit()\n-      break\n-    except sa.exc.OperationalError as error:\n-      logger.exception(error)\n-      last_error = error\n+  to_insert = db.session.execute(select_statement).fetchall()\n+\n+  if to_insert:\n+    # TODO: investigate whether the select above sets locks on any tables\n+    db.session.plain_commit()\n \n-  if last_error:\n-    logger.critical(\n-        \"ACL propagation failed with %d retries on statement: \\n %s\",\n-        PROPAGATION_RETRIES,\n-        select_statement,\n+  def to_dict(record):\n+    \"\"\"Match selected and inserted columns.\"\"\"\n+    return dict(\n+        zip(\n+            [\n+                'person_id',\n+                'ac_role_id',\n+                'object_id',\n+                'object_type',\n+                'created_at',\n+                'modified_by_id',\n+                'updated_at',\n+                'parent_id',\n+                'parent_id_nn',\n+            ],\n+            record,\n+        ),\n     )\n-    # The following error if exists will only be sa.exc.OperationalError so the\n-    # pylint warning is invalid.\n-    raise last_error  # pylint: disable=raising-bad-type\n+\n+  # process to_insert in chunks, retry failed inserts, allow maximum of\n+  # PROPAGATION_RETRIES total retries\n+  failures = 0","path":"src/ggrc/access_control/utils.py","position":72,"original_position":72,"commit_id":"c803b2fe532434b41b8ffb941d6ccc6f0858af70","original_commit_id":"378802ee33469a7cb8441485b61c951fd689acb7","user":{"login":"alieh-rymasheuski","id":9883236,"node_id":"MDQ6VXNlcjk4ODMyMzY=","avatar_url":"https://avatars2.githubusercontent.com/u/9883236?v=4","gravatar_id":"","url":"https://api.github.com/users/alieh-rymasheuski","html_url":"https://github.com/alieh-rymasheuski","followers_url":"https://api.github.com/users/alieh-rymasheuski/followers","following_url":"https://api.github.com/users/alieh-rymasheuski/following{/other_user}","gists_url":"https://api.github.com/users/alieh-rymasheuski/gists{/gist_id}","starred_url":"https://api.github.com/users/alieh-rymasheuski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alieh-rymasheuski/subscriptions","organizations_url":"https://api.github.com/users/alieh-rymasheuski/orgs","repos_url":"https://api.github.com/users/alieh-rymasheuski/repos","events_url":"https://api.github.com/users/alieh-rymasheuski/events{/privacy}","received_events_url":"https://api.github.com/users/alieh-rymasheuski/received_events","type":"User","site_admin":false},"body":"@IlyaTsupryk The idea was to only allow PROPAGATION_RETRIES failures in total. PROPAGATION_RETRIES times chunk count times innodb lock wait time is probably too long, and we should avoid failed inserts anyway.","created_at":"2018-08-30T15:34:51Z","updated_at":"2018-08-30T15:34:51Z","html_url":"https://github.com/google/ggrc-core/pull/8305#discussion_r214079135","pull_request_url":"https://api.github.com/repos/google/ggrc-core/pulls/8305","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/comments/214079135"},"html":{"href":"https://github.com/google/ggrc-core/pull/8305#discussion_r214079135"},"pull_request":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/8305"}},"in_reply_to_id":214059127},"pull_request":{"url":"https://api.github.com/repos/google/ggrc-core/pulls/8305","id":209167021,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MTY3MDIx","html_url":"https://github.com/google/ggrc-core/pull/8305","diff_url":"https://github.com/google/ggrc-core/pull/8305.diff","patch_url":"https://github.com/google/ggrc-core/pull/8305.patch","issue_url":"https://api.github.com/repos/google/ggrc-core/issues/8305","number":8305,"state":"open","locked":false,"title":"GGRC-5522 Avoid deadlocks on ACL propagation","user":{"login":"alieh-rymasheuski","id":9883236,"node_id":"MDQ6VXNlcjk4ODMyMzY=","avatar_url":"https://avatars2.githubusercontent.com/u/9883236?v=4","gravatar_id":"","url":"https://api.github.com/users/alieh-rymasheuski","html_url":"https://github.com/alieh-rymasheuski","followers_url":"https://api.github.com/users/alieh-rymasheuski/followers","following_url":"https://api.github.com/users/alieh-rymasheuski/following{/other_user}","gists_url":"https://api.github.com/users/alieh-rymasheuski/gists{/gist_id}","starred_url":"https://api.github.com/users/alieh-rymasheuski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alieh-rymasheuski/subscriptions","organizations_url":"https://api.github.com/users/alieh-rymasheuski/orgs","repos_url":"https://api.github.com/users/alieh-rymasheuski/repos","events_url":"https://api.github.com/users/alieh-rymasheuski/events{/privacy}","received_events_url":"https://api.github.com/users/alieh-rymasheuski/received_events","type":"User","site_admin":false},"body":"<!-- If your PR depends on other tickets or PRs, you can list them here\r\n# Dependencies\r\n\r\nThis PR is `on hold` until the dependencies are merged:\r\n\r\n- [ ] GGRC-1234\r\n- [ ] #1234\r\n-->\r\n\r\n# Issue description\r\n\r\n2+ concurrent requests enter a deadlock while performing propagation.\r\n\r\n# Steps to test the changes\r\n\r\nRun imports of 1000 assessments for the same Audit in 3-4 parallel jobs.\r\n\r\nExpected result: the Assessments are created, their ACL fields are imported, the Program and Audit roles are propagated to the new Assessments.\r\nActual result: the Assessments are created, but either ACL fields or propagated roles are missing; multiple \"import failed due to unknown error\" are reported on row level, and some of the jobs are reported crashed.\r\n\r\n# Solution description\r\n\r\nMultiple solutions were attempted:\r\n- lower transaction isolation right before doing the INSERT FROM SELECT to avoid locks from the SELECT part (doesn't work by design for transactions that already performed at least one SQL statment)\r\n- lower transaction isolation in the hooked commit before performing ACL propagation to avoid locks from the SELECT part of INSERT FROM SELECT (multiple tests fail with this change; apparently, lower transaction isolation affects other transactions as well, no detailed analysis was performed)\r\n- perform SELECT and INSERT separately (the current solution; plain SELECTs don't set any locks on any tables).\r\n\r\nSince a big amount of rows are propagated for bigger imports (285000 rows was reported in an error log), MySQL closes the connection while receiving the big data packet, therefore we should insert the data chunk by chunk. Chunk size of 1000 was chosen as an arbitrary low limit.\r\n\r\nFor some reason, if we don't COMMIT right after doing SELECT for the whole data set, deadlocks still occur. It is possible that MySQL sets some read locks when doing a SELECT with multiple JOINs, but no detailed analysis was done in this field either.\r\n\r\n# Results of testing on ggrc-perf\r\n\r\nTesting scenario: each import creates 1000 Assessments on Audit 4567 (a big one) with Assessment Template having 10 custom attributes. The imported CSVs are the same for each job.\r\n\r\n\r\n## Before the fix\r\n\r\n1 out of 4 import jobs succeeds, occasionally all 4 jobs fail.\r\n\r\n## After the fix\r\n\r\n### With chunk size of 1000\r\n\r\n4 out of 4 import jobs succeed, they take 5, 5, 5, 13 hours each.\r\n\r\n### With chunk size of 50000:\r\n\r\n1. 4 out of 5 import jobs succeeded, one failed with \"Lost connection to MySQL server\" in an unrelated part of code (some SELECT to issuetracker_issues).\r\n2. 4 out of 6 import jobs succeeded, one failed with \"Lost connection to MySQL server\" on a hook that invalidates changes to built-in roles (unrelated to my changes), another failed because a person stopped the app before the imports were finished.\r\n3. 4 out of 5 import jobs succeeded, one failed because the worker was killed without any error message in the logs (definitely not caused by memory consumption or timeouts, judging by the logs).\r\n\r\nNote: it appears that the amount of data affects the import time. Trial 1 was done on an Audit with 2000 Assessments, and the DB wasn't cleaned since then. The timings for successful jobs are (in seconds):\r\n1. 6973, 4952, 5023, 5995\r\n2. 14069, 11093, 13114, 12986\r\n3. 22796, 22240, 21129. 19352\r\n\r\nSince the code wasn't changed between the runs, the reason of increased timings is data.\r\n\r\n# Sanity checklist\r\n\r\n- [x] I have clicked through the app to make sure my changes work and not break the app.\r\n- [x] I have applied the correct milestone and labels.\r\n- [x] My changes fix the issue described in the description (and do nothing else). 🤞\r\n- [x] My changes are covered by tests.\r\n- [ ] My changes follow our [performance guidelines](https://github.com/google/ggrc-core/blob/dev/docs/source/contributing/performance.rst). - a big dataset is fetched from the DB and pushed back again in multiple requests, which doesn't feel a performant job\r\n- [x] My changes follow our [js](https://github.com/google/ggrc-core/blob/dev/docs/source/contributing/javascript.rst) and/or [python](https://github.com/google/ggrc-core/blob/dev/docs/source/contributing/python.rst) guidelines.\r\n- [x] My commits follow our [commit guidelines](https://github.com/google/ggrc-core/blob/dev/docs/source/contributing/git/how_to_write_a_commit_message.rst).\r\n\r\n<!-- If your PR includes a migration include the additional checklist items\r\n# Migration checklist\r\n- [ ] Migration passes all checks from our [PR review guidelines](https://github.com/google/ggrc-core/blob/dev/docs/source/contributing/git/reviewing_pull_requests.rst#reviewing-a-pr-containing-database-migration-scripts)\r\n-->\r\n\r\n# PR Review checklist\r\n\r\n- [ ] The changes fix the issue and don't cause any apparent regressions.\r\n- [ ] Labels and milestone are correctly set.\r\n- [ ] The solution description matches the changes in the code.\r\n- [ ] There is no apparent way to improve the performance & design of the new code.\r\n- [ ] The pull request is opened against the correct base branch.\r\n- [ ] Upon merging, the Jira ticket's fixversion is correctly set and the ticket is moved to \"QA - In Progress\".\r\n\r\n<!-- If your code is not finished yet can include a TODO check list\r\n# TODO\r\n\r\n- [ ] First item on the TODO\r\n-->\r\n","created_at":"2018-08-17T14:33:58Z","updated_at":"2018-08-30T15:34:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d08e78a1cf7f8fe5f8821a29d293ee91d65502e0","assignee":{"login":"egorhm","id":513820,"node_id":"MDQ6VXNlcjUxMzgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/513820?v=4","gravatar_id":"","url":"https://api.github.com/users/egorhm","html_url":"https://github.com/egorhm","followers_url":"https://api.github.com/users/egorhm/followers","following_url":"https://api.github.com/users/egorhm/following{/other_user}","gists_url":"https://api.github.com/users/egorhm/gists{/gist_id}","starred_url":"https://api.github.com/users/egorhm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/egorhm/subscriptions","organizations_url":"https://api.github.com/users/egorhm/orgs","repos_url":"https://api.github.com/users/egorhm/repos","events_url":"https://api.github.com/users/egorhm/events{/privacy}","received_events_url":"https://api.github.com/users/egorhm/received_events","type":"User","site_admin":false},"assignees":[{"login":"egorhm","id":513820,"node_id":"MDQ6VXNlcjUxMzgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/513820?v=4","gravatar_id":"","url":"https://api.github.com/users/egorhm","html_url":"https://github.com/egorhm","followers_url":"https://api.github.com/users/egorhm/followers","following_url":"https://api.github.com/users/egorhm/following{/other_user}","gists_url":"https://api.github.com/users/egorhm/gists{/gist_id}","starred_url":"https://api.github.com/users/egorhm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/egorhm/subscriptions","organizations_url":"https://api.github.com/users/egorhm/orgs","repos_url":"https://api.github.com/users/egorhm/repos","events_url":"https://api.github.com/users/egorhm/events{/privacy}","received_events_url":"https://api.github.com/users/egorhm/received_events","type":"User","site_admin":false},{"login":"IlyaTsupryk","id":9151434,"node_id":"MDQ6VXNlcjkxNTE0MzQ=","avatar_url":"https://avatars0.githubusercontent.com/u/9151434?v=4","gravatar_id":"","url":"https://api.github.com/users/IlyaTsupryk","html_url":"https://github.com/IlyaTsupryk","followers_url":"https://api.github.com/users/IlyaTsupryk/followers","following_url":"https://api.github.com/users/IlyaTsupryk/following{/other_user}","gists_url":"https://api.github.com/users/IlyaTsupryk/gists{/gist_id}","starred_url":"https://api.github.com/users/IlyaTsupryk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IlyaTsupryk/subscriptions","organizations_url":"https://api.github.com/users/IlyaTsupryk/orgs","repos_url":"https://api.github.com/users/IlyaTsupryk/repos","events_url":"https://api.github.com/users/IlyaTsupryk/events{/privacy}","received_events_url":"https://api.github.com/users/IlyaTsupryk/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":653911749,"node_id":"MDU6TGFiZWw2NTM5MTE3NDk=","url":"https://api.github.com/repos/google/ggrc-core/labels/cla:%20yes","name":"cla: yes","color":"ededed","default":false},{"id":358687972,"node_id":"MDU6TGFiZWwzNTg2ODc5NzI=","url":"https://api.github.com/repos/google/ggrc-core/labels/critical","name":"critical","color":"000000","default":false},{"id":859293985,"node_id":"MDU6TGFiZWw4NTkyOTM5ODU=","url":"https://api.github.com/repos/google/ggrc-core/labels/important","name":"important","color":"db9ffc","default":false},{"id":194103122,"node_id":"MDU6TGFiZWwxOTQxMDMxMjI=","url":"https://api.github.com/repos/google/ggrc-core/labels/please%20review","name":"please review","color":"0e8a16","default":false}],"milestone":{"url":"https://api.github.com/repos/google/ggrc-core/milestones/106","html_url":"https://github.com/google/ggrc-core/milestone/106","labels_url":"https://api.github.com/repos/google/ggrc-core/milestones/106/labels","id":3606602,"node_id":"MDk6TWlsZXN0b25lMzYwNjYwMg==","number":106,"title":"1.22.0-Strawberry","description":"","creator":{"login":"belovmd","id":39156721,"node_id":"MDQ6VXNlcjM5MTU2NzIx","avatar_url":"https://avatars2.githubusercontent.com/u/39156721?v=4","gravatar_id":"","url":"https://api.github.com/users/belovmd","html_url":"https://github.com/belovmd","followers_url":"https://api.github.com/users/belovmd/followers","following_url":"https://api.github.com/users/belovmd/following{/other_user}","gists_url":"https://api.github.com/users/belovmd/gists{/gist_id}","starred_url":"https://api.github.com/users/belovmd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/belovmd/subscriptions","organizations_url":"https://api.github.com/users/belovmd/orgs","repos_url":"https://api.github.com/users/belovmd/repos","events_url":"https://api.github.com/users/belovmd/events{/privacy}","received_events_url":"https://api.github.com/users/belovmd/received_events","type":"User","site_admin":false},"open_issues":38,"closed_issues":8,"state":"open","created_at":"2018-08-29T10:58:53Z","updated_at":"2018-08-30T13:53:44Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/google/ggrc-core/pulls/8305/commits","review_comments_url":"https://api.github.com/repos/google/ggrc-core/pulls/8305/comments","review_comment_url":"https://api.github.com/repos/google/ggrc-core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/ggrc-core/issues/8305/comments","statuses_url":"https://api.github.com/repos/google/ggrc-core/statuses/c803b2fe532434b41b8ffb941d6ccc6f0858af70","head":{"label":"alieh-rymasheuski:GGRC-5522-avoid-deadlocks-on-acl-propagation","ref":"GGRC-5522-avoid-deadlocks-on-acl-propagation","sha":"c803b2fe532434b41b8ffb941d6ccc6f0858af70","user":{"login":"alieh-rymasheuski","id":9883236,"node_id":"MDQ6VXNlcjk4ODMyMzY=","avatar_url":"https://avatars2.githubusercontent.com/u/9883236?v=4","gravatar_id":"","url":"https://api.github.com/users/alieh-rymasheuski","html_url":"https://github.com/alieh-rymasheuski","followers_url":"https://api.github.com/users/alieh-rymasheuski/followers","following_url":"https://api.github.com/users/alieh-rymasheuski/following{/other_user}","gists_url":"https://api.github.com/users/alieh-rymasheuski/gists{/gist_id}","starred_url":"https://api.github.com/users/alieh-rymasheuski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alieh-rymasheuski/subscriptions","organizations_url":"https://api.github.com/users/alieh-rymasheuski/orgs","repos_url":"https://api.github.com/users/alieh-rymasheuski/repos","events_url":"https://api.github.com/users/alieh-rymasheuski/events{/privacy}","received_events_url":"https://api.github.com/users/alieh-rymasheuski/received_events","type":"User","site_admin":false},"repo":{"id":59271499,"node_id":"MDEwOlJlcG9zaXRvcnk1OTI3MTQ5OQ==","name":"ggrc-core","full_name":"alieh-rymasheuski/ggrc-core","owner":{"login":"alieh-rymasheuski","id":9883236,"node_id":"MDQ6VXNlcjk4ODMyMzY=","avatar_url":"https://avatars2.githubusercontent.com/u/9883236?v=4","gravatar_id":"","url":"https://api.github.com/users/alieh-rymasheuski","html_url":"https://github.com/alieh-rymasheuski","followers_url":"https://api.github.com/users/alieh-rymasheuski/followers","following_url":"https://api.github.com/users/alieh-rymasheuski/following{/other_user}","gists_url":"https://api.github.com/users/alieh-rymasheuski/gists{/gist_id}","starred_url":"https://api.github.com/users/alieh-rymasheuski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alieh-rymasheuski/subscriptions","organizations_url":"https://api.github.com/users/alieh-rymasheuski/orgs","repos_url":"https://api.github.com/users/alieh-rymasheuski/repos","events_url":"https://api.github.com/users/alieh-rymasheuski/events{/privacy}","received_events_url":"https://api.github.com/users/alieh-rymasheuski/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/alieh-rymasheuski/ggrc-core","description":"GGRC Core","fork":true,"url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core","forks_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/forks","keys_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/teams","hooks_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/hooks","issue_events_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/issues/events{/number}","events_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/events","assignees_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/assignees{/user}","branches_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/branches{/branch}","tags_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/tags","blobs_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/statuses/{sha}","languages_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/languages","stargazers_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/stargazers","contributors_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/contributors","subscribers_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/subscribers","subscription_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/subscription","commits_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/contents/{+path}","compare_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/merges","archive_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/downloads","issues_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/issues{/number}","pulls_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/pulls{/number}","milestones_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/milestones{/number}","notifications_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/labels{/name}","releases_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/releases{/id}","deployments_url":"https://api.github.com/repos/alieh-rymasheuski/ggrc-core/deployments","created_at":"2016-05-20T06:44:56Z","updated_at":"2016-05-23T08:41:47Z","pushed_at":"2018-08-30T15:33:16Z","git_url":"git://github.com/alieh-rymasheuski/ggrc-core.git","ssh_url":"git@github.com:alieh-rymasheuski/ggrc-core.git","clone_url":"https://github.com/alieh-rymasheuski/ggrc-core.git","svn_url":"https://github.com/alieh-rymasheuski/ggrc-core","homepage":null,"size":78378,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"google:dev","ref":"dev","sha":"3a15c59c333d43a1bfddad9d2288c50a39cafe60","user":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":9304637,"node_id":"MDEwOlJlcG9zaXRvcnk5MzA0NjM3","name":"ggrc-core","full_name":"google/ggrc-core","owner":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/ggrc-core","description":"GGRC Core","fork":false,"url":"https://api.github.com/repos/google/ggrc-core","forks_url":"https://api.github.com/repos/google/ggrc-core/forks","keys_url":"https://api.github.com/repos/google/ggrc-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/ggrc-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/ggrc-core/teams","hooks_url":"https://api.github.com/repos/google/ggrc-core/hooks","issue_events_url":"https://api.github.com/repos/google/ggrc-core/issues/events{/number}","events_url":"https://api.github.com/repos/google/ggrc-core/events","assignees_url":"https://api.github.com/repos/google/ggrc-core/assignees{/user}","branches_url":"https://api.github.com/repos/google/ggrc-core/branches{/branch}","tags_url":"https://api.github.com/repos/google/ggrc-core/tags","blobs_url":"https://api.github.com/repos/google/ggrc-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/ggrc-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/ggrc-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/ggrc-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/ggrc-core/statuses/{sha}","languages_url":"https://api.github.com/repos/google/ggrc-core/languages","stargazers_url":"https://api.github.com/repos/google/ggrc-core/stargazers","contributors_url":"https://api.github.com/repos/google/ggrc-core/contributors","subscribers_url":"https://api.github.com/repos/google/ggrc-core/subscribers","subscription_url":"https://api.github.com/repos/google/ggrc-core/subscription","commits_url":"https://api.github.com/repos/google/ggrc-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/ggrc-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/ggrc-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/ggrc-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/ggrc-core/contents/{+path}","compare_url":"https://api.github.com/repos/google/ggrc-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/ggrc-core/merges","archive_url":"https://api.github.com/repos/google/ggrc-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/ggrc-core/downloads","issues_url":"https://api.github.com/repos/google/ggrc-core/issues{/number}","pulls_url":"https://api.github.com/repos/google/ggrc-core/pulls{/number}","milestones_url":"https://api.github.com/repos/google/ggrc-core/milestones{/number}","notifications_url":"https://api.github.com/repos/google/ggrc-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/ggrc-core/labels{/name}","releases_url":"https://api.github.com/repos/google/ggrc-core/releases{/id}","deployments_url":"https://api.github.com/repos/google/ggrc-core/deployments","created_at":"2013-04-08T19:16:28Z","updated_at":"2018-08-30T14:44:09Z","pushed_at":"2018-08-30T15:33:18Z","git_url":"git://github.com/google/ggrc-core.git","ssh_url":"git@github.com:google/ggrc-core.git","clone_url":"https://github.com/google/ggrc-core.git","svn_url":"https://github.com/google/ggrc-core","homepage":null,"size":80557,"stargazers_count":314,"watchers_count":314,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":231,"mirror_url":null,"archived":false,"open_issues_count":45,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":231,"open_issues":45,"watchers":314,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/8305"},"html":{"href":"https://github.com/google/ggrc-core/pull/8305"},"issue":{"href":"https://api.github.com/repos/google/ggrc-core/issues/8305"},"comments":{"href":"https://api.github.com/repos/google/ggrc-core/issues/8305/comments"},"review_comments":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/8305/comments"},"review_comment":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/ggrc-core/pulls/8305/commits"},"statuses":{"href":"https://api.github.com/repos/google/ggrc-core/statuses/c803b2fe532434b41b8ffb941d6ccc6f0858af70"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"alieh-rymasheuski"}}