{"action":"created","comment":{"url":"https://api.github.com/repos/pravega/pravega/pulls/comments/220777012","pull_request_review_id":159261733,"id":220777012,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMDc3NzAxMg==","diff_hunk":"@@ -0,0 +1,61 @@\n+/**\n+ * Copyright (c) 2017 Dell Inc., or its subsidiaries. All Rights Reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ */\n+package io.pravega.common.util.btree;\n+\n+import io.pravega.common.util.ByteArraySegment;\n+import java.io.Serializable;\n+import java.util.Comparator;\n+\n+/**\n+ * Compares two byte arrays of the same length.\n+ */\n+class ByteArrayComparator implements Comparator<byte[]>, Serializable {","path":"common/src/main/java/io/pravega/common/util/btree/ByteArrayComparator.java","position":19,"original_position":19,"commit_id":"56cdffec0627412262c64621c1c919e79033c697","original_commit_id":"56cdffec0627412262c64621c1c919e79033c697","user":{"login":"tkaitchuck","id":4756752,"node_id":"MDQ6VXNlcjQ3NTY3NTI=","avatar_url":"https://avatars1.githubusercontent.com/u/4756752?v=4","gravatar_id":"","url":"https://api.github.com/users/tkaitchuck","html_url":"https://github.com/tkaitchuck","followers_url":"https://api.github.com/users/tkaitchuck/followers","following_url":"https://api.github.com/users/tkaitchuck/following{/other_user}","gists_url":"https://api.github.com/users/tkaitchuck/gists{/gist_id}","starred_url":"https://api.github.com/users/tkaitchuck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tkaitchuck/subscriptions","organizations_url":"https://api.github.com/users/tkaitchuck/orgs","repos_url":"https://api.github.com/users/tkaitchuck/repos","events_url":"https://api.github.com/users/tkaitchuck/events{/privacy}","received_events_url":"https://api.github.com/users/tkaitchuck/received_events","type":"User","site_admin":false},"body":"Declare this class final","created_at":"2018-09-27T02:23:17Z","updated_at":"2018-09-27T02:29:47Z","html_url":"https://github.com/pravega/pravega/pull/2842#discussion_r220777012","pull_request_url":"https://api.github.com/repos/pravega/pravega/pulls/2842","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega/pulls/comments/220777012"},"html":{"href":"https://github.com/pravega/pravega/pull/2842#discussion_r220777012"},"pull_request":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2842"}}},"pull_request":{"url":"https://api.github.com/repos/pravega/pravega/pulls/2842","id":209258069,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MjU4MDY5","html_url":"https://github.com/pravega/pravega/pull/2842","diff_url":"https://github.com/pravega/pravega/pull/2842.diff","patch_url":"https://github.com/pravega/pravega/pull/2842.patch","issue_url":"https://api.github.com/repos/pravega/pravega/issues/2842","number":2842,"state":"open","locked":false,"title":"Issue 2745: (SegmentStore) Extended Attributes implemented by a B+Tree in Tier2","user":{"login":"andreipaduroiu","id":14354377,"node_id":"MDQ6VXNlcjE0MzU0Mzc3","avatar_url":"https://avatars2.githubusercontent.com/u/14354377?v=4","gravatar_id":"","url":"https://api.github.com/users/andreipaduroiu","html_url":"https://github.com/andreipaduroiu","followers_url":"https://api.github.com/users/andreipaduroiu/followers","following_url":"https://api.github.com/users/andreipaduroiu/following{/other_user}","gists_url":"https://api.github.com/users/andreipaduroiu/gists{/gist_id}","starred_url":"https://api.github.com/users/andreipaduroiu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andreipaduroiu/subscriptions","organizations_url":"https://api.github.com/users/andreipaduroiu/orgs","repos_url":"https://api.github.com/users/andreipaduroiu/repos","events_url":"https://api.github.com/users/andreipaduroiu/events{/privacy}","received_events_url":"https://api.github.com/users/andreipaduroiu/received_events","type":"User","site_admin":false},"body":"**Change log description**  \r\n- Updated Extended Attributes Tier2 implementation to use a custom-made B+Tree implementation. Nothing is changed about Extended Attributes upstream.\r\n- Added a B+Tree implementation which supports fixed-length Keys and fixed-length Values and which operates on an append-only media.\r\n\r\n**Purpose of the change**  \r\nFixes #2745. \r\nNot in scope: index compaction (#2834).\r\n\r\n**What the code does**  \r\n- Currently Extended Attributes are stored linearly in Tier2. Every update appends to the end of a file and after some number of updates, the file is read in its entirety and compressed into a snapshot which contains the latest information. While this provides a simple method with fast writes and rather compact files, getting any data from this will take a long time as the number of attributes increased. For a segment with 1M Extended Attributes, the file will have 24-48MB, and all of that will have to be read in order to look up a single value.\r\n- A better solution is needed in order to support the needs of the upcoming KVS/Tables, which will make extensive use of extended attributes. 1M extended attributes per segment will not be very useful in those cases, and we are looking for an implementation where we can potentially store up to 1B extended attributes without breaking a sweat for inserts or lookups. This can be done by organizing the extended attributes as B+Tree in Tier2.\r\n-**B+Tree**\r\n    - Supports fixed-length keys and fixed-length values (16 bytes and 8 bytes, respectively). This constraint has been added in order to make lookups much easier. (The traditional B+Tree implementation does not have this constraint).\r\n    - Has a maximum page size (page == node). The traditional B+Tree implementation defines a branching factor, but in our case this can be calculated from the maximum pages size and entry length (key length + value length).\r\n    - Supports an append-only storage medium. Traditional B+Tree implementations have the luxury of operating on random-access files, which allows them to update existing pages. In our case, any updates to a page will involve re-writing that page (and all its ancestors) back to the Segment.\r\n        - This poses additional problems, such as an explosive file growth. This is widely acknowledged as a downside to such designs, but there are a couple of ways we can make that less painful. Issue #2834 aims to improve that.\r\n    - Supports `insert`, `update`, `get` and `iterate`. All of these, except `iterate`, are used today, but `iterate` is needed for KVS/Tables. \r\n    - Please refer to the Javadoc of `BTreeIndex` and `BTreePage` for a detailed explanation of how those work.\r\n\r\n**How to verify it**  \r\nNew unit tests for `BTreeIndex` and `BTreePage` with 95% code coverage.\r\nRewrote unit tests for the Extended Attributes Tier2 implementation (actually rewrote the whole class, which required new tests).\r\nSystem tests passed (Branch build 655).\r\nAdded Load Tests that were used to simulate the size & shape of the Tier2 file for various load patterns.\r\n","created_at":"2018-08-17T21:08:18Z","updated_at":"2018-09-27T02:29:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f28aca793ab7063acc0253d6da0b3a23624ce4a0","assignee":{"login":"fpj","id":572920,"node_id":"MDQ6VXNlcjU3MjkyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/572920?v=4","gravatar_id":"","url":"https://api.github.com/users/fpj","html_url":"https://github.com/fpj","followers_url":"https://api.github.com/users/fpj/followers","following_url":"https://api.github.com/users/fpj/following{/other_user}","gists_url":"https://api.github.com/users/fpj/gists{/gist_id}","starred_url":"https://api.github.com/users/fpj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fpj/subscriptions","organizations_url":"https://api.github.com/users/fpj/orgs","repos_url":"https://api.github.com/users/fpj/repos","events_url":"https://api.github.com/users/fpj/events{/privacy}","received_events_url":"https://api.github.com/users/fpj/received_events","type":"User","site_admin":false},"assignees":[{"login":"fpj","id":572920,"node_id":"MDQ6VXNlcjU3MjkyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/572920?v=4","gravatar_id":"","url":"https://api.github.com/users/fpj","html_url":"https://github.com/fpj","followers_url":"https://api.github.com/users/fpj/followers","following_url":"https://api.github.com/users/fpj/following{/other_user}","gists_url":"https://api.github.com/users/fpj/gists{/gist_id}","starred_url":"https://api.github.com/users/fpj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fpj/subscriptions","organizations_url":"https://api.github.com/users/fpj/orgs","repos_url":"https://api.github.com/users/fpj/repos","events_url":"https://api.github.com/users/fpj/events{/privacy}","received_events_url":"https://api.github.com/users/fpj/received_events","type":"User","site_admin":false},{"login":"tkaitchuck","id":4756752,"node_id":"MDQ6VXNlcjQ3NTY3NTI=","avatar_url":"https://avatars1.githubusercontent.com/u/4756752?v=4","gravatar_id":"","url":"https://api.github.com/users/tkaitchuck","html_url":"https://github.com/tkaitchuck","followers_url":"https://api.github.com/users/tkaitchuck/followers","following_url":"https://api.github.com/users/tkaitchuck/following{/other_user}","gists_url":"https://api.github.com/users/tkaitchuck/gists{/gist_id}","starred_url":"https://api.github.com/users/tkaitchuck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tkaitchuck/subscriptions","organizations_url":"https://api.github.com/users/tkaitchuck/orgs","repos_url":"https://api.github.com/users/tkaitchuck/repos","events_url":"https://api.github.com/users/tkaitchuck/events{/privacy}","received_events_url":"https://api.github.com/users/tkaitchuck/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"fpj","id":572920,"node_id":"MDQ6VXNlcjU3MjkyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/572920?v=4","gravatar_id":"","url":"https://api.github.com/users/fpj","html_url":"https://github.com/fpj","followers_url":"https://api.github.com/users/fpj/followers","following_url":"https://api.github.com/users/fpj/following{/other_user}","gists_url":"https://api.github.com/users/fpj/gists{/gist_id}","starred_url":"https://api.github.com/users/fpj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fpj/subscriptions","organizations_url":"https://api.github.com/users/fpj/orgs","repos_url":"https://api.github.com/users/fpj/repos","events_url":"https://api.github.com/users/fpj/events{/privacy}","received_events_url":"https://api.github.com/users/fpj/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/pravega/pravega/pulls/2842/commits","review_comments_url":"https://api.github.com/repos/pravega/pravega/pulls/2842/comments","review_comment_url":"https://api.github.com/repos/pravega/pravega/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pravega/pravega/issues/2842/comments","statuses_url":"https://api.github.com/repos/pravega/pravega/statuses/56cdffec0627412262c64621c1c919e79033c697","head":{"label":"andreipaduroiu:issue-2745-ea-btree","ref":"issue-2745-ea-btree","sha":"56cdffec0627412262c64621c1c919e79033c697","user":{"login":"andreipaduroiu","id":14354377,"node_id":"MDQ6VXNlcjE0MzU0Mzc3","avatar_url":"https://avatars2.githubusercontent.com/u/14354377?v=4","gravatar_id":"","url":"https://api.github.com/users/andreipaduroiu","html_url":"https://github.com/andreipaduroiu","followers_url":"https://api.github.com/users/andreipaduroiu/followers","following_url":"https://api.github.com/users/andreipaduroiu/following{/other_user}","gists_url":"https://api.github.com/users/andreipaduroiu/gists{/gist_id}","starred_url":"https://api.github.com/users/andreipaduroiu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andreipaduroiu/subscriptions","organizations_url":"https://api.github.com/users/andreipaduroiu/orgs","repos_url":"https://api.github.com/users/andreipaduroiu/repos","events_url":"https://api.github.com/users/andreipaduroiu/events{/privacy}","received_events_url":"https://api.github.com/users/andreipaduroiu/received_events","type":"User","site_admin":false},"repo":{"id":136227276,"node_id":"MDEwOlJlcG9zaXRvcnkxMzYyMjcyNzY=","name":"pravega","full_name":"andreipaduroiu/pravega","private":false,"owner":{"login":"andreipaduroiu","id":14354377,"node_id":"MDQ6VXNlcjE0MzU0Mzc3","avatar_url":"https://avatars2.githubusercontent.com/u/14354377?v=4","gravatar_id":"","url":"https://api.github.com/users/andreipaduroiu","html_url":"https://github.com/andreipaduroiu","followers_url":"https://api.github.com/users/andreipaduroiu/followers","following_url":"https://api.github.com/users/andreipaduroiu/following{/other_user}","gists_url":"https://api.github.com/users/andreipaduroiu/gists{/gist_id}","starred_url":"https://api.github.com/users/andreipaduroiu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andreipaduroiu/subscriptions","organizations_url":"https://api.github.com/users/andreipaduroiu/orgs","repos_url":"https://api.github.com/users/andreipaduroiu/repos","events_url":"https://api.github.com/users/andreipaduroiu/events{/privacy}","received_events_url":"https://api.github.com/users/andreipaduroiu/received_events","type":"User","site_admin":false},"html_url":"https://github.com/andreipaduroiu/pravega","description":"Pravega - Streaming as a new software defined storage primitive","fork":true,"url":"https://api.github.com/repos/andreipaduroiu/pravega","forks_url":"https://api.github.com/repos/andreipaduroiu/pravega/forks","keys_url":"https://api.github.com/repos/andreipaduroiu/pravega/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andreipaduroiu/pravega/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andreipaduroiu/pravega/teams","hooks_url":"https://api.github.com/repos/andreipaduroiu/pravega/hooks","issue_events_url":"https://api.github.com/repos/andreipaduroiu/pravega/issues/events{/number}","events_url":"https://api.github.com/repos/andreipaduroiu/pravega/events","assignees_url":"https://api.github.com/repos/andreipaduroiu/pravega/assignees{/user}","branches_url":"https://api.github.com/repos/andreipaduroiu/pravega/branches{/branch}","tags_url":"https://api.github.com/repos/andreipaduroiu/pravega/tags","blobs_url":"https://api.github.com/repos/andreipaduroiu/pravega/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andreipaduroiu/pravega/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andreipaduroiu/pravega/git/refs{/sha}","trees_url":"https://api.github.com/repos/andreipaduroiu/pravega/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andreipaduroiu/pravega/statuses/{sha}","languages_url":"https://api.github.com/repos/andreipaduroiu/pravega/languages","stargazers_url":"https://api.github.com/repos/andreipaduroiu/pravega/stargazers","contributors_url":"https://api.github.com/repos/andreipaduroiu/pravega/contributors","subscribers_url":"https://api.github.com/repos/andreipaduroiu/pravega/subscribers","subscription_url":"https://api.github.com/repos/andreipaduroiu/pravega/subscription","commits_url":"https://api.github.com/repos/andreipaduroiu/pravega/commits{/sha}","git_commits_url":"https://api.github.com/repos/andreipaduroiu/pravega/git/commits{/sha}","comments_url":"https://api.github.com/repos/andreipaduroiu/pravega/comments{/number}","issue_comment_url":"https://api.github.com/repos/andreipaduroiu/pravega/issues/comments{/number}","contents_url":"https://api.github.com/repos/andreipaduroiu/pravega/contents/{+path}","compare_url":"https://api.github.com/repos/andreipaduroiu/pravega/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andreipaduroiu/pravega/merges","archive_url":"https://api.github.com/repos/andreipaduroiu/pravega/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andreipaduroiu/pravega/downloads","issues_url":"https://api.github.com/repos/andreipaduroiu/pravega/issues{/number}","pulls_url":"https://api.github.com/repos/andreipaduroiu/pravega/pulls{/number}","milestones_url":"https://api.github.com/repos/andreipaduroiu/pravega/milestones{/number}","notifications_url":"https://api.github.com/repos/andreipaduroiu/pravega/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andreipaduroiu/pravega/labels{/name}","releases_url":"https://api.github.com/repos/andreipaduroiu/pravega/releases{/id}","deployments_url":"https://api.github.com/repos/andreipaduroiu/pravega/deployments","created_at":"2018-06-05T19:49:10Z","updated_at":"2018-06-05T19:55:27Z","pushed_at":"2018-09-26T23:23:54Z","git_url":"git://github.com/andreipaduroiu/pravega.git","ssh_url":"git@github.com:andreipaduroiu/pravega.git","clone_url":"https://github.com/andreipaduroiu/pravega.git","svn_url":"https://github.com/andreipaduroiu/pravega","homepage":"http://pravega.io","size":25905,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pravega:master","ref":"master","sha":"a125cf28fd36adb70af11b44d955e57695711584","user":{"login":"pravega","id":25698199,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1Njk4MTk5","avatar_url":"https://avatars1.githubusercontent.com/u/25698199?v=4","gravatar_id":"","url":"https://api.github.com/users/pravega","html_url":"https://github.com/pravega","followers_url":"https://api.github.com/users/pravega/followers","following_url":"https://api.github.com/users/pravega/following{/other_user}","gists_url":"https://api.github.com/users/pravega/gists{/gist_id}","starred_url":"https://api.github.com/users/pravega/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pravega/subscriptions","organizations_url":"https://api.github.com/users/pravega/orgs","repos_url":"https://api.github.com/users/pravega/repos","events_url":"https://api.github.com/users/pravega/events{/privacy}","received_events_url":"https://api.github.com/users/pravega/received_events","type":"Organization","site_admin":false},"repo":{"id":63096822,"node_id":"MDEwOlJlcG9zaXRvcnk2MzA5NjgyMg==","name":"pravega","full_name":"pravega/pravega","private":false,"owner":{"login":"pravega","id":25698199,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1Njk4MTk5","avatar_url":"https://avatars1.githubusercontent.com/u/25698199?v=4","gravatar_id":"","url":"https://api.github.com/users/pravega","html_url":"https://github.com/pravega","followers_url":"https://api.github.com/users/pravega/followers","following_url":"https://api.github.com/users/pravega/following{/other_user}","gists_url":"https://api.github.com/users/pravega/gists{/gist_id}","starred_url":"https://api.github.com/users/pravega/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pravega/subscriptions","organizations_url":"https://api.github.com/users/pravega/orgs","repos_url":"https://api.github.com/users/pravega/repos","events_url":"https://api.github.com/users/pravega/events{/privacy}","received_events_url":"https://api.github.com/users/pravega/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/pravega/pravega","description":"Pravega - Streaming as a new software defined storage primitive","fork":false,"url":"https://api.github.com/repos/pravega/pravega","forks_url":"https://api.github.com/repos/pravega/pravega/forks","keys_url":"https://api.github.com/repos/pravega/pravega/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pravega/pravega/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pravega/pravega/teams","hooks_url":"https://api.github.com/repos/pravega/pravega/hooks","issue_events_url":"https://api.github.com/repos/pravega/pravega/issues/events{/number}","events_url":"https://api.github.com/repos/pravega/pravega/events","assignees_url":"https://api.github.com/repos/pravega/pravega/assignees{/user}","branches_url":"https://api.github.com/repos/pravega/pravega/branches{/branch}","tags_url":"https://api.github.com/repos/pravega/pravega/tags","blobs_url":"https://api.github.com/repos/pravega/pravega/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pravega/pravega/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pravega/pravega/git/refs{/sha}","trees_url":"https://api.github.com/repos/pravega/pravega/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pravega/pravega/statuses/{sha}","languages_url":"https://api.github.com/repos/pravega/pravega/languages","stargazers_url":"https://api.github.com/repos/pravega/pravega/stargazers","contributors_url":"https://api.github.com/repos/pravega/pravega/contributors","subscribers_url":"https://api.github.com/repos/pravega/pravega/subscribers","subscription_url":"https://api.github.com/repos/pravega/pravega/subscription","commits_url":"https://api.github.com/repos/pravega/pravega/commits{/sha}","git_commits_url":"https://api.github.com/repos/pravega/pravega/git/commits{/sha}","comments_url":"https://api.github.com/repos/pravega/pravega/comments{/number}","issue_comment_url":"https://api.github.com/repos/pravega/pravega/issues/comments{/number}","contents_url":"https://api.github.com/repos/pravega/pravega/contents/{+path}","compare_url":"https://api.github.com/repos/pravega/pravega/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pravega/pravega/merges","archive_url":"https://api.github.com/repos/pravega/pravega/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pravega/pravega/downloads","issues_url":"https://api.github.com/repos/pravega/pravega/issues{/number}","pulls_url":"https://api.github.com/repos/pravega/pravega/pulls{/number}","milestones_url":"https://api.github.com/repos/pravega/pravega/milestones{/number}","notifications_url":"https://api.github.com/repos/pravega/pravega/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pravega/pravega/labels{/name}","releases_url":"https://api.github.com/repos/pravega/pravega/releases{/id}","deployments_url":"https://api.github.com/repos/pravega/pravega/deployments","created_at":"2016-07-11T19:41:03Z","updated_at":"2018-09-27T01:23:10Z","pushed_at":"2018-09-26T23:23:56Z","git_url":"git://github.com/pravega/pravega.git","ssh_url":"git@github.com:pravega/pravega.git","clone_url":"https://github.com/pravega/pravega.git","svn_url":"https://github.com/pravega/pravega","homepage":"http://pravega.io","size":26667,"stargazers_count":258,"watchers_count":258,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":88,"mirror_url":null,"archived":false,"open_issues_count":357,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":88,"open_issues":357,"watchers":258,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2842"},"html":{"href":"https://github.com/pravega/pravega/pull/2842"},"issue":{"href":"https://api.github.com/repos/pravega/pravega/issues/2842"},"comments":{"href":"https://api.github.com/repos/pravega/pravega/issues/2842/comments"},"review_comments":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2842/comments"},"review_comment":{"href":"https://api.github.com/repos/pravega/pravega/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2842/commits"},"statuses":{"href":"https://api.github.com/repos/pravega/pravega/statuses/56cdffec0627412262c64621c1c919e79033c697"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"tkaitchuck"}}