{"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/50055832","id":50055832,"diff_hunk":"@@ -102,15 +102,38 @@ class TaskMetrics extends Serializable {\n   private[spark] def incDiskBytesSpilled(value: Long): Unit = _diskBytesSpilled += value\n   private[spark] def decDiskBytesSpilled(value: Long): Unit = _diskBytesSpilled -= value\n \n-  /**\n-   * If this task reads from a HadoopRDD or from persisted data, metrics on how much data was read\n-   * are stored here.\n-   */\n   private var _inputMetrics: Option[InputMetrics] = None\n \n+  /**\n+   * Metrics related to reading data from a [[org.apache.spark.rdd.HadoopRDD]] or from persisted\n+   * data, defined only in tasks with input.\n+   */\n   def inputMetrics: Option[InputMetrics] = _inputMetrics\n \n   /**\n+   * Get or create a new [[InputMetrics]] associated with this task.\n+   */\n+  private[spark] def registerInputMetrics(readMethod: DataReadMethod.Value): InputMetrics = {\n+    synchronized {\n+      val metrics = _inputMetrics.getOrElse {\n+        val metrics = new InputMetrics(readMethod)\n+        _inputMetrics = Some(metrics)\n+        metrics\n+      }\n+      // If there already exists an InputMetric with the same read method, we can just return\n+      // that one. Otherwise, if the read method is different from the one previously seen by\n+      // this task, we return a new dummy one to avoid clobbering the values of the old metrics.\n+      // In the future we should try to store input metrics from all different read methods at\n+      // the same time (SPARK-5225).","path":"core/src/main/scala/org/apache/spark/executor/TaskMetrics.scala","position":30,"original_position":30,"commit_id":"d2e4e23be82a0afb2f39d629ee7413591bc08c8d","original_commit_id":"d2e4e23be82a0afb2f39d629ee7413591bc08c8d","user":{"login":"JoshRosen","id":50748,"avatar_url":"https://avatars.githubusercontent.com/u/50748?v=3","gravatar_id":"","url":"https://api.github.com/users/JoshRosen","html_url":"https://github.com/JoshRosen","followers_url":"https://api.github.com/users/JoshRosen/followers","following_url":"https://api.github.com/users/JoshRosen/following{/other_user}","gists_url":"https://api.github.com/users/JoshRosen/gists{/gist_id}","starred_url":"https://api.github.com/users/JoshRosen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JoshRosen/subscriptions","organizations_url":"https://api.github.com/users/JoshRosen/orgs","repos_url":"https://api.github.com/users/JoshRosen/repos","events_url":"https://api.github.com/users/JoshRosen/events{/privacy}","received_events_url":"https://api.github.com/users/JoshRosen/received_events","type":"User","site_admin":false},"body":"Before, I guess we'd unconditionally overwrite so we might handle it wrong even for the same read method case? This looks good to me, just curious RE: whether this fixed another bug.","created_at":"2016-01-18T23:26:23Z","updated_at":"2016-01-18T23:26:23Z","html_url":"https://github.com/apache/spark/pull/10815#discussion_r50055832","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/10815","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/50055832"},"html":{"href":"https://github.com/apache/spark/pull/10815#discussion_r50055832"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/10815"}}},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/10815","id":56390428,"html_url":"https://github.com/apache/spark/pull/10815","diff_url":"https://github.com/apache/spark/pull/10815.diff","patch_url":"https://github.com/apache/spark/pull/10815.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/10815","number":10815,"state":"open","locked":false,"title":"[SPARK-12887] Do not expose var's in TaskMetrics","user":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"body":"This is a step in implementing SPARK-10620, which migrates TaskMetrics to accumulators.\r\n\r\nTaskMetrics has a bunch of var's, some are fully public, some are `private[spark]`. This is bad coding style that makes it easy to accidentally overwrite previously set metrics. This has happened a few times in the past and caused bugs that were difficult to debug.\r\n\r\nInstead, we should have get-or-create semantics, which are more readily understandable. This makes sense in the case of TaskMetrics because these are just aggregated metrics that we want to collect throughout the task, so it doesn't matter who's incrementing them.\r\n\r\nParent PR: #10717","created_at":"2016-01-18T20:56:36Z","updated_at":"2016-01-18T23:26:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"02f8156ba56c551056b20679081ecbae8ecf6f89","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/10815/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/10815/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/spark/issues/10815/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/d2e4e23be82a0afb2f39d629ee7413591bc08c8d","head":{"label":"andrewor14:get-or-create-metrics","ref":"get-or-create-metrics","sha":"d2e4e23be82a0afb2f39d629ee7413591bc08c8d","user":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"repo":{"id":17231517,"name":"spark","full_name":"andrewor14/spark","owner":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/andrewor14/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/andrewor14/spark","forks_url":"https://api.github.com/repos/andrewor14/spark/forks","keys_url":"https://api.github.com/repos/andrewor14/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andrewor14/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andrewor14/spark/teams","hooks_url":"https://api.github.com/repos/andrewor14/spark/hooks","issue_events_url":"https://api.github.com/repos/andrewor14/spark/issues/events{/number}","events_url":"https://api.github.com/repos/andrewor14/spark/events","assignees_url":"https://api.github.com/repos/andrewor14/spark/assignees{/user}","branches_url":"https://api.github.com/repos/andrewor14/spark/branches{/branch}","tags_url":"https://api.github.com/repos/andrewor14/spark/tags","blobs_url":"https://api.github.com/repos/andrewor14/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andrewor14/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andrewor14/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/andrewor14/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andrewor14/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/andrewor14/spark/languages","stargazers_url":"https://api.github.com/repos/andrewor14/spark/stargazers","contributors_url":"https://api.github.com/repos/andrewor14/spark/contributors","subscribers_url":"https://api.github.com/repos/andrewor14/spark/subscribers","subscription_url":"https://api.github.com/repos/andrewor14/spark/subscription","commits_url":"https://api.github.com/repos/andrewor14/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/andrewor14/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/andrewor14/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/andrewor14/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/andrewor14/spark/contents/{+path}","compare_url":"https://api.github.com/repos/andrewor14/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andrewor14/spark/merges","archive_url":"https://api.github.com/repos/andrewor14/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andrewor14/spark/downloads","issues_url":"https://api.github.com/repos/andrewor14/spark/issues{/number}","pulls_url":"https://api.github.com/repos/andrewor14/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/andrewor14/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/andrewor14/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andrewor14/spark/labels{/name}","releases_url":"https://api.github.com/repos/andrewor14/spark/releases{/id}","created_at":"2014-02-27T00:52:37Z","updated_at":"2015-05-08T06:53:12Z","pushed_at":"2016-01-18T22:42:31Z","git_url":"git://github.com/andrewor14/spark.git","ssh_url":"git@github.com:andrewor14/spark.git","clone_url":"https://github.com/andrewor14/spark.git","svn_url":"https://github.com/andrewor14/spark","homepage":null,"size":148534,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"4f11e3f2aa4f097ed66296fe72b5b5384924010c","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":17165658,"name":"spark","full_name":"apache/spark","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/spark","description":"Mirror of Apache Spark","fork":false,"url":"https://api.github.com/repos/apache/spark","forks_url":"https://api.github.com/repos/apache/spark/forks","keys_url":"https://api.github.com/repos/apache/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/spark/teams","hooks_url":"https://api.github.com/repos/apache/spark/hooks","issue_events_url":"https://api.github.com/repos/apache/spark/issues/events{/number}","events_url":"https://api.github.com/repos/apache/spark/events","assignees_url":"https://api.github.com/repos/apache/spark/assignees{/user}","branches_url":"https://api.github.com/repos/apache/spark/branches{/branch}","tags_url":"https://api.github.com/repos/apache/spark/tags","blobs_url":"https://api.github.com/repos/apache/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/spark/languages","stargazers_url":"https://api.github.com/repos/apache/spark/stargazers","contributors_url":"https://api.github.com/repos/apache/spark/contributors","subscribers_url":"https://api.github.com/repos/apache/spark/subscribers","subscription_url":"https://api.github.com/repos/apache/spark/subscription","commits_url":"https://api.github.com/repos/apache/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/spark/contents/{+path}","compare_url":"https://api.github.com/repos/apache/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/spark/merges","archive_url":"https://api.github.com/repos/apache/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/spark/downloads","issues_url":"https://api.github.com/repos/apache/spark/issues{/number}","pulls_url":"https://api.github.com/repos/apache/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/spark/labels{/name}","releases_url":"https://api.github.com/repos/apache/spark/releases{/id}","created_at":"2014-02-25T08:00:08Z","updated_at":"2016-01-18T20:00:01Z","pushed_at":"2016-01-18T23:11:12Z","git_url":"git://github.com/apache/spark.git","ssh_url":"git@github.com:apache/spark.git","clone_url":"https://github.com/apache/spark.git","svn_url":"https://github.com/apache/spark","homepage":null,"size":401296,"stargazers_count":7063,"watchers_count":7063,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6476,"mirror_url":"git://git.apache.org/spark.git","open_issues_count":359,"forks":6476,"open_issues":359,"watchers":7063,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/10815"},"html":{"href":"https://github.com/apache/spark/pull/10815"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/10815"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/10815/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/10815/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/10815/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/d2e4e23be82a0afb2f39d629ee7413591bc08c8d"}}}}