{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/53893580","id":53893580,"diff_hunk":"@@ -518,6 +592,178 @@ def SingleStreamThroughputBenchmark(storage_schema, host_to_connect=None):\n                   host_to_connect=host_to_connect)\n \n \n+def RunMultiThreadedWorkersWriteResults(worker, worker_args,\n+                                        storage_schema, host_to_connect=None):\n+  \"\"\"Run a worker function in many threads, then gather and print the results.\n+\n+  Args:\n+    worker: either WriteWorker or ReadWorker. The worker function to call.\n+    worker_args: a tuple. The arguments to pass to the worker function. The\n+      result queue and stream number will be appended as the last two arguments.\n+    storage_schema: The schema of the storage provider to use, e.g., \"gs\"\n+    host_to_connect: An optional host endpoint to connect to.\n+\n+  The object size is given by FLAGS.object_size_kb. The number of\n+  objects to transfer (per stream) is given by\n+  FLAGS.objects_per_stream. The benchmark starts at FLAGS.start_time,\n+  if given, or else immediately.\n+\n+  Raises:\n+    LowAvailabilityError: when the storage provider has failed a high number of\n+        our RW requests that exceeds a threshold (>5%), we raise this error\n+        instead of collecting performance numbers from this run.\n+  \"\"\"\n+\n+  result_queue = Queue.Queue()\n+\n+  logging.info('Creating threads')\n+  threads = [threading.Thread(target=worker,\n+                              args=worker_args + (result_queue, i))\n+             for i in xrange(FLAGS.num_streams)]\n+  logging.info('Threads created. Starting threads.')\n+  for thread in threads:\n+    thread.start()\n+  logging.info('Threads started. Joining threads.')\n+  for thread in threads:\n+    thread.join()\n+  logging.info('All threads complete.')\n+\n+  try:\n+    num_results = 0\n+    while True:\n+      res = result_queue.get_nowait()\n+      num_results += 1\n+      stream_num = res['stream_num']\n+      for start_time, latency in zip(res['start_times'], res['latencies']):\n+        json.dump({'kind': res['kind'],\n+                   'start_time': start_time,\n+                   'latency': latency,\n+                   'size': FLAGS.object_size_kb,\n+                   'stream_num': stream_num},\n+                  sys.stdout)\n+        sys.stdout.write('\\n')\n+  except Queue.Empty:\n+    pass\n+\n+  if num_results != FLAGS.num_streams:\n+    raise Exception('Couldn\\'t get results from all streams!')\n+\n+\n+def MultiStreamWrites(storage_schema, host_to_connect=None):\n+  \"\"\"Run multi-stream write threads.\"\"\"\n+  RunMultiThreadedWorkersWriteResults(\n+      WriteWorker,\n+      (storage_schema,\n+       host_to_connect,\n+       FLAGS.object_size_kb,\n+       FLAGS.objects_per_stream,\n+       FLAGS.start_time),\n+      storage_schema,\n+      host_to_connect=host_to_connect)\n+\n+\n+def MultiStreamReads(storage_schema, host_to_connect=None):\n+  \"\"\"Run multi-stream read threads.\"\"\"\n+  RunMultiThreadedWorkersWriteResults(\n+      ReadWorker,\n+      (storage_schema,\n+       host_to_connect,\n+       FLAGS.object_size_kb,\n+       FLAGS.start_time),\n+      storage_schema,\n+      host_to_connect=host_to_connect)\n+\n+\n+def SleepUntilTime(when, too_late=None):\n+  \"\"\"Sleep until a given time.\n+\n+  Args:\n+    when: float. The time to sleep to, as a POSIX timestamp.\n+\n+    too_late: None or Exception. If when is before now + MIN_SLEEP,\n+      raise the given exception. If too_late is None, log a message\n+      but do not raise an exception.\n+  \"\"\"\n+\n+  now = time.time()\n+  sleep_time = when - now\n+  if sleep_time > MIN_SLEEP:\n+    time.sleep(sleep_time)\n+  elif too_late is not None:\n+    raise too_late('Sleep time %s was too small' % sleep_time)\n+  else:\n+    logging.info('Sleep time %s was too small', sleep_time)\n+\n+\n+OBJECTS_WRITTEN_FILE_PREFIX = 'pkb-objects-written-'\n+\n+\n+def WriteWorker(storage_schema, host_to_connect,\n+                object_size_kb, num_objects,\n+                start_time, result_queue, worker_num):\n+  payload_bytes, payload_string = GenerateWritePayload(\n+      object_size_kb * BYTES_PER_KILOBYTE)\n+\n+  objects_written = []\n+  start_times = []\n+  latencies = []\n+\n+  if start_time is not None:\n+    SleepUntilTime(start_time, too_late=Exception)\n+\n+  WriteObjectsFromBuffer(storage_schema, FLAGS.bucket,\n+                         ('pkb_write_worker_%s' % worker_num),\n+                         num_objects, payload_bytes, payload_string,\n+                         object_size_kb * BYTES_PER_KILOBYTE,\n+                         objects_written,\n+                         object_start_times=start_times,\n+                         latency_results=latencies,\n+                         host_to_connect=host_to_connect)\n+\n+  objects_filename = os.path.join(TMP_DIR,\n+                                  OBJECTS_WRITTEN_FILE_PREFIX + str(worker_num))\n+\n+  # Error handling deliberately omitted - abort on any exception.\n+  if os.path.exists(objects_filename):\n+    os.remove(objects_filename)\n+  with open(objects_filename, 'w') as out:\n+    json.dump(objects_written, out)\n+\n+  result_queue.put({'kind': 'upload',\n+                    'start_times': start_times,\n+                    'latencies': latencies,\n+                    'stream_num': worker_num})\n+\n+\n+def ReadWorker(storage_schema, host_to_connect,\n+               object_size_kb, start_time,\n+               result_queue, worker_num):\n+\n+  objects_filename = os.path.join(TMP_DIR,","path":"perfkitbenchmarker/scripts/object_storage_api_tests.py","position":331,"original_position":331,"commit_id":"b1c3cb1d222fa71971f1ab3036911dfea64a98b9","original_commit_id":"b1c3cb1d222fa71971f1ab3036911dfea64a98b9","user":{"login":"stfeng","id":10470372,"avatar_url":"https://avatars.githubusercontent.com/u/10470372?v=3","gravatar_id":"","url":"https://api.github.com/users/stfeng","html_url":"https://github.com/stfeng","followers_url":"https://api.github.com/users/stfeng/followers","following_url":"https://api.github.com/users/stfeng/following{/other_user}","gists_url":"https://api.github.com/users/stfeng/gists{/gist_id}","starred_url":"https://api.github.com/users/stfeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stfeng/subscriptions","organizations_url":"https://api.github.com/users/stfeng/orgs","repos_url":"https://api.github.com/users/stfeng/repos","events_url":"https://api.github.com/users/stfeng/events{/privacy}","received_events_url":"https://api.github.com/users/stfeng/received_events","type":"User","site_admin":false},"body":"As we discussed in person, we should support the use case where we need to write once and read multiple times with different stream counts. For that to work, we need to read all object name files under the /tmp dir (read the object name, size pairs into an array) and then sub-divide that array into segments and pass those segments into each read worker. That will be done by the caller of this function, this function will just get an array of <object_name, object_size> pairs and work on that.","created_at":"2016-02-24T04:42:12Z","updated_at":"2016-02-24T04:42:12Z","html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840#discussion_r53893580","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/53893580"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840#discussion_r53893580"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840","id":58832092,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840","diff_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840.diff","patch_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/840","number":840,"state":"open","locked":false,"title":"Add MultiStreamThroughput benchmark to object storage benchmarks","user":{"login":"noahl","id":16882,"avatar_url":"https://avatars.githubusercontent.com/u/16882?v=3","gravatar_id":"","url":"https://api.github.com/users/noahl","html_url":"https://github.com/noahl","followers_url":"https://api.github.com/users/noahl/followers","following_url":"https://api.github.com/users/noahl/following{/other_user}","gists_url":"https://api.github.com/users/noahl/gists{/gist_id}","starred_url":"https://api.github.com/users/noahl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/noahl/subscriptions","organizations_url":"https://api.github.com/users/noahl/orgs","repos_url":"https://api.github.com/users/noahl/repos","events_url":"https://api.github.com/users/noahl/events{/privacy}","received_events_url":"https://api.github.com/users/noahl/received_events","type":"User","site_admin":false},"body":"Add the MultiStreamThroughput benchmark for object storage\r\nservices. This also requires splitting WriteObjects() in\r\nscripts/object_storage_api_tests.py into two functions that work\r\ntogether.","created_at":"2016-02-10T00:32:34Z","updated_at":"2016-02-24T04:42:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d6cfd9d2f6d477679c258dc666bb28aa676ff8cf","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/840/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/b1c3cb1d222fa71971f1ab3036911dfea64a98b9","head":{"label":"GoogleCloudPlatform:multistream-throughput-v3","ref":"multistream-throughput-v3","sha":"b1c3cb1d222fa71971f1ab3036911dfea64a98b9","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":21950910,"name":"PerfKitBenchmarker","full_name":"GoogleCloudPlatform/PerfKitBenchmarker","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","description":"Perfkit Benchmarker contains set of benchmarks to measure and compare cloud offerings. The benchmarks use defaults to reflect what most users will see. PerfKit Benchmarker is licensed under the Apache 2 license terms. Please make sure to read, understand and agree to the terms of the LICENSE and CONTRIBUTING files before proceeding.","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/deployments","created_at":"2014-07-17T17:23:26Z","updated_at":"2016-02-24T04:21:10Z","pushed_at":"2016-02-24T00:03:12Z","git_url":"git://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","ssh_url":"git@github.com:GoogleCloudPlatform/PerfKitBenchmarker.git","clone_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","svn_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","homepage":"http://googlecloudplatform.github.io/PerfKitBenchmarker/","size":84959,"stargazers_count":593,"watchers_count":593,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":116,"mirror_url":null,"open_issues_count":111,"forks":116,"open_issues":111,"watchers":593,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"47661f69cdbd923da71c3118632c95fbf2ccb35c","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":21950910,"name":"PerfKitBenchmarker","full_name":"GoogleCloudPlatform/PerfKitBenchmarker","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","description":"Perfkit Benchmarker contains set of benchmarks to measure and compare cloud offerings. The benchmarks use defaults to reflect what most users will see. PerfKit Benchmarker is licensed under the Apache 2 license terms. Please make sure to read, understand and agree to the terms of the LICENSE and CONTRIBUTING files before proceeding.","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/deployments","created_at":"2014-07-17T17:23:26Z","updated_at":"2016-02-24T04:21:10Z","pushed_at":"2016-02-24T00:03:12Z","git_url":"git://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","ssh_url":"git@github.com:GoogleCloudPlatform/PerfKitBenchmarker.git","clone_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","svn_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","homepage":"http://googlecloudplatform.github.io/PerfKitBenchmarker/","size":84959,"stargazers_count":593,"watchers_count":593,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":116,"mirror_url":null,"open_issues_count":111,"forks":116,"open_issues":111,"watchers":593,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/840"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/840"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/840/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/840/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/b1c3cb1d222fa71971f1ab3036911dfea64a98b9"}}}}