{"action":"created","comment":{"url":"https://api.github.com/repos/moby/moby/pulls/comments/212759608","pull_request_review_id":149465650,"id":212759608,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMjc1OTYwOA==","diff_hunk":"@@ -127,9 +130,9 @@ func (a *pluginAdapterWithRead) ReadLogs(config ReadConfig) *LogWatcher {\n \n \t\t\tselect {\n \t\t\tcase watcher.Msg <- msg:\n-\t\t\tcase <-watcher.WatchClose():\n-\t\t\t\t// make sure the message we consumed is sent\n-\t\t\t\twatcher.Msg <- msg","path":"daemon/logger/adapter.go","position":32,"original_position":27,"commit_id":"49dc99f12a003d7ac5f52bcc38bf570d0a0531ba","original_commit_id":"25cf98a814379829c576f0d049690de82946b20c","user":{"login":"cpuguy83","id":799078,"node_id":"MDQ6VXNlcjc5OTA3OA==","avatar_url":"https://avatars3.githubusercontent.com/u/799078?v=4","gravatar_id":"","url":"https://api.github.com/users/cpuguy83","html_url":"https://github.com/cpuguy83","followers_url":"https://api.github.com/users/cpuguy83/followers","following_url":"https://api.github.com/users/cpuguy83/following{/other_user}","gists_url":"https://api.github.com/users/cpuguy83/gists{/gist_id}","starred_url":"https://api.github.com/users/cpuguy83/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cpuguy83/subscriptions","organizations_url":"https://api.github.com/users/cpuguy83/orgs","repos_url":"https://api.github.com/users/cpuguy83/repos","events_url":"https://api.github.com/users/cpuguy83/events{/privacy}","received_events_url":"https://api.github.com/users/cpuguy83/received_events","type":"User","site_admin":false},"body":"Could wrap this in a function... like `send(msg logger.Message, chMsg <-logger.Message, watcher logger.Watcher) <-chan struct`\r\nWith the return being a `chan struct{}` so you can keep it in a select if needed (not sure if it would be at the moment).","created_at":"2018-08-24T21:27:51Z","updated_at":"2018-08-24T21:27:51Z","html_url":"https://github.com/moby/moby/pull/37576#discussion_r212759608","pull_request_url":"https://api.github.com/repos/moby/moby/pulls/37576","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/moby/moby/pulls/comments/212759608"},"html":{"href":"https://github.com/moby/moby/pull/37576#discussion_r212759608"},"pull_request":{"href":"https://api.github.com/repos/moby/moby/pulls/37576"}},"in_reply_to_id":210344573},"pull_request":{"url":"https://api.github.com/repos/moby/moby/pulls/37576","id":205307813,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1MzA3ODEz","html_url":"https://github.com/moby/moby/pull/37576","diff_url":"https://github.com/moby/moby/pull/37576.diff","patch_url":"https://github.com/moby/moby/pull/37576.patch","issue_url":"https://api.github.com/repos/moby/moby/issues/37576","number":37576,"state":"open","locked":false,"title":"daemon.ContainerLogs(): fix resource leak on follow","user":{"login":"kolyshkin","id":4522509,"node_id":"MDQ6VXNlcjQ1MjI1MDk=","avatar_url":"https://avatars0.githubusercontent.com/u/4522509?v=4","gravatar_id":"","url":"https://api.github.com/users/kolyshkin","html_url":"https://github.com/kolyshkin","followers_url":"https://api.github.com/users/kolyshkin/followers","following_url":"https://api.github.com/users/kolyshkin/following{/other_user}","gists_url":"https://api.github.com/users/kolyshkin/gists{/gist_id}","starred_url":"https://api.github.com/users/kolyshkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kolyshkin/subscriptions","organizations_url":"https://api.github.com/users/kolyshkin/orgs","repos_url":"https://api.github.com/users/kolyshkin/repos","events_url":"https://api.github.com/users/kolyshkin/events{/privacy}","received_events_url":"https://api.github.com/users/kolyshkin/received_events","type":"User","site_admin":false},"body":"When `daemon.ContainerLogs()` is called with `options.follow=true`\r\n(as in `docker logs --follow`), the `loggerutils.followLogs()`\r\nfunction never returns (even then the logs consumer is gone).\r\nAs a result, all the resources associated with it (including\r\nan opened file descriptor for the log file being read, two FDs\r\nfor a pipe, and two FDs for inotify watch) are never released.\r\n\r\nIf this is repeated (such as by running `docker logs --follow`\r\nand pressing `Ctrl-C` a few times), this results in DoS caused by\r\neither hitting the limit of inotify watches, or the limit of\r\nopened files. The only cure is daemon restart.\r\n\r\nApparently, what happens is:\r\n\r\n1. logs consumer is gone, properly calling `(*LogWatcher).Close()`\r\n\r\n2. `WatchClose()` is properly handled by a dedicated goroutine in\r\n`followLogs()`, cancelling the context.\r\n\r\n3. Upon receiving the `ctx.Done()`, the code tries to _synchronously_\r\nsend the log message to the `logWatcher.Msg` channel. Since the\r\nchannel reader is gone, this operation blocks forever, and\r\nresource cleanup set up in defer statements at the beginning\r\nof `followLogs()` never happens.\r\n\r\nThe fix is to remove the synchronous send.\r\n\r\nThis commit also removes the code after it, which tried to\r\nread and send the rest of the log file. The code in question\r\nfirst appeared in commit c0391bf (\"Split reader interface from\r\nlogger interface\"), but it is still unclear why it is/was\r\nneeded (it makes no sense to write logs once the consumer\r\nsignaled it is no longer interested in those).\r\n\r\nThere are a few alternative approaches to fix the issue,\r\nsuch as:\r\n\r\na. amend the consumer to read all the data from the channel\r\nuntil it is closed. This can be done in, say, `(*LogWatcher) Close()`.\r\nFor one thing, this looks ugly (why read and write useless data?).\r\nAlso, this approach requires closing the channel from the sending\r\nside, which, given the amount of exit paths, looks less elegant\r\nthan a solution in this commit.\r\n\r\nb. always write to the channel asynchronously (i.e. in a non-blocking\r\nfashion, i.e. inside a select). This is actually what happens\r\nin the code after this commit.\r\n\r\nShould fix https://github.com/moby/moby/issues/37391\r\n\r\n![Щас спою!](https://img-fotki.yandex.ru/get/62627/12959330.fb/0_147c37_f66a40bf_orig)\r\n*image from https://dubikvit.livejournal.com/409094.html*","created_at":"2018-08-01T04:46:12Z","updated_at":"2018-08-24T21:27:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"db0e129db32b960c896449c2972dec821fc2d6bb","assignee":{"login":"AkihiroSuda","id":9248427,"node_id":"MDQ6VXNlcjkyNDg0Mjc=","avatar_url":"https://avatars2.githubusercontent.com/u/9248427?v=4","gravatar_id":"","url":"https://api.github.com/users/AkihiroSuda","html_url":"https://github.com/AkihiroSuda","followers_url":"https://api.github.com/users/AkihiroSuda/followers","following_url":"https://api.github.com/users/AkihiroSuda/following{/other_user}","gists_url":"https://api.github.com/users/AkihiroSuda/gists{/gist_id}","starred_url":"https://api.github.com/users/AkihiroSuda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AkihiroSuda/subscriptions","organizations_url":"https://api.github.com/users/AkihiroSuda/orgs","repos_url":"https://api.github.com/users/AkihiroSuda/repos","events_url":"https://api.github.com/users/AkihiroSuda/events{/privacy}","received_events_url":"https://api.github.com/users/AkihiroSuda/received_events","type":"User","site_admin":false},"assignees":[{"login":"AkihiroSuda","id":9248427,"node_id":"MDQ6VXNlcjkyNDg0Mjc=","avatar_url":"https://avatars2.githubusercontent.com/u/9248427?v=4","gravatar_id":"","url":"https://api.github.com/users/AkihiroSuda","html_url":"https://github.com/AkihiroSuda","followers_url":"https://api.github.com/users/AkihiroSuda/followers","following_url":"https://api.github.com/users/AkihiroSuda/following{/other_user}","gists_url":"https://api.github.com/users/AkihiroSuda/gists{/gist_id}","starred_url":"https://api.github.com/users/AkihiroSuda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AkihiroSuda/subscriptions","organizations_url":"https://api.github.com/users/AkihiroSuda/orgs","repos_url":"https://api.github.com/users/AkihiroSuda/repos","events_url":"https://api.github.com/users/AkihiroSuda/events{/privacy}","received_events_url":"https://api.github.com/users/AkihiroSuda/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"vdemeester","id":6508,"node_id":"MDQ6VXNlcjY1MDg=","avatar_url":"https://avatars0.githubusercontent.com/u/6508?v=4","gravatar_id":"","url":"https://api.github.com/users/vdemeester","html_url":"https://github.com/vdemeester","followers_url":"https://api.github.com/users/vdemeester/followers","following_url":"https://api.github.com/users/vdemeester/following{/other_user}","gists_url":"https://api.github.com/users/vdemeester/gists{/gist_id}","starred_url":"https://api.github.com/users/vdemeester/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vdemeester/subscriptions","organizations_url":"https://api.github.com/users/vdemeester/orgs","repos_url":"https://api.github.com/users/vdemeester/repos","events_url":"https://api.github.com/users/vdemeester/events{/privacy}","received_events_url":"https://api.github.com/users/vdemeester/received_events","type":"User","site_admin":false},{"login":"thaJeztah","id":1804568,"node_id":"MDQ6VXNlcjE4MDQ1Njg=","avatar_url":"https://avatars2.githubusercontent.com/u/1804568?v=4","gravatar_id":"","url":"https://api.github.com/users/thaJeztah","html_url":"https://github.com/thaJeztah","followers_url":"https://api.github.com/users/thaJeztah/followers","following_url":"https://api.github.com/users/thaJeztah/following{/other_user}","gists_url":"https://api.github.com/users/thaJeztah/gists{/gist_id}","starred_url":"https://api.github.com/users/thaJeztah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaJeztah/subscriptions","organizations_url":"https://api.github.com/users/thaJeztah/orgs","repos_url":"https://api.github.com/users/thaJeztah/repos","events_url":"https://api.github.com/users/thaJeztah/events{/privacy}","received_events_url":"https://api.github.com/users/thaJeztah/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":70404987,"node_id":"MDU6TGFiZWw3MDQwNDk4Nw==","url":"https://api.github.com/repos/moby/moby/labels/area/logging","name":"area/logging","color":"fbca04","default":false},{"id":175375407,"node_id":"MDU6TGFiZWwxNzUzNzU0MDc=","url":"https://api.github.com/repos/moby/moby/labels/status/2-code-review","name":"status/2-code-review","color":"fad8c7","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/moby/moby/pulls/37576/commits","review_comments_url":"https://api.github.com/repos/moby/moby/pulls/37576/comments","review_comment_url":"https://api.github.com/repos/moby/moby/pulls/comments{/number}","comments_url":"https://api.github.com/repos/moby/moby/issues/37576/comments","statuses_url":"https://api.github.com/repos/moby/moby/statuses/49dc99f12a003d7ac5f52bcc38bf570d0a0531ba","head":{"label":"kolyshkin:logs-f-leak","ref":"logs-f-leak","sha":"49dc99f12a003d7ac5f52bcc38bf570d0a0531ba","user":{"login":"kolyshkin","id":4522509,"node_id":"MDQ6VXNlcjQ1MjI1MDk=","avatar_url":"https://avatars0.githubusercontent.com/u/4522509?v=4","gravatar_id":"","url":"https://api.github.com/users/kolyshkin","html_url":"https://github.com/kolyshkin","followers_url":"https://api.github.com/users/kolyshkin/followers","following_url":"https://api.github.com/users/kolyshkin/following{/other_user}","gists_url":"https://api.github.com/users/kolyshkin/gists{/gist_id}","starred_url":"https://api.github.com/users/kolyshkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kolyshkin/subscriptions","organizations_url":"https://api.github.com/users/kolyshkin/orgs","repos_url":"https://api.github.com/users/kolyshkin/repos","events_url":"https://api.github.com/users/kolyshkin/events{/privacy}","received_events_url":"https://api.github.com/users/kolyshkin/received_events","type":"User","site_admin":false},"repo":{"id":38019281,"node_id":"MDEwOlJlcG9zaXRvcnkzODAxOTI4MQ==","name":"moby","full_name":"kolyshkin/moby","owner":{"login":"kolyshkin","id":4522509,"node_id":"MDQ6VXNlcjQ1MjI1MDk=","avatar_url":"https://avatars0.githubusercontent.com/u/4522509?v=4","gravatar_id":"","url":"https://api.github.com/users/kolyshkin","html_url":"https://github.com/kolyshkin","followers_url":"https://api.github.com/users/kolyshkin/followers","following_url":"https://api.github.com/users/kolyshkin/following{/other_user}","gists_url":"https://api.github.com/users/kolyshkin/gists{/gist_id}","starred_url":"https://api.github.com/users/kolyshkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kolyshkin/subscriptions","organizations_url":"https://api.github.com/users/kolyshkin/orgs","repos_url":"https://api.github.com/users/kolyshkin/repos","events_url":"https://api.github.com/users/kolyshkin/events{/privacy}","received_events_url":"https://api.github.com/users/kolyshkin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kolyshkin/moby","description":"Moby Project - a collaborative project for the container ecosystem to assemble container-based systems","fork":true,"url":"https://api.github.com/repos/kolyshkin/moby","forks_url":"https://api.github.com/repos/kolyshkin/moby/forks","keys_url":"https://api.github.com/repos/kolyshkin/moby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kolyshkin/moby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kolyshkin/moby/teams","hooks_url":"https://api.github.com/repos/kolyshkin/moby/hooks","issue_events_url":"https://api.github.com/repos/kolyshkin/moby/issues/events{/number}","events_url":"https://api.github.com/repos/kolyshkin/moby/events","assignees_url":"https://api.github.com/repos/kolyshkin/moby/assignees{/user}","branches_url":"https://api.github.com/repos/kolyshkin/moby/branches{/branch}","tags_url":"https://api.github.com/repos/kolyshkin/moby/tags","blobs_url":"https://api.github.com/repos/kolyshkin/moby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kolyshkin/moby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kolyshkin/moby/git/refs{/sha}","trees_url":"https://api.github.com/repos/kolyshkin/moby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kolyshkin/moby/statuses/{sha}","languages_url":"https://api.github.com/repos/kolyshkin/moby/languages","stargazers_url":"https://api.github.com/repos/kolyshkin/moby/stargazers","contributors_url":"https://api.github.com/repos/kolyshkin/moby/contributors","subscribers_url":"https://api.github.com/repos/kolyshkin/moby/subscribers","subscription_url":"https://api.github.com/repos/kolyshkin/moby/subscription","commits_url":"https://api.github.com/repos/kolyshkin/moby/commits{/sha}","git_commits_url":"https://api.github.com/repos/kolyshkin/moby/git/commits{/sha}","comments_url":"https://api.github.com/repos/kolyshkin/moby/comments{/number}","issue_comment_url":"https://api.github.com/repos/kolyshkin/moby/issues/comments{/number}","contents_url":"https://api.github.com/repos/kolyshkin/moby/contents/{+path}","compare_url":"https://api.github.com/repos/kolyshkin/moby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kolyshkin/moby/merges","archive_url":"https://api.github.com/repos/kolyshkin/moby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kolyshkin/moby/downloads","issues_url":"https://api.github.com/repos/kolyshkin/moby/issues{/number}","pulls_url":"https://api.github.com/repos/kolyshkin/moby/pulls{/number}","milestones_url":"https://api.github.com/repos/kolyshkin/moby/milestones{/number}","notifications_url":"https://api.github.com/repos/kolyshkin/moby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kolyshkin/moby/labels{/name}","releases_url":"https://api.github.com/repos/kolyshkin/moby/releases{/id}","deployments_url":"https://api.github.com/repos/kolyshkin/moby/deployments","created_at":"2015-06-25T00:51:53Z","updated_at":"2017-06-20T21:10:05Z","pushed_at":"2018-08-24T20:47:59Z","git_url":"git://github.com/kolyshkin/moby.git","ssh_url":"git@github.com:kolyshkin/moby.git","clone_url":"https://github.com/kolyshkin/moby.git","svn_url":"https://github.com/kolyshkin/moby","homepage":"https://mobyproject.org/","size":133488,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"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":"moby:master","ref":"master","sha":"0d9d86107d1664d351aab6f593fdc083b4f2175b","user":{"login":"moby","id":27259197,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3MjU5MTk3","avatar_url":"https://avatars1.githubusercontent.com/u/27259197?v=4","gravatar_id":"","url":"https://api.github.com/users/moby","html_url":"https://github.com/moby","followers_url":"https://api.github.com/users/moby/followers","following_url":"https://api.github.com/users/moby/following{/other_user}","gists_url":"https://api.github.com/users/moby/gists{/gist_id}","starred_url":"https://api.github.com/users/moby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moby/subscriptions","organizations_url":"https://api.github.com/users/moby/orgs","repos_url":"https://api.github.com/users/moby/repos","events_url":"https://api.github.com/users/moby/events{/privacy}","received_events_url":"https://api.github.com/users/moby/received_events","type":"Organization","site_admin":false},"repo":{"id":7691631,"node_id":"MDEwOlJlcG9zaXRvcnk3NjkxNjMx","name":"moby","full_name":"moby/moby","owner":{"login":"moby","id":27259197,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3MjU5MTk3","avatar_url":"https://avatars1.githubusercontent.com/u/27259197?v=4","gravatar_id":"","url":"https://api.github.com/users/moby","html_url":"https://github.com/moby","followers_url":"https://api.github.com/users/moby/followers","following_url":"https://api.github.com/users/moby/following{/other_user}","gists_url":"https://api.github.com/users/moby/gists{/gist_id}","starred_url":"https://api.github.com/users/moby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moby/subscriptions","organizations_url":"https://api.github.com/users/moby/orgs","repos_url":"https://api.github.com/users/moby/repos","events_url":"https://api.github.com/users/moby/events{/privacy}","received_events_url":"https://api.github.com/users/moby/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/moby/moby","description":"Moby Project - a collaborative project for the container ecosystem to assemble container-based systems","fork":false,"url":"https://api.github.com/repos/moby/moby","forks_url":"https://api.github.com/repos/moby/moby/forks","keys_url":"https://api.github.com/repos/moby/moby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/moby/moby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/moby/moby/teams","hooks_url":"https://api.github.com/repos/moby/moby/hooks","issue_events_url":"https://api.github.com/repos/moby/moby/issues/events{/number}","events_url":"https://api.github.com/repos/moby/moby/events","assignees_url":"https://api.github.com/repos/moby/moby/assignees{/user}","branches_url":"https://api.github.com/repos/moby/moby/branches{/branch}","tags_url":"https://api.github.com/repos/moby/moby/tags","blobs_url":"https://api.github.com/repos/moby/moby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/moby/moby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/moby/moby/git/refs{/sha}","trees_url":"https://api.github.com/repos/moby/moby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/moby/moby/statuses/{sha}","languages_url":"https://api.github.com/repos/moby/moby/languages","stargazers_url":"https://api.github.com/repos/moby/moby/stargazers","contributors_url":"https://api.github.com/repos/moby/moby/contributors","subscribers_url":"https://api.github.com/repos/moby/moby/subscribers","subscription_url":"https://api.github.com/repos/moby/moby/subscription","commits_url":"https://api.github.com/repos/moby/moby/commits{/sha}","git_commits_url":"https://api.github.com/repos/moby/moby/git/commits{/sha}","comments_url":"https://api.github.com/repos/moby/moby/comments{/number}","issue_comment_url":"https://api.github.com/repos/moby/moby/issues/comments{/number}","contents_url":"https://api.github.com/repos/moby/moby/contents/{+path}","compare_url":"https://api.github.com/repos/moby/moby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/moby/moby/merges","archive_url":"https://api.github.com/repos/moby/moby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/moby/moby/downloads","issues_url":"https://api.github.com/repos/moby/moby/issues{/number}","pulls_url":"https://api.github.com/repos/moby/moby/pulls{/number}","milestones_url":"https://api.github.com/repos/moby/moby/milestones{/number}","notifications_url":"https://api.github.com/repos/moby/moby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/moby/moby/labels{/name}","releases_url":"https://api.github.com/repos/moby/moby/releases{/id}","deployments_url":"https://api.github.com/repos/moby/moby/deployments","created_at":"2013-01-18T18:10:57Z","updated_at":"2018-08-24T17:07:24Z","pushed_at":"2018-08-24T20:29:39Z","git_url":"git://github.com/moby/moby.git","ssh_url":"git@github.com:moby/moby.git","clone_url":"https://github.com/moby/moby.git","svn_url":"https://github.com/moby/moby","homepage":"https://mobyproject.org/","size":138091,"stargazers_count":50068,"watchers_count":50068,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14593,"mirror_url":null,"archived":false,"open_issues_count":3328,"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":14593,"open_issues":3328,"watchers":50068,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/moby/moby/pulls/37576"},"html":{"href":"https://github.com/moby/moby/pull/37576"},"issue":{"href":"https://api.github.com/repos/moby/moby/issues/37576"},"comments":{"href":"https://api.github.com/repos/moby/moby/issues/37576/comments"},"review_comments":{"href":"https://api.github.com/repos/moby/moby/pulls/37576/comments"},"review_comment":{"href":"https://api.github.com/repos/moby/moby/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/moby/moby/pulls/37576/commits"},"statuses":{"href":"https://api.github.com/repos/moby/moby/statuses/49dc99f12a003d7ac5f52bcc38bf570d0a0531ba"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"cpuguy83"}}