{"action":"created","comment":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/comments/48852649","id":48852649,"diff_hunk":"@@ -38,35 +74,353 @@\n    * @param tachyonConf the configuration for Tachyon\n    * @param conf the configuration\n    */\n-  public SwiftUnderFileSystem(String fsDefaultName, TachyonConf tachyonConf, Object conf) {\n-    super(fsDefaultName, tachyonConf, conf);\n-    LOG.debug(\"Swift constuctor method\");\n+  public SwiftUnderFileSystem(String containerName,\n+      TachyonConf tachyonConf) throws Exception {\n+    super(tachyonConf);\n+    LOG.debug(\"Constructor init: {}\", containerName);\n+    AccountConfig config = new AccountConfig();\n+    config.setUsername(tachyonConf.get(Constants.SWIFT_USER_KEY));\n+    config.setTenantName(tachyonConf.get(Constants.SWIFT_TENANT_KEY));\n+    config.setPassword(tachyonConf.get(Constants.SWIFT_API_KEY));\n+    config.setAuthUrl(tachyonConf.get(Constants.SWIFT_AUTH_URL_KEY));\n+    String authMethod = tachyonConf.get(Constants.SWIFT_AUTH_METHOD_KEY);\n+    if (authMethod != null && authMethod.equals(\"keystone\")) {\n+      config.setAuthenticationMethod(AuthenticationMethod.KEYSTONE);\n+    } else {\n+      config.setAuthenticationMethod(AuthenticationMethod.TEMPAUTH);\n+    }\n+\n+    ObjectMapper mapper = new ObjectMapper();\n+    mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);\n+    mContainerName = containerName;\n+    mAccount = new AccountFactory(config).createAccount();\n+    mAccess = mAccount.authenticate();\n+    Container containerObj = mAccount.getContainer(containerName);\n+    if (!containerObj.exists()) {\n+      containerObj.create();\n+    }\n+    mContainerPrefix = Constants.HEADER_SWIFT + mContainerName + PATH_SEPARATOR;\n   }\n \n   @Override\n-  public UnderFSType getUnderFSType() {\n-    return UnderFSType.SWIFT;\n+  public void close() throws IOException {\n+    LOG.debug(\"close\");\n+  }\n+\n+  @Override\n+  public void connectFromMaster(TachyonConf conf, String hostname) {\n+    LOG.debug(\"connect from master\");\n+  }\n+\n+  @Override\n+  public void connectFromWorker(TachyonConf conf, String hostname) {\n+    LOG.debug(\"connect from worker\");\n+  }\n+\n+  @Override\n+  public OutputStream create(String path) throws IOException {\n+    LOG.debug(\"Create method: {}\", path);\n+    String newPath = path.substring(Constants.HEADER_SWIFT.length());\n+    SwiftOutputStream out = SwiftDirectClient.PUT(mAccess, newPath);\n+    return out;\n+  }\n+\n+  @Override\n+  public OutputStream create(String path,\n+      int blockSizeByte) throws IOException {\n+    LOG.warn(\"Create with block size is not supported\"\n+        + \"with SwiftDirectUnderFileSystem. Block size will be ignored.\");\n+    return create(path);\n+  }\n+\n+  @Override\n+  public OutputStream create(String path, short replication, int blockSizeByte) throws IOException {\n+    LOG.warn(\"Create with block size and replication is not\"\n+        + \"supported with SwiftDirectUnderFileSystem.\"\n+        + \" Block size and replication will be ignored.\");\n+    return create(path);\n+  }\n+\n+  /* @inheritDoc\n+   * @see tachyon.underfs.UnderFileSystem#delete(java.lang.String, boolean).\n+   * recursive will delete all objects with given prefix.\n+   * parent will not be deleted.\n+   * Method always returns {@code true}.\n+   */\n+  @Override\n+  public boolean delete(String path, boolean recursive) throws IOException {\n+    LOG.debug(\"Delete method: {}, recursive {}\", path, recursive);\n+    String strippedPath = stripPrefixIfPresent(path);\n+    Container c = mAccount.getContainer(mContainerName);\n+    if (recursive) {\n+      strippedPath = makeQualifiedPath(strippedPath);\n+      PaginationMap paginationMap = c.getPaginationMap(strippedPath, 100);\n+      for (int page = 0; page < paginationMap.getNumberOfPages(); page++) {\n+        for (StoredObject obj : c.list(paginationMap, page)) {\n+          if (obj.exists()) {\n+            obj.delete();\n+          }\n+        }\n+      }\n+    }\n+    StoredObject so = c.getObject(strippedPath);\n+    if (so.exists()) {\n+      so.delete();\n+    }\n+    return true;\n+  }\n+\n+  @Override\n+  public boolean exists(String path) throws IOException {\n+    String newPath = stripPrefixIfPresent(path);\n+    return isObjectExists(newPath) ;\n   }\n \n   /**\n-   * Prepares the Hadoop configuration necessary to successfully obtain a {@link FileSystem}\n-   * instance that can access the provided path\n-   * <p>\n-   * Derived implementations that work with specialised Hadoop {@linkplain FileSystem} API\n-   * compatible implementations can override this method to add implementation specific\n-   * configuration necessary for obtaining a usable {@linkplain FileSystem} instance.\n-   * </p>\n-   *\n-   * @param path File system path\n-   * @param config Hadoop Configuration\n+   * Checks if the object exists.\n+   * @param path the key to get the object details of\n+   * @return boolean indicating if the object exists\n+   */\n+  private boolean isObjectExists(String path) {\n+    LOG.debug(\"Checking if {} exists\", path);\n+    boolean res =  mAccount.getContainer(mContainerName).getObject(path).exists();\n+    return res;\n+  }\n+\n+  /**\n+   * There is no concept of a block in Swift, however the maximum allowed size of\n+   * one object is currently 4 GB.\n+   * @param path to the object\n+   * @return 4 GB in bytes\n+   * @throws IOException this implementation will not throw this exception, but subclasses may\n    */\n-  protected void prepareConfiguration(String path, TachyonConf tachyonConf, Configuration config) {\n-    // To disable the instance cache for hdfs client, otherwise it causes the FileSystem closed\n-    // exception. Being configurable for unit/integration test only, and not expose to the end-user\n-    // currently.\n-    config.set(\"fs.swift.impl.disable.cache\", \"true\");\n-    SwiftUnderFileSystemUtils.addKey(config, tachyonConf, Constants.UNDERFS_HDFS_CONFIGURATION);\n-    config.addResource(new Path(config.get(Constants.UNDERFS_HDFS_CONFIGURATION)));\n-    super.prepareConfiguration(path, tachyonConf, config);\n+  @Override\n+  public long getBlockSizeByte(String path) throws IOException {\n+    return Constants.GB * 4;\n+  }\n+\n+  @Override\n+  public Object getConf() {\n+    LOG.warn(\"getConf is not supported when using SwiftDirectUnderFileSystem, returning null.\");\n+    return null;\n+  }\n+\n+  @Override\n+  public List<String> getFileLocations(String path) throws IOException {\n+    LOG.warn(\"getFileLocations is not supported when using \"\n+        + \"SwiftDirectUnderFileSystem, returning null.\");\n+    return null;\n+  }\n+\n+  @Override\n+  public List<String> getFileLocations(String path, long offset) throws IOException {\n+    LOG.warn(\"getFileLocations is not supported when using \"\n+        + \"SwiftDirectUnderFileSystem, returning null.\");\n+    return null;\n+  }\n+\n+  @Override\n+  public long getFileSize(String path) throws IOException {\n+    StoredObject so = mAccount.getContainer(mContainerName).getObject(stripPrefixIfPresent(path));\n+    return so.getContentLength();\n+  }\n+\n+  @Override\n+  public long getModificationTimeMs(String path) throws IOException {\n+    StoredObject so = mAccount.getContainer(mContainerName).getObject(stripPrefixIfPresent(path));\n+    return so.getLastModifiedAsDate().getTime();\n+  }\n+\n+  // This call is currently only used for the web ui, where a negative value implies unknown.\n+  @Override\n+  public long getSpace(String path, SpaceType type) throws IOException {\n+    return -1;\n+  }\n+\n+  @Override\n+  public boolean isFile(String path) throws IOException {\n+    return exists(path);\n+  }\n+\n+  @Override\n+  public String[] list(String path) throws IOException {\n+    path = path.endsWith(PATH_SEPARATOR) ? path : path + PATH_SEPARATOR;\n+    return listInternal(path, false);\n+  }\n+\n+  /* @inheritDoc\n+   * @see tachyon.underfs.UnderFileSystem#mkdirs(java.lang.String, boolean)\n+   * There is no notion of directories in Swift.\n+   * The content of containers are objects.\n+   * Object name may contain nested structure like a/b/c/d.data\n+   */\n+  @Override\n+  public boolean mkdirs(String path, boolean createParent) throws IOException {\n+    return true;\n+  }\n+\n+  @Override\n+  public InputStream open(String path) throws IOException {\n+    path = stripPrefixIfPresent(path);\n+    Container container = mAccount.getContainer(mContainerName);\n+    StoredObject so = container.getObject(path);\n+    InputStream  is = so.downloadObjectAsInputStream();\n+    return is;\n+  }\n+\n+  /**\n+   * Each path is checked both for leading \"/\" and ending \"/\"\n+   * Leading \"/\" is removed, and \"/\" is added at the end if not present\n+   * @param path\n+   * @return qualified path\n+   */\n+  private String makeQualifiedPath(String path) {\n+    if (!path.endsWith(\"/\")) {\n+      path = path + \"/\";\n+    }\n+    if (path.startsWith(\"/\")) {\n+      path = path.substring(1);\n+    }\n+    return path;\n+  }\n+\n+  /* @inheritDoc","path":"underfs/swift/src/main/java/tachyon/underfs/swift/SwiftUnderFileSystem.java","position":301,"original_position":301,"commit_id":"56a5cdc388dba2338a28a12eed7964878777ac4b","original_commit_id":"56a5cdc388dba2338a28a12eed7964878777ac4b","user":{"login":"jsimsa","id":1072079,"avatar_url":"https://avatars.githubusercontent.com/u/1072079?v=3","gravatar_id":"","url":"https://api.github.com/users/jsimsa","html_url":"https://github.com/jsimsa","followers_url":"https://api.github.com/users/jsimsa/followers","following_url":"https://api.github.com/users/jsimsa/following{/other_user}","gists_url":"https://api.github.com/users/jsimsa/gists{/gist_id}","starred_url":"https://api.github.com/users/jsimsa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsimsa/subscriptions","organizations_url":"https://api.github.com/users/jsimsa/orgs","repos_url":"https://api.github.com/users/jsimsa/repos","events_url":"https://api.github.com/users/jsimsa/events{/privacy}","received_events_url":"https://api.github.com/users/jsimsa/received_events","type":"User","site_admin":false},"body":"After re-reading the comment and also looking at the inherit documentation, it makes sense to have both. So this is okay as is. Thanks.","created_at":"2016-01-05T15:01:45Z","updated_at":"2016-01-05T15:01:45Z","html_url":"https://github.com/amplab/tachyon/pull/2212#discussion_r48852649","pull_request_url":"https://api.github.com/repos/amplab/tachyon/pulls/2212","_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments/48852649"},"html":{"href":"https://github.com/amplab/tachyon/pull/2212#discussion_r48852649"},"pull_request":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/2212"}}},"pull_request":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/2212","id":52588715,"html_url":"https://github.com/amplab/tachyon/pull/2212","diff_url":"https://github.com/amplab/tachyon/pull/2212.diff","patch_url":"https://github.com/amplab/tachyon/pull/2212.patch","issue_url":"https://api.github.com/repos/amplab/tachyon/issues/2212","number":2212,"state":"open","locked":false,"title":"[TACHYON-1388] OpenStack Swift driver without Hadoop dependency","user":{"login":"gilv","id":6321715,"avatar_url":"https://avatars.githubusercontent.com/u/6321715?v=3","gravatar_id":"","url":"https://api.github.com/users/gilv","html_url":"https://github.com/gilv","followers_url":"https://api.github.com/users/gilv/followers","following_url":"https://api.github.com/users/gilv/following{/other_user}","gists_url":"https://api.github.com/users/gilv/gists{/gist_id}","starred_url":"https://api.github.com/users/gilv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilv/subscriptions","organizations_url":"https://api.github.com/users/gilv/orgs","repos_url":"https://api.github.com/users/gilv/repos","events_url":"https://api.github.com/users/gilv/events{/privacy}","received_events_url":"https://api.github.com/users/gilv/received_events","type":"User","site_admin":false},"body":" This is new Swift driver implementation, based on JOSS package. It access Swift directly and doesn't use Hadoop drivers to access Swift.","created_at":"2015-12-03T20:36:57Z","updated_at":"2016-01-05T15:01:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"be88f811770ed1b96af1244a80f124804c65b78d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/amplab/tachyon/pulls/2212/commits","review_comments_url":"https://api.github.com/repos/amplab/tachyon/pulls/2212/comments","review_comment_url":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/amplab/tachyon/issues/2212/comments","statuses_url":"https://api.github.com/repos/amplab/tachyon/statuses/56a5cdc388dba2338a28a12eed7964878777ac4b","head":{"label":"gilv:swift-direct-call","ref":"swift-direct-call","sha":"56a5cdc388dba2338a28a12eed7964878777ac4b","user":{"login":"gilv","id":6321715,"avatar_url":"https://avatars.githubusercontent.com/u/6321715?v=3","gravatar_id":"","url":"https://api.github.com/users/gilv","html_url":"https://github.com/gilv","followers_url":"https://api.github.com/users/gilv/followers","following_url":"https://api.github.com/users/gilv/following{/other_user}","gists_url":"https://api.github.com/users/gilv/gists{/gist_id}","starred_url":"https://api.github.com/users/gilv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilv/subscriptions","organizations_url":"https://api.github.com/users/gilv/orgs","repos_url":"https://api.github.com/users/gilv/repos","events_url":"https://api.github.com/users/gilv/events{/privacy}","received_events_url":"https://api.github.com/users/gilv/received_events","type":"User","site_admin":false},"repo":{"id":33913382,"name":"tachyon","full_name":"gilv/tachyon","owner":{"login":"gilv","id":6321715,"avatar_url":"https://avatars.githubusercontent.com/u/6321715?v=3","gravatar_id":"","url":"https://api.github.com/users/gilv","html_url":"https://github.com/gilv","followers_url":"https://api.github.com/users/gilv/followers","following_url":"https://api.github.com/users/gilv/following{/other_user}","gists_url":"https://api.github.com/users/gilv/gists{/gist_id}","starred_url":"https://api.github.com/users/gilv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilv/subscriptions","organizations_url":"https://api.github.com/users/gilv/orgs","repos_url":"https://api.github.com/users/gilv/repos","events_url":"https://api.github.com/users/gilv/events{/privacy}","received_events_url":"https://api.github.com/users/gilv/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gilv/tachyon","description":" A Reliable Memory Centric Distributed Storage System","fork":true,"url":"https://api.github.com/repos/gilv/tachyon","forks_url":"https://api.github.com/repos/gilv/tachyon/forks","keys_url":"https://api.github.com/repos/gilv/tachyon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gilv/tachyon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gilv/tachyon/teams","hooks_url":"https://api.github.com/repos/gilv/tachyon/hooks","issue_events_url":"https://api.github.com/repos/gilv/tachyon/issues/events{/number}","events_url":"https://api.github.com/repos/gilv/tachyon/events","assignees_url":"https://api.github.com/repos/gilv/tachyon/assignees{/user}","branches_url":"https://api.github.com/repos/gilv/tachyon/branches{/branch}","tags_url":"https://api.github.com/repos/gilv/tachyon/tags","blobs_url":"https://api.github.com/repos/gilv/tachyon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gilv/tachyon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gilv/tachyon/git/refs{/sha}","trees_url":"https://api.github.com/repos/gilv/tachyon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gilv/tachyon/statuses/{sha}","languages_url":"https://api.github.com/repos/gilv/tachyon/languages","stargazers_url":"https://api.github.com/repos/gilv/tachyon/stargazers","contributors_url":"https://api.github.com/repos/gilv/tachyon/contributors","subscribers_url":"https://api.github.com/repos/gilv/tachyon/subscribers","subscription_url":"https://api.github.com/repos/gilv/tachyon/subscription","commits_url":"https://api.github.com/repos/gilv/tachyon/commits{/sha}","git_commits_url":"https://api.github.com/repos/gilv/tachyon/git/commits{/sha}","comments_url":"https://api.github.com/repos/gilv/tachyon/comments{/number}","issue_comment_url":"https://api.github.com/repos/gilv/tachyon/issues/comments{/number}","contents_url":"https://api.github.com/repos/gilv/tachyon/contents/{+path}","compare_url":"https://api.github.com/repos/gilv/tachyon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gilv/tachyon/merges","archive_url":"https://api.github.com/repos/gilv/tachyon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gilv/tachyon/downloads","issues_url":"https://api.github.com/repos/gilv/tachyon/issues{/number}","pulls_url":"https://api.github.com/repos/gilv/tachyon/pulls{/number}","milestones_url":"https://api.github.com/repos/gilv/tachyon/milestones{/number}","notifications_url":"https://api.github.com/repos/gilv/tachyon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gilv/tachyon/labels{/name}","releases_url":"https://api.github.com/repos/gilv/tachyon/releases{/id}","created_at":"2015-04-14T05:52:08Z","updated_at":"2015-05-08T19:11:42Z","pushed_at":"2016-01-05T06:56:20Z","git_url":"git://github.com/gilv/tachyon.git","ssh_url":"git@github.com:gilv/tachyon.git","clone_url":"https://github.com/gilv/tachyon.git","svn_url":"https://github.com/gilv/tachyon","homepage":"http://tachyon-project.org","size":34591,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"amplab:master","ref":"master","sha":"4824690b3a1556fabc60b778fb89af69aeb7f07a","user":{"login":"amplab","id":1438454,"avatar_url":"https://avatars.githubusercontent.com/u/1438454?v=3","gravatar_id":"","url":"https://api.github.com/users/amplab","html_url":"https://github.com/amplab","followers_url":"https://api.github.com/users/amplab/followers","following_url":"https://api.github.com/users/amplab/following{/other_user}","gists_url":"https://api.github.com/users/amplab/gists{/gist_id}","starred_url":"https://api.github.com/users/amplab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amplab/subscriptions","organizations_url":"https://api.github.com/users/amplab/orgs","repos_url":"https://api.github.com/users/amplab/repos","events_url":"https://api.github.com/users/amplab/events{/privacy}","received_events_url":"https://api.github.com/users/amplab/received_events","type":"Organization","site_admin":false},"repo":{"id":7276954,"name":"tachyon","full_name":"amplab/tachyon","owner":{"login":"amplab","id":1438454,"avatar_url":"https://avatars.githubusercontent.com/u/1438454?v=3","gravatar_id":"","url":"https://api.github.com/users/amplab","html_url":"https://github.com/amplab","followers_url":"https://api.github.com/users/amplab/followers","following_url":"https://api.github.com/users/amplab/following{/other_user}","gists_url":"https://api.github.com/users/amplab/gists{/gist_id}","starred_url":"https://api.github.com/users/amplab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amplab/subscriptions","organizations_url":"https://api.github.com/users/amplab/orgs","repos_url":"https://api.github.com/users/amplab/repos","events_url":"https://api.github.com/users/amplab/events{/privacy}","received_events_url":"https://api.github.com/users/amplab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/amplab/tachyon","description":"Memory Centric Reliable Distributed Storage","fork":false,"url":"https://api.github.com/repos/amplab/tachyon","forks_url":"https://api.github.com/repos/amplab/tachyon/forks","keys_url":"https://api.github.com/repos/amplab/tachyon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/amplab/tachyon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/amplab/tachyon/teams","hooks_url":"https://api.github.com/repos/amplab/tachyon/hooks","issue_events_url":"https://api.github.com/repos/amplab/tachyon/issues/events{/number}","events_url":"https://api.github.com/repos/amplab/tachyon/events","assignees_url":"https://api.github.com/repos/amplab/tachyon/assignees{/user}","branches_url":"https://api.github.com/repos/amplab/tachyon/branches{/branch}","tags_url":"https://api.github.com/repos/amplab/tachyon/tags","blobs_url":"https://api.github.com/repos/amplab/tachyon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/amplab/tachyon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/amplab/tachyon/git/refs{/sha}","trees_url":"https://api.github.com/repos/amplab/tachyon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/amplab/tachyon/statuses/{sha}","languages_url":"https://api.github.com/repos/amplab/tachyon/languages","stargazers_url":"https://api.github.com/repos/amplab/tachyon/stargazers","contributors_url":"https://api.github.com/repos/amplab/tachyon/contributors","subscribers_url":"https://api.github.com/repos/amplab/tachyon/subscribers","subscription_url":"https://api.github.com/repos/amplab/tachyon/subscription","commits_url":"https://api.github.com/repos/amplab/tachyon/commits{/sha}","git_commits_url":"https://api.github.com/repos/amplab/tachyon/git/commits{/sha}","comments_url":"https://api.github.com/repos/amplab/tachyon/comments{/number}","issue_comment_url":"https://api.github.com/repos/amplab/tachyon/issues/comments{/number}","contents_url":"https://api.github.com/repos/amplab/tachyon/contents/{+path}","compare_url":"https://api.github.com/repos/amplab/tachyon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/amplab/tachyon/merges","archive_url":"https://api.github.com/repos/amplab/tachyon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/amplab/tachyon/downloads","issues_url":"https://api.github.com/repos/amplab/tachyon/issues{/number}","pulls_url":"https://api.github.com/repos/amplab/tachyon/pulls{/number}","milestones_url":"https://api.github.com/repos/amplab/tachyon/milestones{/number}","notifications_url":"https://api.github.com/repos/amplab/tachyon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/amplab/tachyon/labels{/name}","releases_url":"https://api.github.com/repos/amplab/tachyon/releases{/id}","created_at":"2012-12-21T17:43:46Z","updated_at":"2016-01-05T12:33:12Z","pushed_at":"2016-01-05T07:56:33Z","git_url":"git://github.com/amplab/tachyon.git","ssh_url":"git@github.com:amplab/tachyon.git","clone_url":"https://github.com/amplab/tachyon.git","svn_url":"https://github.com/amplab/tachyon","homepage":"http://tachyon-project.org","size":42994,"stargazers_count":1850,"watchers_count":1850,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":732,"mirror_url":null,"open_issues_count":32,"forks":732,"open_issues":32,"watchers":1850,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/2212"},"html":{"href":"https://github.com/amplab/tachyon/pull/2212"},"issue":{"href":"https://api.github.com/repos/amplab/tachyon/issues/2212"},"comments":{"href":"https://api.github.com/repos/amplab/tachyon/issues/2212/comments"},"review_comments":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/2212/comments"},"review_comment":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/2212/commits"},"statuses":{"href":"https://api.github.com/repos/amplab/tachyon/statuses/56a5cdc388dba2338a28a12eed7964878777ac4b"}}}}