{"action":"created","comment":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/comments/42070399","id":42070399,"diff_hunk":"@@ -0,0 +1,206 @@\n+/*\n+ * Copyright © 2014-2015 Cask Data, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+ * use this file except in compliance with the License. You may obtain a copy of\n+ * 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, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+\n+package co.cask.cdap.data2.dataset2;\n+\n+import co.cask.cdap.api.data.DatasetContext;\n+import co.cask.cdap.api.data.DatasetInstantiationException;\n+import co.cask.cdap.api.dataset.Dataset;\n+import co.cask.cdap.api.dataset.metrics.MeteredDataset;\n+import co.cask.cdap.api.metrics.MetricsContext;\n+import co.cask.cdap.common.conf.Constants;\n+import co.cask.cdap.data.dataset.SystemDatasetInstantiator;\n+import co.cask.cdap.proto.Id;\n+import co.cask.tephra.TransactionAware;\n+import co.cask.tephra.TransactionContext;\n+import co.cask.tephra.TransactionSystemClient;\n+import com.google.common.cache.CacheBuilder;\n+import com.google.common.cache.CacheLoader;\n+import com.google.common.cache.LoadingCache;\n+import com.google.common.cache.RemovalListener;\n+import com.google.common.cache.RemovalNotification;\n+import com.google.common.collect.Iterables;\n+import org.slf4j.LoggerFactory;\n+\n+import java.util.HashMap;\n+import java.util.Map;\n+import java.util.concurrent.ExecutionException;\n+import javax.annotation.Nullable;\n+import javax.annotation.ParametersAreNonnullByDefault;\n+\n+/**\n+ * Implementation of {@link DatasetContext} that allows to dynamically load datasets\n+ * into a started {@link TransactionContext}. Datasets acquired from this context are distinct from any\n+ * Datasets instantiated outside this class.\n+ */\n+public class SingleThreadDatasetCache extends DynamicDatasetCache {\n+\n+  private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SingleThreadDatasetCache.class);\n+\n+  private final LoadingCache<DatasetCacheKey, Dataset> datasetCache;\n+  private final CacheLoader<DatasetCacheKey, Dataset> datasetLoader;\n+  private final Map<DatasetCacheKey, TransactionAware> inProgress = new HashMap<>();\n+  private final Map<DatasetCacheKey, Dataset> staticDatasets = new HashMap<>();\n+  private TransactionContext txContext = null;\n+\n+  /**\n+   * See {@link DynamicDatasetCache}.\n+   *\n+   * @param staticDatasets  if non-null, a map from dataset name to runtime arguments. These datasets will be\n+   *                        instantiated immediately, and they will participate in every transaction started\n+   *                        through {@link #newTransactionContext()}.\n+   */\n+  public SingleThreadDatasetCache(final SystemDatasetInstantiator instantiator,\n+                                  final TransactionSystemClient txClient,\n+                                  final Id.Namespace namespace,\n+                                  Map<String, String> runtimeArguments,\n+                                  @Nullable final MetricsContext metricsContext,\n+                                  @Nullable Map<String, Map<String, String>> staticDatasets) {\n+    super(instantiator, txClient, namespace, runtimeArguments, metricsContext);\n+    this.datasetLoader = new CacheLoader<DatasetCacheKey, Dataset>() {\n+      @Override\n+      @ParametersAreNonnullByDefault\n+      public Dataset load(DatasetCacheKey key) throws Exception {\n+        Dataset dataset = instantiator.getDataset(\n+          Id.DatasetInstance.from(namespace, key.getName()), key.getArguments());\n+        if (dataset instanceof MeteredDataset && metricsContext != null) {\n+          ((MeteredDataset) dataset).setMetricsCollector(\n+            metricsContext.childContext(Constants.Metrics.Tag.DATASET, key.getName()));\n+        }\n+        return dataset;\n+      }\n+    };\n+    this.datasetCache = CacheBuilder.newBuilder().removalListener(\n+      new RemovalListener<DatasetCacheKey, Dataset>() {\n+        @Override\n+        @ParametersAreNonnullByDefault\n+        public void onRemoval(RemovalNotification<DatasetCacheKey, Dataset> notification) {\n+          if (notification.getValue() != null) {\n+            try {\n+              notification.getValue().close();\n+            } catch (Throwable e) {\n+              LOG.warn(\"Error closing dataset '{}'\", notification.getKey());","path":"cdap-data-fabric/src/main/java/co/cask/cdap/data2/dataset2/SingleThreadDatasetCache.java","position":95,"original_position":95,"commit_id":"bd65dcc3cc5be10830e1a0eea49bad115d18cac8","original_commit_id":"bd65dcc3cc5be10830e1a0eea49bad115d18cac8","user":{"login":"chtyim","id":885032,"avatar_url":"https://avatars.githubusercontent.com/u/885032?v=3","gravatar_id":"","url":"https://api.github.com/users/chtyim","html_url":"https://github.com/chtyim","followers_url":"https://api.github.com/users/chtyim/followers","following_url":"https://api.github.com/users/chtyim/following{/other_user}","gists_url":"https://api.github.com/users/chtyim/gists{/gist_id}","starred_url":"https://api.github.com/users/chtyim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chtyim/subscriptions","organizations_url":"https://api.github.com/users/chtyim/orgs","repos_url":"https://api.github.com/users/chtyim/repos","events_url":"https://api.github.com/users/chtyim/events{/privacy}","received_events_url":"https://api.github.com/users/chtyim/received_events","type":"User","site_admin":false},"body":"or at least log the value class name.","created_at":"2015-10-15T00:09:38Z","updated_at":"2015-10-15T00:09:38Z","html_url":"https://github.com/caskdata/cdap/pull/4307#discussion_r42070399","pull_request_url":"https://api.github.com/repos/caskdata/cdap/pulls/4307","_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments/42070399"},"html":{"href":"https://github.com/caskdata/cdap/pull/4307#discussion_r42070399"},"pull_request":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/4307"}}},"pull_request":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/4307","id":47703943,"html_url":"https://github.com/caskdata/cdap/pull/4307","diff_url":"https://github.com/caskdata/cdap/pull/4307.diff","patch_url":"https://github.com/caskdata/cdap/pull/4307.patch","issue_url":"https://api.github.com/repos/caskdata/cdap/issues/4307","number":4307,"state":"open","locked":false,"title":"[CDAP-961] implementation of dynamic datasets in all programs","user":{"login":"anew","id":483004,"avatar_url":"https://avatars.githubusercontent.com/u/483004?v=3","gravatar_id":"","url":"https://api.github.com/users/anew","html_url":"https://github.com/anew","followers_url":"https://api.github.com/users/anew/followers","following_url":"https://api.github.com/users/anew/following{/other_user}","gists_url":"https://api.github.com/users/anew/gists{/gist_id}","starred_url":"https://api.github.com/users/anew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anew/subscriptions","organizations_url":"https://api.github.com/users/anew/orgs","repos_url":"https://api.github.com/users/anew/repos","events_url":"https://api.github.com/users/anew/events{/privacy}","received_events_url":"https://api.github.com/users/anew/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-14T19:30:51Z","updated_at":"2015-10-15T00:09:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c1e9240b15ee52787c65f68099bd01abae7944f","assignee":{"login":"chtyim","id":885032,"avatar_url":"https://avatars.githubusercontent.com/u/885032?v=3","gravatar_id":"","url":"https://api.github.com/users/chtyim","html_url":"https://github.com/chtyim","followers_url":"https://api.github.com/users/chtyim/followers","following_url":"https://api.github.com/users/chtyim/following{/other_user}","gists_url":"https://api.github.com/users/chtyim/gists{/gist_id}","starred_url":"https://api.github.com/users/chtyim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chtyim/subscriptions","organizations_url":"https://api.github.com/users/chtyim/orgs","repos_url":"https://api.github.com/users/chtyim/repos","events_url":"https://api.github.com/users/chtyim/events{/privacy}","received_events_url":"https://api.github.com/users/chtyim/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/caskdata/cdap/pulls/4307/commits","review_comments_url":"https://api.github.com/repos/caskdata/cdap/pulls/4307/comments","review_comment_url":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}","comments_url":"https://api.github.com/repos/caskdata/cdap/issues/4307/comments","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/bd65dcc3cc5be10830e1a0eea49bad115d18cac8","head":{"label":"caskdata:feature/dynamic-ds-cxt","ref":"feature/dynamic-ds-cxt","sha":"bd65dcc3cc5be10830e1a0eea49bad115d18cac8","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-10-14T13:22:24Z","pushed_at":"2015-10-14T23:36:55Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":869423,"stargazers_count":75,"watchers_count":75,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":22,"mirror_url":null,"open_issues_count":13,"forks":22,"open_issues":13,"watchers":75,"default_branch":"develop"}},"base":{"label":"caskdata:develop","ref":"develop","sha":"3bfadba992e62a2232a692e66ae5c531857446c2","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-10-14T13:22:24Z","pushed_at":"2015-10-14T23:36:55Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":869423,"stargazers_count":75,"watchers_count":75,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":22,"mirror_url":null,"open_issues_count":13,"forks":22,"open_issues":13,"watchers":75,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/4307"},"html":{"href":"https://github.com/caskdata/cdap/pull/4307"},"issue":{"href":"https://api.github.com/repos/caskdata/cdap/issues/4307"},"comments":{"href":"https://api.github.com/repos/caskdata/cdap/issues/4307/comments"},"review_comments":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/4307/comments"},"review_comment":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/4307/commits"},"statuses":{"href":"https://api.github.com/repos/caskdata/cdap/statuses/bd65dcc3cc5be10830e1a0eea49bad115d18cac8"}}}}