{"action":"created","comment":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/comments/39127515","id":39127515,"diff_hunk":"@@ -0,0 +1,228 @@\n+/*\n+ * Licensed to the University of California, Berkeley under one or more contributor license\n+ * agreements. See the NOTICE file distributed with this work for additional information regarding\n+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance with the License. You may obtain a\n+ * 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 distributed under the License\n+ * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n+ * or implied. See the License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+\n+package tachyon.mesos;\n+\n+import java.util.ArrayList;\n+import java.util.List;\n+\n+import org.apache.mesos.Protos;\n+import org.apache.mesos.Scheduler;\n+import org.apache.mesos.SchedulerDriver;\n+import org.apache.mesos.MesosSchedulerDriver;\n+\n+import tachyon.Constants;\n+import tachyon.conf.TachyonConf;\n+import tachyon.util.FormatUtils;\n+import tachyon.util.io.PathUtils;\n+\n+public class TachyonFramework {\n+  static class TachyonScheduler implements Scheduler {\n+    private boolean mMasterLaunched = false;\n+    private String mMasterHostname = \"\";\n+\n+    @Override\n+    public void disconnected(SchedulerDriver driver) {\n+      System.out.println(\"Disconnected from master.\");\n+    }\n+\n+    @Override\n+    public void error(SchedulerDriver driver, String message) {\n+      System.out.println(\"Error: \" + message);\n+    }\n+\n+    @Override\n+    public void executorLost(SchedulerDriver driver, Protos.ExecutorID executorId,\n+        Protos.SlaveID slaveId, int status) {\n+      System.out.println(\"Executor \" + executorId.getValue() + \" was lost.\");\n+    }\n+\n+    @Override\n+    public void frameworkMessage(SchedulerDriver driver, Protos.ExecutorID executorId,\n+        Protos.SlaveID slaveId, byte[] data) {\n+      System.out.println(\"Executor: \" + executorId.getValue() + \", \" + \"Slave: \"\n+          + slaveId.getValue() + \", \" + \"Data: \" + data + \".\");\n+    }\n+\n+    @Override\n+    public void offerRescinded(SchedulerDriver driver, Protos.OfferID offerId) {\n+      System.out.println(\"Offered \" + offerId.getValue() + \" rescinded.\");\n+    }\n+\n+    @Override\n+    public void registered(SchedulerDriver driver, Protos.FrameworkID frameworkId,\n+        Protos.MasterInfo masterInfo) {\n+      System.out.println(\"Registered framework \" + frameworkId.getValue() + \" with master \"\n+          + masterInfo.getHostname() + \":\" + masterInfo.getPort() + \".\");\n+    }\n+\n+    @Override\n+    public void reregistered(SchedulerDriver driver, Protos.MasterInfo masterInfo) {\n+      System.out.println(\"Registered framework with master \" + masterInfo.getHostname() + \":\"\n+          + masterInfo.getPort() + \".\");\n+    }\n+\n+    @Override\n+    public void resourceOffers(SchedulerDriver driver, List<Protos.Offer> offers) {\n+      TachyonConf conf = new TachyonConf();\n+      double masterCpu = conf.getInt(Constants.MASTER_MESOS_CPU);\n+      double masterMem = conf.getBytes(Constants.MASTER_MESOS_MEM) / (1024 * 1024); // MBs\n+      String tachyonHome = conf.get(Constants.TACHYON_HOME);\n+      int launchedTasks = 0;\n+\n+      for (Protos.Offer offer : offers) {\n+        Protos.Offer.Operation.Launch.Builder launch = Protos.Offer.Operation.Launch.newBuilder();\n+        double offerCpu = 0;\n+        double offerMem = 0;\n+        for (Protos.Resource resource : offer.getResourcesList()) {\n+          if (resource.getName().equals(\"cpus\")) {\n+            offerCpu += resource.getScalar().getValue();\n+          } else if (resource.getName().equals(\"mem\")) {\n+            offerMem += resource.getScalar().getValue();\n+          }\n+        }\n+\n+        System.out.println(\"Received offer \" + offer.getId().getValue() + \" with cpus: \"\n+            + offerCpu + \" and mem: \" + offerMem + \"MB.\");\n+\n+        double remainingCpu = offerCpu;\n+        double remainingMem = offerMem;\n+        while (remainingCpu > 0 && remainingMem > 0) {\n+          Protos.TaskID taskId =\n+              Protos.TaskID.newBuilder().setValue(Integer.toString(launchedTasks ++)).build();\n+\n+          System.out.println(\"Launching task \" + taskId.getValue() + \" using offer \"\n+              + offer.getId().getValue());\n+\n+          Protos.ExecutorInfo.Builder executorBuilder = Protos.ExecutorInfo.newBuilder();\n+          double targetCpu = 0;\n+          double targetMem = 0;\n+          if (!mMasterLaunched && remainingCpu >= masterCpu && remainingMem >= masterMem) {\n+            executorBuilder\n+                .setName(\"Tachyon Master Executor\")\n+                .setSource(\"master\")\n+                .setExecutorId(Protos.ExecutorID.newBuilder().setValue(\"master\"))\n+                .setCommand(\n+                    Protos.CommandInfo.newBuilder().setValue(\n+                        PathUtils.concatPath(tachyonHome, \"mesos\", \"bin\", \"tachyon-master.sh\")));\n+            targetCpu = masterCpu;\n+            targetMem = masterMem;\n+            mMasterHostname = offer.getHostname();\n+            mMasterLaunched = true;\n+          } else if (mMasterLaunched) {\n+            final String MEM_SIZE = FormatUtils.getSizeFromBytes((long) remainingMem * 1024 * 1024);\n+            executorBuilder\n+                .setName(\"Tachyon Worker Executor\")\n+                .setSource(\"worker\")\n+                .setExecutorId(Protos.ExecutorID.newBuilder().setValue(\"worker\"))\n+                .setCommand(\n+                    Protos.CommandInfo.newBuilder().setValue(\n+                        PathUtils.concatPath(tachyonHome, \"mesos\", \"bin\", \"tachyon-worker.sh\"))\n+                        .setEnvironment(Protos.Environment.newBuilder()\n+                            .addVariables(Protos.Environment.Variable.newBuilder()\n+                                .setName(\"TACHYON_MASTER_ADDRESS\")\n+                                .setValue(mMasterHostname).build())\n+                            .addVariables(Protos.Environment.Variable.newBuilder()\n+                                .setName(\"TACHYON_WORKER_MEMORY_SIZE\")\n+                                .setValue(MEM_SIZE).build())\n+                            .build()));\n+            targetCpu = remainingCpu;\n+            targetMem = remainingMem;\n+          }\n+          Protos.TaskInfo task =\n+              Protos.TaskInfo\n+                  .newBuilder()\n+                  .setName(\"task \" + taskId.getValue())\n+                  .setTaskId(taskId)\n+                  .setSlaveId(offer.getSlaveId())\n+                  .addResources(\n+                      Protos.Resource.newBuilder().setName(\"cpus\")\n+                          .setType(Protos.Value.Type.SCALAR)\n+                          .setScalar(Protos.Value.Scalar.newBuilder().setValue(targetCpu)))\n+                  .addResources(\n+                      Protos.Resource.newBuilder().setName(\"mem\").setType(Protos.Value.Type.SCALAR)\n+                          .setScalar(Protos.Value.Scalar.newBuilder().setValue(targetMem)))\n+                  .setExecutor(executorBuilder).build();\n+\n+          launch.addTaskInfos(Protos.TaskInfo.newBuilder(task));\n+\n+          remainingCpu -= targetCpu;\n+          remainingMem -= targetMem;\n+        }\n+\n+        // NOTE: We use the new API `acceptOffers` here to launch tasks.\n+        // The 'launchTasks' API will be deprecated.\n+        List<Protos.OfferID> offerIds = new ArrayList<Protos.OfferID>();\n+        offerIds.add(offer.getId());\n+        List<Protos.Offer.Operation> operations = new ArrayList<Protos.Offer.Operation>();\n+        Protos.Offer.Operation operation =\n+            Protos.Offer.Operation.newBuilder().setType(Protos.Offer.Operation.Type.LAUNCH)\n+                .setLaunch(launch).build();\n+        operations.add(operation);\n+        Protos.Filters filters = Protos.Filters.newBuilder().setRefuseSeconds(1).build();\n+        driver.acceptOffers(offerIds, operations, filters);\n+      }\n+    }\n+\n+    @Override\n+    public void slaveLost(SchedulerDriver driver, Protos.SlaveID slaveId) {\n+      System.out.println(\"Executor \" + slaveId.getValue() + \" was lost.\");\n+    }\n+\n+    @Override\n+    public void statusUpdate(SchedulerDriver driver, Protos.TaskStatus status) {\n+      String taskId = status.getTaskId().getValue();\n+      Protos.TaskState state = status.getState();\n+      System.out.printf(\"Task %s is in state %s\\n\", taskId, state);\n+      switch (state) {\n+        case TASK_RUNNING:\n+        case TASK_FINISHED:\n+        case TASK_FAILED:\n+        case TASK_KILLED:\n+        case TASK_LOST:\n+        default:\n+      }\n+    }\n+  }\n+\n+  private static void usage() {\n+    String name = TachyonFramework.class.getName();\n+    System.err.println(\"Usage: \" + name + \" <hostname>\");\n+  }\n+\n+  public static void main(String[] args) throws Exception {\n+    if (args.length != 1) {\n+      usage();\n+      System.exit(1);\n+    }\n+    String hostname = args[0];\n+\n+    // Start Mesos master. Have Mesos fill in the current user.\n+    Protos.FrameworkInfo framework =\n+        Protos.FrameworkInfo.newBuilder().setUser(\"\").setName(\"Test Tachyon Framework\")","path":"mesos/src/main/java/tachyon/mesos/TachyonFramework.java","position":214,"original_position":214,"commit_id":"5233904f13cfb4d20feed85f41af705f9daf6323","original_commit_id":"d0a6daf490763f07d898fda08441b46d83293f2e","user":{"login":"apc999","id":1413748,"avatar_url":"https://avatars.githubusercontent.com/u/1413748?v=3","gravatar_id":"","url":"https://api.github.com/users/apc999","html_url":"https://github.com/apc999","followers_url":"https://api.github.com/users/apc999/followers","following_url":"https://api.github.com/users/apc999/following{/other_user}","gists_url":"https://api.github.com/users/apc999/gists{/gist_id}","starred_url":"https://api.github.com/users/apc999/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apc999/subscriptions","organizations_url":"https://api.github.com/users/apc999/orgs","repos_url":"https://api.github.com/users/apc999/repos","events_url":"https://api.github.com/users/apc999/events{/privacy}","received_events_url":"https://api.github.com/users/apc999/received_events","type":"User","site_admin":false},"body":"- Does pass empty string to `setUser` will make Mesos fill the current user? If yes, state so more explicitly.\r\n- Shall we hard-code the framework name to be \"Test Tachyon Framework\"?","created_at":"2015-09-10T06:11:05Z","updated_at":"2015-09-10T06:11:05Z","html_url":"https://github.com/amplab/tachyon/pull/1450#discussion_r39127515","pull_request_url":"https://api.github.com/repos/amplab/tachyon/pulls/1450","_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments/39127515"},"html":{"href":"https://github.com/amplab/tachyon/pull/1450#discussion_r39127515"},"pull_request":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1450"}}},"pull_request":{"url":"https://api.github.com/repos/amplab/tachyon/pulls/1450","id":44043619,"html_url":"https://github.com/amplab/tachyon/pull/1450","diff_url":"https://github.com/amplab/tachyon/pull/1450.diff","patch_url":"https://github.com/amplab/tachyon/pull/1450.patch","issue_url":"https://api.github.com/repos/amplab/tachyon/issues/1450","number":1450,"state":"open","locked":false,"title":"[TACHYON-913] Add the ability to start Tachyon through Mesos","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":"This PR makes it possible to create both standalone and AWS deployments of Tachyon using Mesos.\r\n\r\n@apc999 @uronce-cc ","created_at":"2015-09-02T21:16:23Z","updated_at":"2015-09-10T06:11:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9828e60a1c99958891e8cd5005444f8d7586736d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/amplab/tachyon/pulls/1450/commits","review_comments_url":"https://api.github.com/repos/amplab/tachyon/pulls/1450/comments","review_comment_url":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/amplab/tachyon/issues/1450/comments","statuses_url":"https://api.github.com/repos/amplab/tachyon/statuses/5233904f13cfb4d20feed85f41af705f9daf6323","head":{"label":"jsimsa:mesos","ref":"mesos","sha":"5233904f13cfb4d20feed85f41af705f9daf6323","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},"repo":{"id":41324456,"name":"tachyon","full_name":"jsimsa/tachyon","owner":{"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},"private":false,"html_url":"https://github.com/jsimsa/tachyon","description":" A Reliable Memory Centric Distributed Storage System","fork":true,"url":"https://api.github.com/repos/jsimsa/tachyon","forks_url":"https://api.github.com/repos/jsimsa/tachyon/forks","keys_url":"https://api.github.com/repos/jsimsa/tachyon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jsimsa/tachyon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jsimsa/tachyon/teams","hooks_url":"https://api.github.com/repos/jsimsa/tachyon/hooks","issue_events_url":"https://api.github.com/repos/jsimsa/tachyon/issues/events{/number}","events_url":"https://api.github.com/repos/jsimsa/tachyon/events","assignees_url":"https://api.github.com/repos/jsimsa/tachyon/assignees{/user}","branches_url":"https://api.github.com/repos/jsimsa/tachyon/branches{/branch}","tags_url":"https://api.github.com/repos/jsimsa/tachyon/tags","blobs_url":"https://api.github.com/repos/jsimsa/tachyon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jsimsa/tachyon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jsimsa/tachyon/git/refs{/sha}","trees_url":"https://api.github.com/repos/jsimsa/tachyon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jsimsa/tachyon/statuses/{sha}","languages_url":"https://api.github.com/repos/jsimsa/tachyon/languages","stargazers_url":"https://api.github.com/repos/jsimsa/tachyon/stargazers","contributors_url":"https://api.github.com/repos/jsimsa/tachyon/contributors","subscribers_url":"https://api.github.com/repos/jsimsa/tachyon/subscribers","subscription_url":"https://api.github.com/repos/jsimsa/tachyon/subscription","commits_url":"https://api.github.com/repos/jsimsa/tachyon/commits{/sha}","git_commits_url":"https://api.github.com/repos/jsimsa/tachyon/git/commits{/sha}","comments_url":"https://api.github.com/repos/jsimsa/tachyon/comments{/number}","issue_comment_url":"https://api.github.com/repos/jsimsa/tachyon/issues/comments{/number}","contents_url":"https://api.github.com/repos/jsimsa/tachyon/contents/{+path}","compare_url":"https://api.github.com/repos/jsimsa/tachyon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jsimsa/tachyon/merges","archive_url":"https://api.github.com/repos/jsimsa/tachyon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jsimsa/tachyon/downloads","issues_url":"https://api.github.com/repos/jsimsa/tachyon/issues{/number}","pulls_url":"https://api.github.com/repos/jsimsa/tachyon/pulls{/number}","milestones_url":"https://api.github.com/repos/jsimsa/tachyon/milestones{/number}","notifications_url":"https://api.github.com/repos/jsimsa/tachyon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jsimsa/tachyon/labels{/name}","releases_url":"https://api.github.com/repos/jsimsa/tachyon/releases{/id}","created_at":"2015-08-24T20:06:14Z","updated_at":"2015-08-24T20:06:16Z","pushed_at":"2015-09-10T05:51:26Z","git_url":"git://github.com/jsimsa/tachyon.git","ssh_url":"git@github.com:jsimsa/tachyon.git","clone_url":"https://github.com/jsimsa/tachyon.git","svn_url":"https://github.com/jsimsa/tachyon","homepage":"http://tachyon-project.org","size":20673,"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":"ccbccb1711d87668a4dc641e1b256e99ff096b8a","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-10T04:09:34Z","pushed_at":"2015-09-10T05:58: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":47116,"stargazers_count":1564,"watchers_count":1564,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":608,"mirror_url":null,"open_issues_count":34,"forks":608,"open_issues":34,"watchers":1564,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1450"},"html":{"href":"https://github.com/amplab/tachyon/pull/1450"},"issue":{"href":"https://api.github.com/repos/amplab/tachyon/issues/1450"},"comments":{"href":"https://api.github.com/repos/amplab/tachyon/issues/1450/comments"},"review_comments":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1450/comments"},"review_comment":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/amplab/tachyon/pulls/1450/commits"},"statuses":{"href":"https://api.github.com/repos/amplab/tachyon/statuses/5233904f13cfb4d20feed85f41af705f9daf6323"}}}}