{"action":"created","comment":{"url":"https://api.github.com/repos/neo4j/neo4j/pulls/comments/91865050","pull_request_review_id":12374614,"id":91865050,"diff_hunk":"@@ -0,0 +1,96 @@\n+/*\n+ * Copyright (c) 2002-2016 \"Neo Technology,\"\n+ * Network Engine for Objects in Lund AB [http://neotechnology.com]\n+ *\n+ * This file is part of Neo4j.\n+ *\n+ * Neo4j is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License as published by\n+ * the Free Software Foundation, either version 3 of the License, or\n+ * (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n+ */\n+package org.neo4j.index.gbptree;\n+\n+import org.apache.commons.lang3.tuple.Pair;\n+\n+import java.io.IOException;\n+\n+import org.neo4j.io.pagecache.PageCursor;\n+\n+class TreeStatePair\n+{\n+    static Pair<TreeState,TreeState> readStatePages( PageCursor cursor, long pageIdA, long pageIdB ) throws IOException\n+    {\n+        TreeState stateA;\n+        TreeState stateB;\n+\n+        // Use write lock to avoid should retry. Fine because there can be no concurrency at this point anyway\n+\n+        PageCursorUtil.goTo( cursor, \"state page A\", pageIdA );\n+        stateA = TreeState.read( cursor );\n+\n+        PageCursorUtil.goTo( cursor, \"state page B\", pageIdB );\n+        stateB = TreeState.read( cursor );\n+        return Pair.of( stateA, stateB );\n+    }\n+\n+    static TreeState selectNewestValidState( Pair<TreeState,TreeState> states )\n+    {\n+        TreeState selected = selectNewestValidStateOrNull( states );\n+        if ( selected != null )\n+        {\n+            return selected;\n+        }\n+\n+        // Fail\n+        throw new TreeInconsistencyException( \"Unexpected combination of state.%n  STATE_A[%s]%n  STATE_B[%s]\",\n+                states.getLeft(), states.getRight() );\n+    }\n+\n+    static TreeState selectOldestOrInvalid( Pair<TreeState,TreeState> states )\n+    {\n+        TreeState newestValidState = selectNewestValidStateOrNull( states );\n+        if ( newestValidState == null )\n+        {\n+            return states.getLeft();\n+        }\n+        return newestValidState == states.getLeft() ? states.getRight() : states.getLeft();\n+    }\n+\n+    private static TreeState selectNewestValidStateOrNull( Pair<TreeState,TreeState> states )","path":"community/index/src/main/java/org/neo4j/index/gbptree/TreeStatePair.java","position":68,"original_position":68,"commit_id":"4ebd3c2fea6f57af4041d5a87e0501e5d689ad87","original_commit_id":"4ebd3c2fea6f57af4041d5a87e0501e5d689ad87","user":{"login":"tinwelint","id":187292,"avatar_url":"https://avatars.githubusercontent.com/u/187292?v=3","gravatar_id":"","url":"https://api.github.com/users/tinwelint","html_url":"https://github.com/tinwelint","followers_url":"https://api.github.com/users/tinwelint/followers","following_url":"https://api.github.com/users/tinwelint/following{/other_user}","gists_url":"https://api.github.com/users/tinwelint/gists{/gist_id}","starred_url":"https://api.github.com/users/tinwelint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tinwelint/subscriptions","organizations_url":"https://api.github.com/users/tinwelint/orgs","repos_url":"https://api.github.com/users/tinwelint/repos","events_url":"https://api.github.com/users/tinwelint/events{/privacy}","received_events_url":"https://api.github.com/users/tinwelint/received_events","type":"User","site_admin":false},"body":"As a private method this becomes more of a matter of taste imho, not quite a \"should\". But with that said, Optional the calling methods a bit more readable and shorter.","created_at":"2016-12-11T20:54:58Z","updated_at":"2016-12-11T20:54:58Z","html_url":"https://github.com/neo4j/neo4j/pull/8481#discussion_r91865050","pull_request_url":"https://api.github.com/repos/neo4j/neo4j/pulls/8481","_links":{"self":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/comments/91865050"},"html":{"href":"https://github.com/neo4j/neo4j/pull/8481#discussion_r91865050"},"pull_request":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/8481"}}},"pull_request":{"url":"https://api.github.com/repos/neo4j/neo4j/pulls/8481","id":96740220,"html_url":"https://github.com/neo4j/neo4j/pull/8481","diff_url":"https://github.com/neo4j/neo4j/pull/8481.diff","patch_url":"https://github.com/neo4j/neo4j/pull/8481.patch","issue_url":"https://api.github.com/repos/neo4j/neo4j/issues/8481","number":8481,"state":"open","locked":false,"title":"GBPTree recovery","user":{"login":"tinwelint","id":187292,"avatar_url":"https://avatars.githubusercontent.com/u/187292?v=3","gravatar_id":"","url":"https://api.github.com/users/tinwelint","html_url":"https://github.com/tinwelint","followers_url":"https://api.github.com/users/tinwelint/followers","following_url":"https://api.github.com/users/tinwelint/following{/other_user}","gists_url":"https://api.github.com/users/tinwelint/gists{/gist_id}","starred_url":"https://api.github.com/users/tinwelint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tinwelint/subscriptions","organizations_url":"https://api.github.com/users/tinwelint/orgs","repos_url":"https://api.github.com/users/tinwelint/repos","events_url":"https://api.github.com/users/tinwelint/events{/privacy}","received_events_url":"https://api.github.com/users/tinwelint/received_events","type":"User","site_admin":false},"body":"**This PR contain a lot of stuff**\r\n... but the main focus is on recovery.\r\n\r\n**Recovery build on two important sub-parts:**\r\n\r\n- *Tree state* (e.g. tree root id, generation etc.) comes in two pages, at least one of which will always be stable and consistent. An equivalent of GSPP, but for the tree itself.\r\n- *Checkpoint algorithm*, creating consistent durable state of the tree between generations. Designed to be integrated with neo4j's checkpointing.\r\n\r\n**Some minor changes to allow tree to recover after a crash:**\r\n\r\n- Introduce `GBPTree.prepareForRecovery()` that will prepare tree to accept the operations that happened since last checkpoint to be re-applied. Creator of tree is responsible to call this method whenever recovery happens.\r\n- In `GBPTree.acquireNewId()`. Overwrite newly acquired pages with zeroes to not leak state if page was reused.\r\n- In `InternalTreeLogic. createUnstableVersionIfNeeded`. Overwrite `newGen` field in new generation of node.\r\n- Checkpoint tree on first initialisation to be able to recover if crash happens before last checkpoint.\r\n\r\n**Some other changes are:**\r\n\r\n- Writing to tree and perform checkpointing need to be mutually exclusive to guarantee a consistent state after checkpoint. This is guarded by `writerCheckpointMutex` in GBPTree.\r\n- `SeekCursor` is now responsible for traversal through internal nodes as well as leaf nodes. `GBPTree` was previously the one traversing the internal nodes.\r\n- If a reader survives a checkpoint it now have the possibility to get an updated `stable` and `unstableGeneration`.\r\n- Every `cursor.next` and `cursor.checkAndClearBoundsFlag` is now done using `PageCursorUtil` to unify exception behaviour and make code less cluttered by `if... throw`.\r\n\r\n**Improved exceptions**\r\nIntroduce `TreeInconsistencyException` and `MetadataMismatchException` together with more detailed messages. What is still missing is some information about tree (file path, etc) for exceptions thrown from the internals of the tree. This is outside the scope of this PR but will be added soon.","created_at":"2016-12-06T15:03:51Z","updated_at":"2016-12-11T20:54:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"32809697695ab45667a5d75c7b11b215bf5756ff","assignee":{"login":"chrisvest","id":7993,"avatar_url":"https://avatars.githubusercontent.com/u/7993?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisvest","html_url":"https://github.com/chrisvest","followers_url":"https://api.github.com/users/chrisvest/followers","following_url":"https://api.github.com/users/chrisvest/following{/other_user}","gists_url":"https://api.github.com/users/chrisvest/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisvest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisvest/subscriptions","organizations_url":"https://api.github.com/users/chrisvest/orgs","repos_url":"https://api.github.com/users/chrisvest/repos","events_url":"https://api.github.com/users/chrisvest/events{/privacy}","received_events_url":"https://api.github.com/users/chrisvest/received_events","type":"User","site_admin":false},"assignees":[{"login":"chrisvest","id":7993,"avatar_url":"https://avatars.githubusercontent.com/u/7993?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisvest","html_url":"https://github.com/chrisvest","followers_url":"https://api.github.com/users/chrisvest/followers","following_url":"https://api.github.com/users/chrisvest/following{/other_user}","gists_url":"https://api.github.com/users/chrisvest/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisvest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisvest/subscriptions","organizations_url":"https://api.github.com/users/chrisvest/orgs","repos_url":"https://api.github.com/users/chrisvest/repos","events_url":"https://api.github.com/users/chrisvest/events{/privacy}","received_events_url":"https://api.github.com/users/chrisvest/received_events","type":"User","site_admin":false},{"login":"ragadeeshu","id":6298955,"avatar_url":"https://avatars.githubusercontent.com/u/6298955?v=3","gravatar_id":"","url":"https://api.github.com/users/ragadeeshu","html_url":"https://github.com/ragadeeshu","followers_url":"https://api.github.com/users/ragadeeshu/followers","following_url":"https://api.github.com/users/ragadeeshu/following{/other_user}","gists_url":"https://api.github.com/users/ragadeeshu/gists{/gist_id}","starred_url":"https://api.github.com/users/ragadeeshu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ragadeeshu/subscriptions","organizations_url":"https://api.github.com/users/ragadeeshu/orgs","repos_url":"https://api.github.com/users/ragadeeshu/repos","events_url":"https://api.github.com/users/ragadeeshu/events{/privacy}","received_events_url":"https://api.github.com/users/ragadeeshu/received_events","type":"User","site_admin":false},{"login":"MishaDemianenko","id":12656787,"avatar_url":"https://avatars.githubusercontent.com/u/12656787?v=3","gravatar_id":"","url":"https://api.github.com/users/MishaDemianenko","html_url":"https://github.com/MishaDemianenko","followers_url":"https://api.github.com/users/MishaDemianenko/followers","following_url":"https://api.github.com/users/MishaDemianenko/following{/other_user}","gists_url":"https://api.github.com/users/MishaDemianenko/gists{/gist_id}","starred_url":"https://api.github.com/users/MishaDemianenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MishaDemianenko/subscriptions","organizations_url":"https://api.github.com/users/MishaDemianenko/orgs","repos_url":"https://api.github.com/users/MishaDemianenko/repos","events_url":"https://api.github.com/users/MishaDemianenko/events{/privacy}","received_events_url":"https://api.github.com/users/MishaDemianenko/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/neo4j/neo4j/pulls/8481/commits","review_comments_url":"https://api.github.com/repos/neo4j/neo4j/pulls/8481/comments","review_comment_url":"https://api.github.com/repos/neo4j/neo4j/pulls/comments{/number}","comments_url":"https://api.github.com/repos/neo4j/neo4j/issues/8481/comments","statuses_url":"https://api.github.com/repos/neo4j/neo4j/statuses/4ebd3c2fea6f57af4041d5a87e0501e5d689ad87","head":{"label":"tinwelint:3.2-native-index-recovery","ref":"3.2-native-index-recovery","sha":"4ebd3c2fea6f57af4041d5a87e0501e5d689ad87","user":{"login":"tinwelint","id":187292,"avatar_url":"https://avatars.githubusercontent.com/u/187292?v=3","gravatar_id":"","url":"https://api.github.com/users/tinwelint","html_url":"https://github.com/tinwelint","followers_url":"https://api.github.com/users/tinwelint/followers","following_url":"https://api.github.com/users/tinwelint/following{/other_user}","gists_url":"https://api.github.com/users/tinwelint/gists{/gist_id}","starred_url":"https://api.github.com/users/tinwelint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tinwelint/subscriptions","organizations_url":"https://api.github.com/users/tinwelint/orgs","repos_url":"https://api.github.com/users/tinwelint/repos","events_url":"https://api.github.com/users/tinwelint/events{/privacy}","received_events_url":"https://api.github.com/users/tinwelint/received_events","type":"User","site_admin":false},"repo":{"id":6666980,"name":"neo4j","full_name":"tinwelint/neo4j","owner":{"login":"tinwelint","id":187292,"avatar_url":"https://avatars.githubusercontent.com/u/187292?v=3","gravatar_id":"","url":"https://api.github.com/users/tinwelint","html_url":"https://github.com/tinwelint","followers_url":"https://api.github.com/users/tinwelint/followers","following_url":"https://api.github.com/users/tinwelint/following{/other_user}","gists_url":"https://api.github.com/users/tinwelint/gists{/gist_id}","starred_url":"https://api.github.com/users/tinwelint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tinwelint/subscriptions","organizations_url":"https://api.github.com/users/tinwelint/orgs","repos_url":"https://api.github.com/users/tinwelint/repos","events_url":"https://api.github.com/users/tinwelint/events{/privacy}","received_events_url":"https://api.github.com/users/tinwelint/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tinwelint/neo4j","description":null,"fork":true,"url":"https://api.github.com/repos/tinwelint/neo4j","forks_url":"https://api.github.com/repos/tinwelint/neo4j/forks","keys_url":"https://api.github.com/repos/tinwelint/neo4j/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tinwelint/neo4j/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tinwelint/neo4j/teams","hooks_url":"https://api.github.com/repos/tinwelint/neo4j/hooks","issue_events_url":"https://api.github.com/repos/tinwelint/neo4j/issues/events{/number}","events_url":"https://api.github.com/repos/tinwelint/neo4j/events","assignees_url":"https://api.github.com/repos/tinwelint/neo4j/assignees{/user}","branches_url":"https://api.github.com/repos/tinwelint/neo4j/branches{/branch}","tags_url":"https://api.github.com/repos/tinwelint/neo4j/tags","blobs_url":"https://api.github.com/repos/tinwelint/neo4j/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tinwelint/neo4j/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tinwelint/neo4j/git/refs{/sha}","trees_url":"https://api.github.com/repos/tinwelint/neo4j/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tinwelint/neo4j/statuses/{sha}","languages_url":"https://api.github.com/repos/tinwelint/neo4j/languages","stargazers_url":"https://api.github.com/repos/tinwelint/neo4j/stargazers","contributors_url":"https://api.github.com/repos/tinwelint/neo4j/contributors","subscribers_url":"https://api.github.com/repos/tinwelint/neo4j/subscribers","subscription_url":"https://api.github.com/repos/tinwelint/neo4j/subscription","commits_url":"https://api.github.com/repos/tinwelint/neo4j/commits{/sha}","git_commits_url":"https://api.github.com/repos/tinwelint/neo4j/git/commits{/sha}","comments_url":"https://api.github.com/repos/tinwelint/neo4j/comments{/number}","issue_comment_url":"https://api.github.com/repos/tinwelint/neo4j/issues/comments{/number}","contents_url":"https://api.github.com/repos/tinwelint/neo4j/contents/{+path}","compare_url":"https://api.github.com/repos/tinwelint/neo4j/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tinwelint/neo4j/merges","archive_url":"https://api.github.com/repos/tinwelint/neo4j/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tinwelint/neo4j/downloads","issues_url":"https://api.github.com/repos/tinwelint/neo4j/issues{/number}","pulls_url":"https://api.github.com/repos/tinwelint/neo4j/pulls{/number}","milestones_url":"https://api.github.com/repos/tinwelint/neo4j/milestones{/number}","notifications_url":"https://api.github.com/repos/tinwelint/neo4j/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tinwelint/neo4j/labels{/name}","releases_url":"https://api.github.com/repos/tinwelint/neo4j/releases{/id}","deployments_url":"https://api.github.com/repos/tinwelint/neo4j/deployments","created_at":"2012-11-13T07:24:49Z","updated_at":"2014-12-16T07:20:14Z","pushed_at":"2016-12-07T08:00:39Z","git_url":"git://github.com/tinwelint/neo4j.git","ssh_url":"git@github.com:tinwelint/neo4j.git","clone_url":"https://github.com/tinwelint/neo4j.git","svn_url":"https://github.com/tinwelint/neo4j","homepage":null,"size":338156,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"neo4j:3.2","ref":"3.2","sha":"129f7b8a7bce23d5590edab588953cb05bea2b9a","user":{"login":"neo4j","id":201120,"avatar_url":"https://avatars.githubusercontent.com/u/201120?v=3","gravatar_id":"","url":"https://api.github.com/users/neo4j","html_url":"https://github.com/neo4j","followers_url":"https://api.github.com/users/neo4j/followers","following_url":"https://api.github.com/users/neo4j/following{/other_user}","gists_url":"https://api.github.com/users/neo4j/gists{/gist_id}","starred_url":"https://api.github.com/users/neo4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/neo4j/subscriptions","organizations_url":"https://api.github.com/users/neo4j/orgs","repos_url":"https://api.github.com/users/neo4j/repos","events_url":"https://api.github.com/users/neo4j/events{/privacy}","received_events_url":"https://api.github.com/users/neo4j/received_events","type":"Organization","site_admin":false},"repo":{"id":6650539,"name":"neo4j","full_name":"neo4j/neo4j","owner":{"login":"neo4j","id":201120,"avatar_url":"https://avatars.githubusercontent.com/u/201120?v=3","gravatar_id":"","url":"https://api.github.com/users/neo4j","html_url":"https://github.com/neo4j","followers_url":"https://api.github.com/users/neo4j/followers","following_url":"https://api.github.com/users/neo4j/following{/other_user}","gists_url":"https://api.github.com/users/neo4j/gists{/gist_id}","starred_url":"https://api.github.com/users/neo4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/neo4j/subscriptions","organizations_url":"https://api.github.com/users/neo4j/orgs","repos_url":"https://api.github.com/users/neo4j/repos","events_url":"https://api.github.com/users/neo4j/events{/privacy}","received_events_url":"https://api.github.com/users/neo4j/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/neo4j/neo4j","description":"Graphs for Everyone","fork":false,"url":"https://api.github.com/repos/neo4j/neo4j","forks_url":"https://api.github.com/repos/neo4j/neo4j/forks","keys_url":"https://api.github.com/repos/neo4j/neo4j/keys{/key_id}","collaborators_url":"https://api.github.com/repos/neo4j/neo4j/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/neo4j/neo4j/teams","hooks_url":"https://api.github.com/repos/neo4j/neo4j/hooks","issue_events_url":"https://api.github.com/repos/neo4j/neo4j/issues/events{/number}","events_url":"https://api.github.com/repos/neo4j/neo4j/events","assignees_url":"https://api.github.com/repos/neo4j/neo4j/assignees{/user}","branches_url":"https://api.github.com/repos/neo4j/neo4j/branches{/branch}","tags_url":"https://api.github.com/repos/neo4j/neo4j/tags","blobs_url":"https://api.github.com/repos/neo4j/neo4j/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/neo4j/neo4j/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/neo4j/neo4j/git/refs{/sha}","trees_url":"https://api.github.com/repos/neo4j/neo4j/git/trees{/sha}","statuses_url":"https://api.github.com/repos/neo4j/neo4j/statuses/{sha}","languages_url":"https://api.github.com/repos/neo4j/neo4j/languages","stargazers_url":"https://api.github.com/repos/neo4j/neo4j/stargazers","contributors_url":"https://api.github.com/repos/neo4j/neo4j/contributors","subscribers_url":"https://api.github.com/repos/neo4j/neo4j/subscribers","subscription_url":"https://api.github.com/repos/neo4j/neo4j/subscription","commits_url":"https://api.github.com/repos/neo4j/neo4j/commits{/sha}","git_commits_url":"https://api.github.com/repos/neo4j/neo4j/git/commits{/sha}","comments_url":"https://api.github.com/repos/neo4j/neo4j/comments{/number}","issue_comment_url":"https://api.github.com/repos/neo4j/neo4j/issues/comments{/number}","contents_url":"https://api.github.com/repos/neo4j/neo4j/contents/{+path}","compare_url":"https://api.github.com/repos/neo4j/neo4j/compare/{base}...{head}","merges_url":"https://api.github.com/repos/neo4j/neo4j/merges","archive_url":"https://api.github.com/repos/neo4j/neo4j/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/neo4j/neo4j/downloads","issues_url":"https://api.github.com/repos/neo4j/neo4j/issues{/number}","pulls_url":"https://api.github.com/repos/neo4j/neo4j/pulls{/number}","milestones_url":"https://api.github.com/repos/neo4j/neo4j/milestones{/number}","notifications_url":"https://api.github.com/repos/neo4j/neo4j/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/neo4j/neo4j/labels{/name}","releases_url":"https://api.github.com/repos/neo4j/neo4j/releases{/id}","deployments_url":"https://api.github.com/repos/neo4j/neo4j/deployments","created_at":"2012-11-12T08:46:15Z","updated_at":"2016-12-11T01:26:41Z","pushed_at":"2016-12-09T16:19:29Z","git_url":"git://github.com/neo4j/neo4j.git","ssh_url":"git@github.com:neo4j/neo4j.git","clone_url":"https://github.com/neo4j/neo4j.git","svn_url":"https://github.com/neo4j/neo4j","homepage":"http://neo4j.com","size":388559,"stargazers_count":3275,"watchers_count":3275,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1034,"mirror_url":null,"open_issues_count":406,"forks":1034,"open_issues":406,"watchers":3275,"default_branch":"3.1"}},"_links":{"self":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/8481"},"html":{"href":"https://github.com/neo4j/neo4j/pull/8481"},"issue":{"href":"https://api.github.com/repos/neo4j/neo4j/issues/8481"},"comments":{"href":"https://api.github.com/repos/neo4j/neo4j/issues/8481/comments"},"review_comments":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/8481/comments"},"review_comment":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/neo4j/neo4j/pulls/8481/commits"},"statuses":{"href":"https://api.github.com/repos/neo4j/neo4j/statuses/4ebd3c2fea6f57af4041d5a87e0501e5d689ad87"}}}}
{"actor":{"display_login":"tinwelint"}}