{"action":"created","comment":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/comments/38807080","id":38807080,"diff_hunk":"@@ -203,168 +188,168 @@ public String getWebBindHost() {\n \n   /**\n    * Get the actual port that the web service is listening on (used by unit test only)\n-   *\n-   * @return Web local port\n    */\n   public int getWebLocalPort() {\n     return mWebServer.getLocalPort();\n   }\n \n-  private boolean isFormatted(String folder, String path) throws IOException {\n-    if (!folder.endsWith(TachyonURI.SEPARATOR)) {\n-      folder += TachyonURI.SEPARATOR;\n-    }\n-    UnderFileSystem ufs = UnderFileSystem.get(folder, mTachyonConf);\n-    String[] files = ufs.list(folder);\n-    if (files == null) {\n-      return false;\n-    }\n-    for (String file : files) {\n-      if (file.startsWith(path)) {\n-        return true;\n-      }\n-    }\n-    return false;\n+  /**\n+   * Get internal {@link FileSystemMaster}, for unit test only.\n+   */\n+  public FileSystemMaster getFileSystemMaster() {\n+    return mFileSystemMaster;\n   }\n \n   /**\n-   * Get whether the system is the leader in zookeeper mode, for unit test only.\n-   *\n-   * @return true if the system is the leader under zookeeper mode, false otherwise.\n+   * Get internal {@link RawTableMaster}, for unit test only.\n    */\n-  boolean isStarted() {\n-    return mIsStarted;\n+  public RawTableMaster getRawTableMaster() {\n+    return mRawTableMaster;\n   }\n \n   /**\n-   * Get whether the system is in zookeeper mode, for unit test only.\n+   * Get internal {@link BlockMaster}, for unit test only.\n+   */\n+  public BlockMaster getBlockMaster() {\n+    return mBlockMaster;\n+  }\n+\n+  /**\n+   * Get the millisecond when Tachyon Master starts serving, return -1 when not started.\n+   */\n+  public long getStarttimeMs() {\n+    return mStartTimeMs;\n+  }\n+\n+  /**\n+   * Get whether the system is serving the rpc server.\n    *\n-   * @return true if the master is under zookeeper mode, false otherwise.\n+   * @return true if the system is the leader (serving the rpc server), false otherwise.\n    */\n-  boolean isZookeeperMode() {\n-    return mZookeeperMode;\n+  boolean isServing() {\n+    return mIsServing;\n   }\n \n-  private void connectToUFS() throws IOException {\n-    String ufsAddress =\n-        mTachyonConf.get(Constants.UNDERFS_ADDRESS);\n-    UnderFileSystem ufs = UnderFileSystem.get(ufsAddress, mTachyonConf);\n-    ufs.connectFromMaster(mTachyonConf,\n-        NetworkAddressUtils.getConnectHost(ServiceType.MASTER_RPC, mTachyonConf));\n+  /**\n+   * Start the Tachyon master server.\n+   */\n+  public void start() throws Exception {\n+    startMasters(true);\n+    startServing();\n   }\n \n-  private void setup() throws IOException, TTransportException {\n-    connectToUFS();\n-    if (mZookeeperMode) {\n-      mEditLogProcessor.stop();\n+  /**\n+   * Stop the Tachyon master server. Should only be called by tests.\n+   */\n+  public void stop() throws Exception {\n+    if (mIsServing) {\n+      LOG.info(\"Stopping Tachyon Master @ \" + mMasterAddress);\n+      stopServing();\n+      stopMasters();\n+      mTServerSocket.close();\n+      mIsServing = false;\n     }\n-    mMasterInfo.init();\n+  }\n \n-    mWebServer =\n-        new MasterUIWebServer(ServiceType.MASTER_WEB, NetworkAddressUtils.getBindAddress(\n-            ServiceType.MASTER_WEB, mTachyonConf), mMasterInfo, mTachyonConf);\n+  protected void startMasters(boolean isLeader) {\n+    try {\n+      connectToUFS();\n \n-    mMasterServiceHandler = new MasterServiceHandler(mMasterInfo);\n-    MasterService.Processor<MasterServiceHandler> masterServiceProcessor =\n-        new MasterService.Processor<MasterServiceHandler>(mMasterServiceHandler);\n+      mBlockMaster.start(isLeader);\n+      mFileSystemMaster.start(isLeader);\n+      mRawTableMaster.start(isLeader);\n \n-    mMasterServiceServer =\n-        new TThreadPoolServer(new TThreadPoolServer.Args(mServerTServerSocket)\n-            .maxWorkerThreads(mMaxWorkerThreads).minWorkerThreads(mMinWorkerThreads)\n-            .processor(masterServiceProcessor).transportFactory(new TFramedTransport.Factory())\n-            .protocolFactory(new TBinaryProtocol.Factory(true, true)));\n+    } catch (IOException e) {\n+      LOG.error(e.getMessage(), e);\n+      throw Throwables.propagate(e);\n+    }\n+  }\n \n-    mIsStarted = true;\n+  protected void stopMasters() {\n+    try {\n+      mBlockMaster.stop();\n+      mFileSystemMaster.stop();\n+      mRawTableMaster.stop();\n+    } catch (IOException e) {\n+      LOG.error(e.getMessage(), e);\n+      throw Throwables.propagate(e);\n+    }\n   }\n \n-  /**\n-   * Start a Tachyon master server.\n-   */\n-  public void start() {\n-    if (mZookeeperMode) {\n-      try {\n-        mLeaderSelectorClient.start();\n-      } catch (IOException e) {\n-        LOG.error(e.getMessage(), e);\n-        throw Throwables.propagate(e);\n-      }\n+  private void startServing() {\n+    startServingWebServer();\n+    LOG.info(\"Tachyon Master version \" + Version.VERSION + \" started @ \" + mMasterAddress);\n+    startServingRPCServer();\n+    LOG.info(\"Tachyon Master version \" + Version.VERSION + \" ended @ \" + mMasterAddress);\n+  }\n \n-      Thread currentThread = Thread.currentThread();\n-      mLeaderSelectorClient.setCurrentMasterThread(currentThread);\n-      boolean running = false;\n-      while (true) {\n-        if (mLeaderSelectorClient.isLeader()) {\n-          if (!running) {\n-            running = true;\n-            try {\n-              setup();\n-            } catch (IOException e) {\n-              LOG.error(e.getMessage(), e);\n-              throw Throwables.propagate(e);\n-            } catch (TTransportException e) {\n-              LOG.error(e.getMessage(), e);\n-              throw Throwables.propagate(e);\n-            }\n-            mMasterMetricsSystem.registerSource(mMasterInfo.getMasterSource());\n-            mMasterMetricsSystem.start();\n-            mWebServer.addHandler(mMasterMetricsSystem.getServletHandler());\n-            mWebServer.startWebServer();\n-            LOG.info(\"The master (leader) server started @ \" + mMasterAddress);\n-            mMasterServiceServer.serve();\n-            LOG.info(\"The master (previous leader) server ended @ \" + mMasterAddress);\n-            mJournal.close();\n-          }\n-        } else {\n-          if (running) {\n-            mMasterServiceServer.stop();\n-            running = false;\n-          }\n-        }\n-\n-        CommonUtils.sleepMs(LOG, 100);\n-      }\n-    } else {\n-      try {\n-        setup();\n-      } catch (IOException e) {\n-        LOG.error(e.getMessage(), e);\n-        throw Throwables.propagate(e);\n-      } catch (TTransportException e) {\n-        LOG.error(e.getMessage(), e);\n-        throw Throwables.propagate(e);\n-      }\n+  protected void startServingWebServer() {\n+    // start web ui\n+    mWebServer = new MasterUIWebServer(ServiceType.MASTER_WEB, NetworkAddressUtils.getBindAddress(\n+        ServiceType.MASTER_WEB, mTachyonConf), this, mTachyonConf);\n+    mWebServer.startWebServer();\n+  }\n \n-      mMasterMetricsSystem.registerSource(mMasterInfo.getMasterSource());\n-      mMasterMetricsSystem.start();\n-      mWebServer.addHandler(mMasterMetricsSystem.getServletHandler());\n-      mWebServer.startWebServer();\n-      LOG.info(\"Tachyon Master version \" + Version.VERSION + \" started @ \" + mMasterAddress);\n-      mMasterServiceServer.serve();\n-      LOG.info(\"Tachyon Master version \" + Version.VERSION + \" ended @ \" + mMasterAddress);\n+  protected void startServingRPCServer() {\n+    // set up multiplexed thrift processors\n+    TMultiplexedProcessor processor = new TMultiplexedProcessor();\n+    processor.registerProcessor(mBlockMaster.getProcessorName(), mBlockMaster.getProcessor());\n+    processor.registerProcessor(mFileSystemMaster.getProcessorName(),\n+        mFileSystemMaster.getProcessor());\n+    processor.registerProcessor(mRawTableMaster.getProcessorName(), mRawTableMaster.getProcessor());\n+\n+    // create master thrift service with the multiplexed processor.\n+    mMasterServiceServer = new TThreadPoolServer(new TThreadPoolServer.Args(mTServerSocket)\n+        .maxWorkerThreads(mMaxWorkerThreads).minWorkerThreads(mMinWorkerThreads)\n+        .processor(processor).transportFactory(new TFramedTransport.Factory())\n+        .protocolFactory(new TBinaryProtocol.Factory(true, true)));\n+\n+    // start thrift rpc server\n+    mIsServing = true;\n+    mStartTimeMs = System.currentTimeMillis();\n+    mMasterServiceServer.serve();\n+  }\n+\n+  protected void stopServing() throws Exception {\n+    if (mMasterServiceServer != null) {\n+      mMasterServiceServer.stop();\n     }\n+    if (mWebServer != null) {\n+      mWebServer.shutdownWebServer();\n+    }\n+    mIsServing = false;\n   }\n \n-  /*\n-   * Stop a Tachyon master server.\n+  /**\n+   * Checks to see if the journal directory is formatted.\n+   *\n+   * @param journalDirectory The journal directory to check\n+   * @return true if the journal directory was formatted previously, false otherwise\n+   * @throws IOException\n    */\n-  public void stop() throws Exception {\n-    if (mIsStarted) {\n-      mWebServer.shutdownWebServer();\n-      mMasterInfo.stop();\n-      mJournal.close();\n-      mMasterMetricsSystem.stop();\n-      mMasterServiceServer.stop();\n-      mServerTServerSocket.close();\n-      mExecutorService.shutdown();\n-      mIsStarted = false;\n+  private boolean isJournalFormatted(String journalDirectory) throws IOException {\n+    UnderFileSystem ufs = UnderFileSystem.get(journalDirectory, mTachyonConf);\n+    if (!ufs.providesStorage()) {\n+      return true;\n     }\n-    if (mZookeeperMode) {\n-      if (mLeaderSelectorClient != null) {\n-        mLeaderSelectorClient.close();\n-      }\n-      if (mEditLogProcessor != null) {\n-        mEditLogProcessor.stop();\n+    String[] files = ufs.list(journalDirectory);\n+    if (files == null) {\n+      return false;\n+    }\n+    // Search for the format file.\n+    String formatFilePrefix = mTachyonConf.get(Constants.MASTER_FORMAT_FILE_PREFIX);\n+    for (String file : files) {\n+      if (file.startsWith(formatFilePrefix)) {\n+        return true;\n       }\n     }\n+    return false;\n+  }\n+\n+  private void connectToUFS() throws IOException {\n+    String ufsAddress = mTachyonConf.get(Constants.UNDERFS_ADDRESS);\n+    UnderFileSystem ufs = UnderFileSystem.get(ufsAddress, mTachyonConf);\n+    ufs.connectFromMaster(mTachyonConf,\n+        NetworkAddressUtils.getConnectHost(ServiceType.MASTER_RPC, mTachyonConf));\n   }\n-}\n+}","path":"servers/src/main/java/tachyon/master/TachyonMaster.java","position":534,"original_position":534,"commit_id":"54d12f527c5d5abad44a53be8dd54a3b3a5fefc2","original_commit_id":"54d12f527c5d5abad44a53be8dd54a3b3a5fefc2","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":"no new line at the end of the file","created_at":"2015-09-05T04:00:09Z","updated_at":"2015-09-05T04:00:09Z","html_url":"https://github.com/amplab/tachyon/pull/1475#discussion_r38807080","pull_request_url":"https://api.github.com/repos/amplab/tachyon/pulls/1475","_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments/38807080"},"html":{"href":"https://github.com/amplab/tachyon/pull/1475#discussion_r38807080"},"pull_request":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1475"}}},"pull_request":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/1475","id":44263041,"html_url":"https://github.com/amplab/tachyon/pull/1475","diff_url":"https://github.com/amplab/tachyon/pull/1475.diff","patch_url":"https://github.com/amplab/tachyon/pull/1475.patch","issue_url":"https://api.github.com/repos/amplab/tachyon/issues/1475","number":1475,"state":"open","locked":false,"title":"[WIP] Common and Master Changes for #1464","user":{"login":"calvinjia","id":2223813,"avatar_url":"https://avatars.githubusercontent.com/u/2223813?v=3","gravatar_id":"","url":"https://api.github.com/users/calvinjia","html_url":"https://github.com/calvinjia","followers_url":"https://api.github.com/users/calvinjia/followers","following_url":"https://api.github.com/users/calvinjia/following{/other_user}","gists_url":"https://api.github.com/users/calvinjia/gists{/gist_id}","starred_url":"https://api.github.com/users/calvinjia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/calvinjia/subscriptions","organizations_url":"https://api.github.com/users/calvinjia/orgs","repos_url":"https://api.github.com/users/calvinjia/repos","events_url":"https://api.github.com/users/calvinjia/events{/privacy}","received_events_url":"https://api.github.com/users/calvinjia/received_events","type":"User","site_admin":false},"body":"This is a subset of #1464 with all the integration tests and client changes reverted. This branch should only be used to review and should not be merged. Changes should be directed to the original wip branch and will be merged into this branch.","created_at":"2015-09-04T21:25:21Z","updated_at":"2015-09-05T04:00:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"38e7d7e126d21323fd7ffce47559d7afec1d489b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/amplab/tachyon/pulls/1475/commits","review_comments_url":"https://api.github.com/repos/amplab/tachyon/pulls/1475/comments","review_comment_url":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/amplab/tachyon/issues/1475/comments","statuses_url":"https://api.github.com/repos/amplab/tachyon/statuses/54d12f527c5d5abad44a53be8dd54a3b3a5fefc2","head":{"label":"amplab:wip_master_client_review_1","ref":"wip_master_client_review_1","sha":"54d12f527c5d5abad44a53be8dd54a3b3a5fefc2","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":"2015-09-04T23:54:02Z","pushed_at":"2015-09-04T23:42:31Z","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":45874,"stargazers_count":1553,"watchers_count":1553,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":603,"mirror_url":null,"open_issues_count":35,"forks":603,"open_issues":35,"watchers":1553,"default_branch":"master"}},"base":{"label":"amplab:master","ref":"master","sha":"98dd5f80166a458a4f421eee653da9f9b93684a7","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":"2015-09-04T23:54:02Z","pushed_at":"2015-09-04T23:42:31Z","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":45874,"stargazers_count":1553,"watchers_count":1553,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":603,"mirror_url":null,"open_issues_count":35,"forks":603,"open_issues":35,"watchers":1553,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1475"},"html":{"href":"https://github.com/amplab/tachyon/pull/1475"},"issue":{"href":"https://api.github.com/repos/amplab/tachyon/issues/1475"},"comments":{"href":"https://api.github.com/repos/amplab/tachyon/issues/1475/comments"},"review_comments":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1475/comments"},"review_comment":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1475/commits"},"statuses":{"href":"https://api.github.com/repos/amplab/tachyon/statuses/54d12f527c5d5abad44a53be8dd54a3b3a5fefc2"}}}}