{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/50041907","id":50041907,"diff_hunk":"@@ -0,0 +1,245 @@\n+/*\n+Copyright 2015 The Kubernetes Authors 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+Unless required by applicable law or agreed to in writing, software\n+distributed under the License is distributed on an \"AS IS\" BASIS,\n+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+See the License for the specific language governing permissions and\n+limitations under the License.\n+*/\n+\n+package nodeinfocache\n+\n+import (\n+\t\"fmt\"\n+\t\"sync\"\n+\t\"time\"\n+\n+\t\"github.com/golang/glog\"\n+\t\"k8s.io/kubernetes/pkg/api\"\n+\tclientcache \"k8s.io/kubernetes/pkg/client/cache\"\n+\t\"k8s.io/kubernetes/pkg/util\"\n+\t\"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache\"\n+)\n+\n+// New returns a NodeInfoCache implementation.\n+// It automatically starts a go routine that manages expiration of assumed pods.\n+// \"ttl\" is how long the assumed pod will get expired.\n+// \"period\" is how long the background goroutine should wait before cleaning up expired pods periodically.\n+// \"stop\" is the channel that signals stopping and we would close background goroutines.\n+func New(ttl, period time.Duration, stop chan struct{}) schedulercache.NodeInfoCache {\n+\tcache := newNodeInfoCache(ttl, period, stop)\n+\tcache.run()\n+\treturn cache\n+}\n+\n+// mustGetPodKey returns the string key of a pod.\n+// A pod is ensured to have accessor. We don't want to check the error everytime.\n+// TODO: We should consider adding a Key() method to api.Pod\n+func mustGetPodKey(pod *api.Pod) string {\n+\tkey, err := clientcache.MetaNamespaceKeyFunc(pod)\n+\tif err != nil {\n+\t\tpanic(\"api.Pod should have key func: \" + err.Error())\n+\t}\n+\treturn key\n+}\n+\n+type nodeInfoCache struct {\n+\tstop chan struct{}\n+\n+\t// This mutex guards all fields within this cache struct\n+\tmu          sync.Mutex\n+\tttl         time.Duration","path":"plugin/pkg/scheduler/schedulercache/nodeinfocache/node_info_cache.go","position":58,"original_position":58,"commit_id":"5acfa0193e7b38d5da28acb9dd1ac68782c7d5d4","original_commit_id":"5acfa0193e7b38d5da28acb9dd1ac68782c7d5d4","user":{"login":"timothysc","id":169553,"avatar_url":"https://avatars.githubusercontent.com/u/169553?v=3","gravatar_id":"","url":"https://api.github.com/users/timothysc","html_url":"https://github.com/timothysc","followers_url":"https://api.github.com/users/timothysc/followers","following_url":"https://api.github.com/users/timothysc/following{/other_user}","gists_url":"https://api.github.com/users/timothysc/gists{/gist_id}","starred_url":"https://api.github.com/users/timothysc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timothysc/subscriptions","organizations_url":"https://api.github.com/users/timothysc/orgs","repos_url":"https://api.github.com/users/timothysc/repos","events_url":"https://api.github.com/users/timothysc/events{/privacy}","received_events_url":"https://api.github.com/users/timothysc/received_events","type":"User","site_admin":false},"body":"what exactly is the concrete use case from the scheduler in setting a ttl in the cache?  ","created_at":"2016-01-18T20:40:45Z","updated_at":"2016-01-18T20:40:45Z","html_url":"https://github.com/kubernetes/kubernetes/pull/19090#discussion_r50041907","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/50041907"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/19090#discussion_r50041907"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090","id":54568692,"html_url":"https://github.com/kubernetes/kubernetes/pull/19090","diff_url":"https://github.com/kubernetes/kubernetes/pull/19090.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/19090.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/19090","number":19090,"state":"open","locked":false,"title":"scheduler cache: Node level aggregated pods' resource summary","user":{"login":"hongchaodeng","id":920884,"avatar_url":"https://avatars.githubusercontent.com/u/920884?v=3","gravatar_id":"","url":"https://api.github.com/users/hongchaodeng","html_url":"https://github.com/hongchaodeng","followers_url":"https://api.github.com/users/hongchaodeng/followers","following_url":"https://api.github.com/users/hongchaodeng/following{/other_user}","gists_url":"https://api.github.com/users/hongchaodeng/gists{/gist_id}","starred_url":"https://api.github.com/users/hongchaodeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hongchaodeng/subscriptions","organizations_url":"https://api.github.com/users/hongchaodeng/orgs","repos_url":"https://api.github.com/users/hongchaodeng/repos","events_url":"https://api.github.com/users/hongchaodeng/events{/privacy}","received_events_url":"https://api.github.com/users/hongchaodeng/received_events","type":"User","site_admin":false},"body":"This PR provides NodeInfoCache which aggregates pods' resource request and provides node-level resource summary. It's intended to supplant system modeler for efficient lookup in `PodFitsResource`. As we indicated in #18831 that it is the most time-consuming code path and optimizing it would result in 10x improvement. \r\n\r\nThe interface defined in the cache is similar to system modeler and its pod lister. Additionally, we also need Update() and GetNodeInfo(). \r\n\r\nWe have drawn the state machine explicitly to show the workflow and how it interacts with pod events. \r\n\r\nIt would be pretty straight-forward to use this cache into related hooks when state changes happen. That say, when pod is assumed, added, updated, removed. Then we can use the cache to optimize scheduler predicates `PodFitsResources`.","created_at":"2015-12-24T23:52:54Z","updated_at":"2016-01-18T20:40:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"26de553d44e99664118476d3296b363bd56ef831","assignee":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/19090/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/5acfa0193e7b38d5da28acb9dd1ac68782c7d5d4","head":{"label":"hongchaodeng:cache","ref":"cache","sha":"5acfa0193e7b38d5da28acb9dd1ac68782c7d5d4","user":{"login":"hongchaodeng","id":920884,"avatar_url":"https://avatars.githubusercontent.com/u/920884?v=3","gravatar_id":"","url":"https://api.github.com/users/hongchaodeng","html_url":"https://github.com/hongchaodeng","followers_url":"https://api.github.com/users/hongchaodeng/followers","following_url":"https://api.github.com/users/hongchaodeng/following{/other_user}","gists_url":"https://api.github.com/users/hongchaodeng/gists{/gist_id}","starred_url":"https://api.github.com/users/hongchaodeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hongchaodeng/subscriptions","organizations_url":"https://api.github.com/users/hongchaodeng/orgs","repos_url":"https://api.github.com/users/hongchaodeng/repos","events_url":"https://api.github.com/users/hongchaodeng/events{/privacy}","received_events_url":"https://api.github.com/users/hongchaodeng/received_events","type":"User","site_admin":false},"repo":{"id":45423343,"name":"kubernetes","full_name":"hongchaodeng/kubernetes","owner":{"login":"hongchaodeng","id":920884,"avatar_url":"https://avatars.githubusercontent.com/u/920884?v=3","gravatar_id":"","url":"https://api.github.com/users/hongchaodeng","html_url":"https://github.com/hongchaodeng","followers_url":"https://api.github.com/users/hongchaodeng/followers","following_url":"https://api.github.com/users/hongchaodeng/following{/other_user}","gists_url":"https://api.github.com/users/hongchaodeng/gists{/gist_id}","starred_url":"https://api.github.com/users/hongchaodeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hongchaodeng/subscriptions","organizations_url":"https://api.github.com/users/hongchaodeng/orgs","repos_url":"https://api.github.com/users/hongchaodeng/repos","events_url":"https://api.github.com/users/hongchaodeng/events{/privacy}","received_events_url":"https://api.github.com/users/hongchaodeng/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hongchaodeng/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/hongchaodeng/kubernetes","forks_url":"https://api.github.com/repos/hongchaodeng/kubernetes/forks","keys_url":"https://api.github.com/repos/hongchaodeng/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hongchaodeng/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hongchaodeng/kubernetes/teams","hooks_url":"https://api.github.com/repos/hongchaodeng/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/hongchaodeng/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/hongchaodeng/kubernetes/events","assignees_url":"https://api.github.com/repos/hongchaodeng/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/hongchaodeng/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/hongchaodeng/kubernetes/tags","blobs_url":"https://api.github.com/repos/hongchaodeng/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hongchaodeng/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hongchaodeng/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/hongchaodeng/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hongchaodeng/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/hongchaodeng/kubernetes/languages","stargazers_url":"https://api.github.com/repos/hongchaodeng/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/hongchaodeng/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/hongchaodeng/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/hongchaodeng/kubernetes/subscription","commits_url":"https://api.github.com/repos/hongchaodeng/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/hongchaodeng/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/hongchaodeng/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/hongchaodeng/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/hongchaodeng/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/hongchaodeng/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hongchaodeng/kubernetes/merges","archive_url":"https://api.github.com/repos/hongchaodeng/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hongchaodeng/kubernetes/downloads","issues_url":"https://api.github.com/repos/hongchaodeng/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/hongchaodeng/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/hongchaodeng/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/hongchaodeng/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hongchaodeng/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/hongchaodeng/kubernetes/releases{/id}","created_at":"2015-11-02T21:30:01Z","updated_at":"2016-01-13T18:34:57Z","pushed_at":"2016-01-18T19:06:38Z","git_url":"git://github.com/hongchaodeng/kubernetes.git","ssh_url":"git@github.com:hongchaodeng/kubernetes.git","clone_url":"https://github.com/hongchaodeng/kubernetes.git","svn_url":"https://github.com/hongchaodeng/kubernetes","homepage":"http://kubernetes.io","size":150460,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"ad827c6b621f345944e0dc102822ab71a79c9722","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/kubernetes","description":"Container Cluster Manager from Google","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","created_at":"2014-06-06T22:56:04Z","updated_at":"2016-01-18T19:17:31Z","pushed_at":"2016-01-18T20:20:47Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":305478,"stargazers_count":12196,"watchers_count":12196,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3435,"mirror_url":null,"open_issues_count":2807,"forks":3435,"open_issues":2807,"watchers":12196,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/19090"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/19090"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/19090/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19090/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/5acfa0193e7b38d5da28acb9dd1ac68782c7d5d4"}}}}