{"action":"created","comment":{"url":"https://api.github.com/repos/pravega/pravega/pulls/comments/178198113","pull_request_review_id":108224232,"id":178198113,"diff_hunk":"@@ -48,7 +47,7 @@\n     private HDFSSegmentHandle(String segmentName, boolean readOnly, List<FileDescriptor> files) {\n         this.segmentName = Exceptions.checkNotNullOrEmpty(segmentName, \"segmentName\");\n         this.readOnly = readOnly;\n-        this.files = Exceptions.checkNotNullOrEmpty(files, \"files\");","path":"segmentstore/storage/impl/src/main/java/io/pravega/segmentstore/storage/impl/hdfs/HDFSSegmentHandle.java","position":null,"original_position":19,"commit_id":"86aae70adea62e185b5fb3ba5a48ef61782fe6f5","original_commit_id":"a8db12d13cd18d7ef98958b5f148008059645d43","user":{"login":"arvindkandhare","id":2305381,"avatar_url":"https://avatars1.githubusercontent.com/u/2305381?v=4","gravatar_id":"","url":"https://api.github.com/users/arvindkandhare","html_url":"https://github.com/arvindkandhare","followers_url":"https://api.github.com/users/arvindkandhare/followers","following_url":"https://api.github.com/users/arvindkandhare/following{/other_user}","gists_url":"https://api.github.com/users/arvindkandhare/gists{/gist_id}","starred_url":"https://api.github.com/users/arvindkandhare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvindkandhare/subscriptions","organizations_url":"https://api.github.com/users/arvindkandhare/orgs","repos_url":"https://api.github.com/users/arvindkandhare/repos","events_url":"https://api.github.com/users/arvindkandhare/events{/privacy}","received_events_url":"https://api.github.com/users/arvindkandhare/received_events","type":"User","site_admin":false},"body":"Fixed.","created_at":"2018-03-29T22:29:08Z","updated_at":"2018-03-29T22:29:09Z","html_url":"https://github.com/pravega/pravega/pull/2401#discussion_r178198113","pull_request_url":"https://api.github.com/repos/pravega/pravega/pulls/2401","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega/pulls/comments/178198113"},"html":{"href":"https://github.com/pravega/pravega/pull/2401#discussion_r178198113"},"pull_request":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2401"}},"in_reply_to_id":178105836},"pull_request":{"url":"https://api.github.com/repos/pravega/pravega/pulls/2401","id":177946601,"html_url":"https://github.com/pravega/pravega/pull/2401","diff_url":"https://github.com/pravega/pravega/pull/2401.diff","patch_url":"https://github.com/pravega/pravega/pull/2401.patch","issue_url":"https://api.github.com/repos/pravega/pravega/issues/2401","number":2401,"state":"open","locked":false,"title":"Issue 2052: Use rename to fix fencing issue.","user":{"login":"arvindkandhare","id":2305381,"avatar_url":"https://avatars1.githubusercontent.com/u/2305381?v=4","gravatar_id":"","url":"https://api.github.com/users/arvindkandhare","html_url":"https://github.com/arvindkandhare","followers_url":"https://api.github.com/users/arvindkandhare/followers","following_url":"https://api.github.com/users/arvindkandhare/following{/other_user}","gists_url":"https://api.github.com/users/arvindkandhare/gists{/gist_id}","starred_url":"https://api.github.com/users/arvindkandhare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvindkandhare/subscriptions","organizations_url":"https://api.github.com/users/arvindkandhare/orgs","repos_url":"https://api.github.com/users/arvindkandhare/repos","events_url":"https://api.github.com/users/arvindkandhare/events{/privacy}","received_events_url":"https://api.github.com/users/arvindkandhare/received_events","type":"User","site_admin":false},"body":"Signed-off-by: arvindkandhare <arvind.kandhare@emc.com>\r\n\r\n**Change log description**\r\nUse rename to fix fencing issue.\r\n Added test to test zombie fencing. This unit test is taken from #2058. Thanks @andreipaduroiu for the test. \r\n\r\nThe segment is represented by a single file on HDFS. The file is renamed to `segmentName_<epoch>` each time fencing happens.\r\n\r\nRoot cause of the issue:\r\nIt is important that segment fencing depends on one of the atomic behavior of the tier-2 implementation. The current implementation does not actually fence out the old writers in some cases. \r\nFencing should really mean that all the on-going operations on the file fail. Current implementation leaves a scenario out where an ongoing write succeeds even when fencing happens. This is because it depends on `setattr` to stop writes. This call is not atomic.\r\n\r\nThe solution:\r\nThis PR replaces the `openWrite` implementation with `rename` based implementation.\r\nHere is more info about `rename` being atomic.\r\n\r\nfrom: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/filesystem/introduction.html#Atomicity\r\n\r\n```\r\nThere are some operations that MUST be atomic. This is because they are often used to implement locking/exclusive access between processes in a cluster.\r\n\r\nCreating a file. If the overwrite parameter is false, the check and creation MUST be atomic.\r\nDeleting a file.\r\nRenaming a file.\r\nRenaming a directory.\r\nCreating a single directory with mkdir().\r\nRecursive directory deletion MAY be atomic. Although HDFS offers atomic recursive directory deletion, none of the other Hadoop FileSystems offer such a guarantee (including local FileSystems).\r\nMost other operations come with no requirements or guarantees of atomicity.\r\n\r\n```\r\n\r\nHow the code fixes the current issue(#2052 ):\r\n1. Ongoing writes:\r\nIn case of an ownership change, the file is renamed to the latest epoch. The ongoing writes will be ineffective as rename is atomic. (NB: The ongoing writes may continue and return success without the data getting updated. The call to `flush` or `hflush` fails. The failure happens only when call to `complete` happens.)\r\n\r\n2. Fencing:\r\nWhen the segment store with lower epoch tries to write fence the segment, it finds that an higher epoch already exists. In this case the segment store fails the `openWrite` call with `StorageNotPrimaryException`.\r\n\r\nHDFS rename and write behavior:\r\nThere is some confusion about how HDFS rename works and is atomic. The important nuance to note here is that `write` calls to the stream received after calling `append` may not still throw exception. The exception is thrown when the writer tries to update the metadata at the name node through `complete` call. (`complete` may be called through `flush` or `hflush`. These calls are definitely called when `close` is called on the data stream).\r\n\r\nHere is the entry point for HDFS rename:\r\nhttps://github.com/apache/hadoop/blob/88fba00caa8c8e26f70deb9be5b534e7482620a1/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java#L992\r\n\r\nHere is where the lock for the directory is taken:\r\nhttps://github.com/apache/hadoop/blob/4c57fb0cd9344290a9f4f6422c1457d69465eec7/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java#L483\r\n\r\nand here is where the lock is released:\r\nhttps://github.com/apache/hadoop/blob/4c57fb0cd9344290a9f4f6422c1457d69465eec7/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java#L487.\r\n\r\nNow a competing `complete` enters here:\r\nhttps://github.com/apache/hadoop/blob/88fba00caa8c8e26f70deb9be5b534e7482620a1/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java#L924\r\n\r\nThe lock is checked here:\r\nhttps://github.com/apache/hadoop/blob/ac0d402c6a3af784aa8bdceecf3293c30760346f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java#L2660\r\n\r\nSo if there is an ongoing `rename`, this call blocks.\r\nRename replaces the inode and then the call fails with file not found exception.\r\n\r\n \r\n**Purpose of the change**\r\nReintroduces `rename` as a fix for the issue with file chaining solution.\r\n\r\n**What the code does**\r\nDrops the file chaining implements and re-introduces `rename`.\r\n\r\n**How to verify it**\r\nUnit tests.\r\n","created_at":"2018-03-28T07:03:12Z","updated_at":"2018-03-29T22:29:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"728ea5730710dc867ad75c792d02c5d5f0af7d28","assignee":{"login":"arvindkandhare","id":2305381,"avatar_url":"https://avatars1.githubusercontent.com/u/2305381?v=4","gravatar_id":"","url":"https://api.github.com/users/arvindkandhare","html_url":"https://github.com/arvindkandhare","followers_url":"https://api.github.com/users/arvindkandhare/followers","following_url":"https://api.github.com/users/arvindkandhare/following{/other_user}","gists_url":"https://api.github.com/users/arvindkandhare/gists{/gist_id}","starred_url":"https://api.github.com/users/arvindkandhare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvindkandhare/subscriptions","organizations_url":"https://api.github.com/users/arvindkandhare/orgs","repos_url":"https://api.github.com/users/arvindkandhare/repos","events_url":"https://api.github.com/users/arvindkandhare/events{/privacy}","received_events_url":"https://api.github.com/users/arvindkandhare/received_events","type":"User","site_admin":false},"assignees":[{"login":"arvindkandhare","id":2305381,"avatar_url":"https://avatars1.githubusercontent.com/u/2305381?v=4","gravatar_id":"","url":"https://api.github.com/users/arvindkandhare","html_url":"https://github.com/arvindkandhare","followers_url":"https://api.github.com/users/arvindkandhare/followers","following_url":"https://api.github.com/users/arvindkandhare/following{/other_user}","gists_url":"https://api.github.com/users/arvindkandhare/gists{/gist_id}","starred_url":"https://api.github.com/users/arvindkandhare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvindkandhare/subscriptions","organizations_url":"https://api.github.com/users/arvindkandhare/orgs","repos_url":"https://api.github.com/users/arvindkandhare/repos","events_url":"https://api.github.com/users/arvindkandhare/events{/privacy}","received_events_url":"https://api.github.com/users/arvindkandhare/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"fpj","id":572920,"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,"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_teams":[],"labels":[{"id":406474446,"url":"https://api.github.com/repos/pravega/pravega/labels/area/server","name":"area/server","color":"c2e0c6","default":false},{"id":406474443,"url":"https://api.github.com/repos/pravega/pravega/labels/area/tier2","name":"area/tier2","color":"c2e0c6","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/pravega/pravega/pulls/2401/commits","review_comments_url":"https://api.github.com/repos/pravega/pravega/pulls/2401/comments","review_comment_url":"https://api.github.com/repos/pravega/pravega/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pravega/pravega/issues/2401/comments","statuses_url":"https://api.github.com/repos/pravega/pravega/statuses/86aae70adea62e185b5fb3ba5a48ef61782fe6f5","head":{"label":"pravega:issue-2052-hdfsrenamefencing","ref":"issue-2052-hdfsrenamefencing","sha":"86aae70adea62e185b5fb3ba5a48ef61782fe6f5","user":{"login":"pravega","id":25698199,"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,"name":"pravega","full_name":"pravega/pravega","owner":{"login":"pravega","id":25698199,"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},"private":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-03-29T22:04:58Z","pushed_at":"2018-03-29T22:28:39Z","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":23586,"stargazers_count":193,"watchers_count":193,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":61,"mirror_url":null,"archived":false,"open_issues_count":353,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":61,"open_issues":353,"watchers":193,"default_branch":"master"}},"base":{"label":"pravega:master","ref":"master","sha":"3803f1959da1d78050e68f6f507da463a4ca733e","user":{"login":"pravega","id":25698199,"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,"name":"pravega","full_name":"pravega/pravega","owner":{"login":"pravega","id":25698199,"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},"private":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-03-29T22:04:58Z","pushed_at":"2018-03-29T22:28:39Z","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":23586,"stargazers_count":193,"watchers_count":193,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":61,"mirror_url":null,"archived":false,"open_issues_count":353,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":61,"open_issues":353,"watchers":193,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2401"},"html":{"href":"https://github.com/pravega/pravega/pull/2401"},"issue":{"href":"https://api.github.com/repos/pravega/pravega/issues/2401"},"comments":{"href":"https://api.github.com/repos/pravega/pravega/issues/2401/comments"},"review_comments":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2401/comments"},"review_comment":{"href":"https://api.github.com/repos/pravega/pravega/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pravega/pravega/pulls/2401/commits"},"statuses":{"href":"https://api.github.com/repos/pravega/pravega/statuses/86aae70adea62e185b5fb3ba5a48ef61782fe6f5"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"arvindkandhare"}}