{"action":"created","comment":{"url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/comments/227664030","pull_request_review_id":167755702,"id":227664030,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNzY2NDAzMA==","diff_hunk":"@@ -259,131 +314,278 @@ private static void parseCmdLine(String[] args) {\n                     runKafka = Boolean.parseBoolean(commandline.getOptionValue(\"kafka\"));\n                 }\n \n+                if (commandline.hasOption(\"segments\")) {\n+                    segmentCount = Integer.parseInt(commandline.getOptionValue(\"segments\"));\n+                } else {\n+                    segmentCount = producerCount; \n+                }\n+\n+                if (commandline.hasOption(\"recreate\")) {\n+                    recreate = Boolean.parseBoolean(commandline.getOptionValue(\"recreate\"));\n+                }\n+\n             }\n         } catch (Exception nfe) {\n             System.out.println(\"Invalid arguments. Starting with default values\");\n             nfe.printStackTrace();\n         }\n     }\n \n-    /**\n-     * A Sensor simulator class that generates dummy value as temperature measurement and ingests to specified stream.\n-     */\n \n-    private static class WriterWorker implements Runnable {\n+    private static class StartLocalService {\n+        static final int PORT = 9090;\n+        static final String SCOPE = \"Scope\";\n+        static final String STREAM_NAME = \"aaj\";\n+    }\n+}\n+\n+class StreamHandler{\n+      String scope;\n+      String stream;\n+      String controllerUri;   \n+      ControllerImpl controller; \n+      StreamManager streamManager;\n+      StreamConfiguration streamconfig;\n+      ReaderGroupManager readerGroupManager; \n+      ReaderGroup readerGroup;\n+      ScheduledExecutorService bgexecutor;\n+      int segCount;\n+      int timeout;\n+\n+\n+      StreamHandler(String scope, String stream, \n+                    String uri, int segs,\n+                    int timeout,  ControllerImpl contrl,\n+                    ScheduledExecutorService bgexecutor) throws Exception {\n+               this.scope = scope;\n+               this.stream = stream;\n+               this.controllerUri= uri;\n+               this.controller = contrl;\n+               this.segCount = segs; \n+               this.timeout = timeout;\n+               this.readerGroup = null;\n+               this.bgexecutor = bgexecutor;\n+               streamManager = StreamManager.create(new URI(uri));\n+               streamManager.createScope(scope);\n+               streamconfig = null;\n+\n+       } \n+\n+\n+       boolean create() throws Exception {\n+               if (streamconfig == null)\n+                   streamconfig = StreamConfiguration.builder().scope(scope).streamName(stream)\n+                                                 .scalingPolicy(ScalingPolicy.fixed(segCount))\n+                                                 .build();\n+   \n+               return streamManager.createStream(scope, stream,streamconfig);\n+       }  \n+\n+       boolean scale() throws Exception {\n+               StreamSegments segments = controller.getCurrentSegments(scope, stream).join();\n+               final int nseg = segments.getSegments().size();\n+               System.out.println(\"Current segments of the stream: \"+stream+ \" = \" + nseg);\n+                \n+               if (nseg == segCount) {\n+                  return true;  \n+               }\n+                  \n+               System.out.println(\"The stream: \" + stream + \" will be manually scaling to \"+ segCount+ \" segments\");\n+\n+               /*\n+                * Note that the Upgrade stream API does not change the number of segments;\n+                * but it indicates with new number of segments.\n+                * after calling update stream , manual scaling is required\n+                */\n+               if (!streamManager.updateStream(scope, stream, streamconfig)) {\n+                    System.out.println(\"Could not able to update the stream: \" + stream + \" try with another stream Name\");\n+                    return false;   \n+               }\n+\n+               final double keyRangeChunk = 1.0 / segCount;\n+               final Map<Double, Double> keyRanges = IntStream.range(0, segCount)\n+                                                              .boxed()\n+                                                              .collect(\n+                                                               Collectors\n+                                                              .toMap(x -> x * keyRangeChunk,\n+                                                                      x->(x + 1) * keyRangeChunk));\n+               final List<Long> segmentList = segments.getSegments()\n+                                                      .stream()\n+                                                      .map(Segment::getSegmentId)\n+                                                      .collect(Collectors.toList());\n+\n+               /*\n+                 System.out.println(\"The key ranges are\");\n+                 Map<Double, Double> map = new TreeMap<Double, Double>(keyRanges);\n+                 map.forEach((k,v) -> System.out.println(\"( \"+k+\", \"+v +\")\"));\n+                 System.out.println(\"segments list:\"+segmentList);\n+               */\n+               CompletableFuture <Boolean> scaleStatus = controller.scaleStream(new StreamImpl(scope,stream),\n+                                                                    segmentList,\n+                                                                    keyRanges,\n+                                                                    bgexecutor).getFuture();\n+\n+\n+               if (!scaleStatus.get(timeout, TimeUnit.SECONDS)){\n+                    System.out.println(\"ERROR : Scale operation on stream \"+ stream+\" did not complete\");\n+                    return false;\n+               }\n+\n+               System.out.println(\"Number of Segments after manual scale: \"+\n+                                   controller.getCurrentSegments(scope, stream)\n+                                             .get().getSegments().size());\n+               return true;\n+\n+       } \n+\n+       boolean recreate() throws Exception {\n+               System.out.println(\"Sealing and Deleteing the stream : \" + stream + \" and then recreating the same\");\n+               CompletableFuture<Boolean> sealStatus =  controller.sealStream(scope, stream);\n+               if (!sealStatus.get(timeout, TimeUnit.SECONDS)) {\n+                    System.out.println(\"ERROR : Segment sealing operation on stream \"+ stream + \" did not complete\");\n+                    return false;\n+               }\n+\n+               CompletableFuture<Boolean> status =  controller.deleteStream(scope, stream);\n+               if (!status.get(timeout, TimeUnit.SECONDS)) {\n+                    System.out.println(\"ERROR : stream: \"+ stream + \" delete failed\");\n+                    return false; \n+               }\n+\n+               if (!streamManager.createStream(scope, stream, streamconfig)) {\n+                    System.out.println(\"ERROR : stream: \"+ stream +\" recreation failed\");\n+                    return false;\n+               }\n+               return true;\n+       }\n+\n+       ReaderGroup  createReaderGroup() throws Exception {\n+              if (readerGroup != null) return readerGroup;\n+\n+              readerGroupManager = ReaderGroupManager.withScope(scope,\n+                                   ClientConfig.builder()\n+                                               .controllerURI(new URI(controllerUri)).build());\n+              readerGroupManager.createReaderGroup(stream,\n+                                 ReaderGroupConfig.builder()\n+                                                  .stream(Stream.of(scope, stream))\n+                                                  .build());\n+              readerGroup = readerGroupManager.getReaderGroup(stream);\n+              return readerGroup;\n+      }     \n+\n+}\n \n-        final EventStreamWriter<String> producer;\n-        private final int producerId;\n-        private final int eventsPerSec;\n-        private final int secondsToRun;\n-        private final boolean isTransaction;\n \n-        WriterWorker(int sensorId, int eventsPerSec, int secondsToRun, boolean isTransaction, boolean isRandomKey,\n-                     ClientFactory factory) {\n+class WriterWorker implements Callable<Void> {\n+      final EventStreamWriter<String> producer;\n+      private final int producerId;\n+      private final int eventsPerSec;\n+      private final int secondsToRun;\n+      private final int messageSize; \n+      private final long StartTime;\n+      private final boolean isRandomKey;\n+      private final PerfStats stats;\n+\n+      WriterWorker(int sensorId, int eventsPerSec, int secondsToRun,\n+                   boolean isRandomKey, int messageSize,  long start,\n+                   ClientFactory factory, PerfStats stats,  String streamName) {\n             this.producerId = sensorId;\n             this.eventsPerSec = eventsPerSec;\n             this.secondsToRun = secondsToRun;\n-            this.isTransaction = isTransaction;\n+            this.StartTime = start;\n+            this.stats = stats;\n+            this.isRandomKey = isRandomKey; \n+            this.messageSize = messageSize;      \n             this.producer = factory.createEventWriter(streamName,\n                     new JavaSerializer<String>(),\n                     EventWriterConfig.builder().build());\n \n-        }\n+      }\n \n-        /**\n-         * This function will be executed in a loop and time behavior is measured.\n-         * @return A function which takes String key and data and returns a future object.\n-         */\n-        BiFunction<String, String, CompletableFuture> sendFunction() {\n+      /**\n+       * This function will be executed in a loop and time behavior is measured.\n+       * @return A function which takes String key and data and returns a future object.\n+       */\n+      BiFunction<String, String, CompletableFuture> sendFunction() {\n             return  ( key, data) -> producer.writeEvent(key, data);\n-        }\n+      }\n \n-        /**\n-         * Executes the given method over the producer with configured settings.\n-         * @param fn The function to execute.\n-         */\n-        void runLoop(BiFunction<String, String, CompletableFuture> fn) {\n+      /**\n+        * Executes the given method over the producer with configured settings.\n+        * @param fn The function to execute.\n+        */\n+      void runLoop(BiFunction<String, String, CompletableFuture> fn) throws Exception {\n \n             CompletableFuture retFuture = null;\n-            for (int i = 0; i < secondsToRun; i++) {\n-                int currentEventsPerSec = 0;\n+            final long mSeconds = secondsToRun*1000;\n+            long diffTime = mSeconds;\n+\n+            do {\n \n                 long loopStartTime = System.currentTimeMillis();\n-                while ( currentEventsPerSec < eventsPerSec) {\n-                    currentEventsPerSec++;\n+                for (int i = 0; i < eventsPerSec; i++)  {\n \n                     // Construct event payload\n                     String val = System.currentTimeMillis() + \", \" + producerId + \", \" + (int) (Math.random() * 200);\n                     String payload = String.format(\"%-\" + messageSize + \"s\", val);\n+                    String key;\n+                    if (isRandomKey) {\n+                        key = Integer.toString(producerId + new Random().nextInt());\n+                    } else {\n+                        key = Integer.toString(producerId);\n+                    }\n+                   \n                     // event ingestion\n-                    long now = System.currentTimeMillis();\n-                    retFuture = produceStats.runAndRecordTime(() -> {\n-                                String key;\n-                                if (isRandomKey) {\n-                                    key = Integer.toString(producerId + new Random().nextInt());\n-                                } else {\n-                                    key = Integer.toString(producerId);\n-                                }\n+                    retFuture = stats.writeAndRecordTime(() -> {\n                                 return fn.apply(key, payload);\n                             },\n-                            now,\n-                            payload.length(), executor);\n-                    //If it is a blocking call, wait for the ack\n-                    if ( blocking ) {\n-                        try {\n-                            retFuture.get();\n-                        } catch (InterruptedException  | ExecutionException e) {\n-                            e.printStackTrace();\n-                        }\n-                    }\n+                            payload.length());\n \n                 }\n+\n                 long timeSpent = System.currentTimeMillis() - loopStartTime;\n-                // wait for next event\n-                try {\n-                    //There is no need for sleep for blocking calls.\n-                    if ( !blocking ) {\n-                        if ( timeSpent < 1000) {\n-                            Thread.sleep(1000 - timeSpent);\n-                        }\n-                    }\n-                } catch (InterruptedException e) {\n-                    // log exception\n-                    System.exit(1);\n-                }\n-            }\n+                     if (timeSpent < 1000) {\n+                          Thread.sleep(1000 - timeSpent);\n+                     }\n+\n+                diffTime = System.currentTimeMillis() - StartTime; \n+ \n+            } while(diffTime < mSeconds);\n+\n             producer.flush();\n-            //producer.close();\n-            try {\n-                //Wait for the last packet to get acked\n-                retFuture.get();\n-            } catch (InterruptedException | ExecutionException e ) {\n-                e.printStackTrace();\n-            }\n+            // producer.close();\n+ \n+            //Wait for the last packet to get acked\n+            retFuture.get();\n         }\n \n-        @Override\n-        public void run() {\n+      @Override\n+      public Void call() throws Exception  {\n             runLoop(sendFunction());\n-            latch.countDown();\n-        }\n-    }\n+            return null;   \n+      }\n+}\n+\n \n+class TransactionWriterWorker extends WriterWorker {","path":"src/main/java/com/emc/pravega/perf/PravegaPerfTest.java","position":636,"original_position":655,"commit_id":"2f83f9da6b28689d23f5736f1b8083b3ba512c85","original_commit_id":"9b91b197ed97b6e75321f1c8ecb9b3d7ea2eda03","user":{"login":"kmgowda","id":7926048,"node_id":"MDQ6VXNlcjc5MjYwNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/7926048?v=4","gravatar_id":"","url":"https://api.github.com/users/kmgowda","html_url":"https://github.com/kmgowda","followers_url":"https://api.github.com/users/kmgowda/followers","following_url":"https://api.github.com/users/kmgowda/following{/other_user}","gists_url":"https://api.github.com/users/kmgowda/gists{/gist_id}","starred_url":"https://api.github.com/users/kmgowda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmgowda/subscriptions","organizations_url":"https://api.github.com/users/kmgowda/orgs","repos_url":"https://api.github.com/users/kmgowda/repos","events_url":"https://api.github.com/users/kmgowda/events{/privacy}","received_events_url":"https://api.github.com/users/kmgowda/received_events","type":"User","site_admin":false},"body":"its not ; ","created_at":"2018-10-24T07:05:35Z","updated_at":"2018-10-24T07:05:35Z","html_url":"https://github.com/pravega/pravega-benchmark/pull/11#discussion_r227664030","pull_request_url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/comments/227664030"},"html":{"href":"https://github.com/pravega/pravega-benchmark/pull/11#discussion_r227664030"},"pull_request":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11"}},"in_reply_to_id":227513432},"pull_request":{"url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11","id":218562654,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE4NTYyNjU0","html_url":"https://github.com/pravega/pravega-benchmark/pull/11","diff_url":"https://github.com/pravega/pravega-benchmark/pull/11.diff","patch_url":"https://github.com/pravega/pravega-benchmark/pull/11.patch","issue_url":"https://api.github.com/repos/pravega/pravega-benchmark/issues/11","number":11,"state":"open","locked":false,"title":"latency, manual scaling, runtime and  segments improvements","user":{"login":"kmgowda","id":7926048,"node_id":"MDQ6VXNlcjc5MjYwNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/7926048?v=4","gravatar_id":"","url":"https://api.github.com/users/kmgowda","html_url":"https://github.com/kmgowda","followers_url":"https://api.github.com/users/kmgowda/followers","following_url":"https://api.github.com/users/kmgowda/following{/other_user}","gists_url":"https://api.github.com/users/kmgowda/gists{/gist_id}","starred_url":"https://api.github.com/users/kmgowda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmgowda/subscriptions","organizations_url":"https://api.github.com/users/kmgowda/orgs","repos_url":"https://api.github.com/users/kmgowda/repos","events_url":"https://api.github.com/users/kmgowda/events{/privacy}","received_events_url":"https://api.github.com/users/kmgowda/received_events","type":"User","site_admin":false},"body":"This PR  Covered Tom's review comments with the following changes\r\n1. The Runnable classes are changed to callable to return the exceptions\r\n       to caller or parent thread.\r\n2. the boolean values and other user inputs are handled at main\r\n3. in case of exception, its stacked back to main and exit; so that its final and single of exit for the benchmarking\r\n4. the \"blocking\" option is removed as it not required; \r\n5. the fork join is made the default and thread executor service is removed to improve the cpu usage \r\n6. the code is refactor to use OO concepts and streams, callables , fork join parallelism effectively\r\n\r\n\r\nCovered Arvind's review comments on https://github.com/pravega/pravega-benchmark/pull/10\r\n\r\nRuntime improvement\r\n•\tThe time is stamped between the starting and ending of the number of events per sec. if it has taken more time then reduce the iterations to complete the bench-marking with in the time\r\n•\tIn case if the number of events completes with in second, then thread should wait till remaining time to cross 1 second.\r\n\r\nLatency accuracy\r\n•\tThe start time is stamped before the write event and end time is stamped in the callback thread of the ack of the completable future of write.\r\n•\tIn case of blocking writes, the time is stamped before and after the write event and ack\r\n\r\nSegments options\r\n•\tIf the existing segment size is not matching with number of producers then its updated\r\n•\tThe new option “-segments ”, creates the number of segments which can less than or more than number of producers.\r\n•\tThe option “-segments ” not supplied then number of segments is set to number of producers\r\n\r\nFork/join option\r\n•\tThe fork executor service is used to improve the number of processors usage. If the latency is low and higher throughput condition, the execution of the parallel thread improve in chronograph. This condition tries to write more data in parallel.\r\n\r\nManual Scaling\r\n•\tIf the stream is already existing then stream is scaling input number of segments; by default, the number of producers are set as number of segments\r\n•\tIf the “-recreate true” is provided, then instead of manual scaling, the existing stream will be sealed, deleted and recreated.\r\n","created_at":"2018-09-27T08:18:40Z","updated_at":"2018-10-24T07:05:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"918c59f3de3f78964b0d0625e2d9b4f0617fedd3","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11/commits","review_comments_url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11/comments","review_comment_url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pravega/pravega-benchmark/issues/11/comments","statuses_url":"https://api.github.com/repos/pravega/pravega-benchmark/statuses/2f83f9da6b28689d23f5736f1b8083b3ba512c85","head":{"label":"kmgowda:kmg-write-async-fix","ref":"kmg-write-async-fix","sha":"2f83f9da6b28689d23f5736f1b8083b3ba512c85","user":{"login":"kmgowda","id":7926048,"node_id":"MDQ6VXNlcjc5MjYwNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/7926048?v=4","gravatar_id":"","url":"https://api.github.com/users/kmgowda","html_url":"https://github.com/kmgowda","followers_url":"https://api.github.com/users/kmgowda/followers","following_url":"https://api.github.com/users/kmgowda/following{/other_user}","gists_url":"https://api.github.com/users/kmgowda/gists{/gist_id}","starred_url":"https://api.github.com/users/kmgowda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmgowda/subscriptions","organizations_url":"https://api.github.com/users/kmgowda/orgs","repos_url":"https://api.github.com/users/kmgowda/repos","events_url":"https://api.github.com/users/kmgowda/events{/privacy}","received_events_url":"https://api.github.com/users/kmgowda/received_events","type":"User","site_admin":false},"repo":{"id":143004769,"node_id":"MDEwOlJlcG9zaXRvcnkxNDMwMDQ3Njk=","name":"pravega-benchmark","full_name":"kmgowda/pravega-benchmark","private":false,"owner":{"login":"kmgowda","id":7926048,"node_id":"MDQ6VXNlcjc5MjYwNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/7926048?v=4","gravatar_id":"","url":"https://api.github.com/users/kmgowda","html_url":"https://github.com/kmgowda","followers_url":"https://api.github.com/users/kmgowda/followers","following_url":"https://api.github.com/users/kmgowda/following{/other_user}","gists_url":"https://api.github.com/users/kmgowda/gists{/gist_id}","starred_url":"https://api.github.com/users/kmgowda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmgowda/subscriptions","organizations_url":"https://api.github.com/users/kmgowda/orgs","repos_url":"https://api.github.com/users/kmgowda/repos","events_url":"https://api.github.com/users/kmgowda/events{/privacy}","received_events_url":"https://api.github.com/users/kmgowda/received_events","type":"User","site_admin":false},"html_url":"https://github.com/kmgowda/pravega-benchmark","description":"Performance benchmark tool for Pravega","fork":true,"url":"https://api.github.com/repos/kmgowda/pravega-benchmark","forks_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/forks","keys_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/teams","hooks_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/hooks","issue_events_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/issues/events{/number}","events_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/events","assignees_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/assignees{/user}","branches_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/branches{/branch}","tags_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/tags","blobs_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/git/refs{/sha}","trees_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/statuses/{sha}","languages_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/languages","stargazers_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/stargazers","contributors_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/contributors","subscribers_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/subscribers","subscription_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/subscription","commits_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/commits{/sha}","git_commits_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/git/commits{/sha}","comments_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/comments{/number}","issue_comment_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/issues/comments{/number}","contents_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/contents/{+path}","compare_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/merges","archive_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/downloads","issues_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/issues{/number}","pulls_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/pulls{/number}","milestones_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/milestones{/number}","notifications_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/labels{/name}","releases_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/releases{/id}","deployments_url":"https://api.github.com/repos/kmgowda/pravega-benchmark/deployments","created_at":"2018-07-31T11:23:59Z","updated_at":"2018-09-27T07:55:39Z","pushed_at":"2018-10-24T06:41:59Z","git_url":"git://github.com/kmgowda/pravega-benchmark.git","ssh_url":"git@github.com:kmgowda/pravega-benchmark.git","clone_url":"https://github.com/kmgowda/pravega-benchmark.git","svn_url":"https://github.com/kmgowda/pravega-benchmark","homepage":null,"size":104,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pravega:master","ref":"master","sha":"08d20d5fc0a18e0efe8084dc02a3f7fe933db455","user":{"login":"pravega","id":25698199,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1Njk4MTk5","avatar_url":"https://avatars1.githubusercontent.com/u/25698199?v=4","gravatar_id":"","url":"https://api.github.com/users/pravega","html_url":"https://github.com/pravega","followers_url":"https://api.github.com/users/pravega/followers","following_url":"https://api.github.com/users/pravega/following{/other_user}","gists_url":"https://api.github.com/users/pravega/gists{/gist_id}","starred_url":"https://api.github.com/users/pravega/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pravega/subscriptions","organizations_url":"https://api.github.com/users/pravega/orgs","repos_url":"https://api.github.com/users/pravega/repos","events_url":"https://api.github.com/users/pravega/events{/privacy}","received_events_url":"https://api.github.com/users/pravega/received_events","type":"Organization","site_admin":false},"repo":{"id":88654227,"node_id":"MDEwOlJlcG9zaXRvcnk4ODY1NDIyNw==","name":"pravega-benchmark","full_name":"pravega/pravega-benchmark","private":false,"owner":{"login":"pravega","id":25698199,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1Njk4MTk5","avatar_url":"https://avatars1.githubusercontent.com/u/25698199?v=4","gravatar_id":"","url":"https://api.github.com/users/pravega","html_url":"https://github.com/pravega","followers_url":"https://api.github.com/users/pravega/followers","following_url":"https://api.github.com/users/pravega/following{/other_user}","gists_url":"https://api.github.com/users/pravega/gists{/gist_id}","starred_url":"https://api.github.com/users/pravega/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pravega/subscriptions","organizations_url":"https://api.github.com/users/pravega/orgs","repos_url":"https://api.github.com/users/pravega/repos","events_url":"https://api.github.com/users/pravega/events{/privacy}","received_events_url":"https://api.github.com/users/pravega/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/pravega/pravega-benchmark","description":"Performance benchmark tool for Pravega","fork":false,"url":"https://api.github.com/repos/pravega/pravega-benchmark","forks_url":"https://api.github.com/repos/pravega/pravega-benchmark/forks","keys_url":"https://api.github.com/repos/pravega/pravega-benchmark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pravega/pravega-benchmark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pravega/pravega-benchmark/teams","hooks_url":"https://api.github.com/repos/pravega/pravega-benchmark/hooks","issue_events_url":"https://api.github.com/repos/pravega/pravega-benchmark/issues/events{/number}","events_url":"https://api.github.com/repos/pravega/pravega-benchmark/events","assignees_url":"https://api.github.com/repos/pravega/pravega-benchmark/assignees{/user}","branches_url":"https://api.github.com/repos/pravega/pravega-benchmark/branches{/branch}","tags_url":"https://api.github.com/repos/pravega/pravega-benchmark/tags","blobs_url":"https://api.github.com/repos/pravega/pravega-benchmark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pravega/pravega-benchmark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pravega/pravega-benchmark/git/refs{/sha}","trees_url":"https://api.github.com/repos/pravega/pravega-benchmark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pravega/pravega-benchmark/statuses/{sha}","languages_url":"https://api.github.com/repos/pravega/pravega-benchmark/languages","stargazers_url":"https://api.github.com/repos/pravega/pravega-benchmark/stargazers","contributors_url":"https://api.github.com/repos/pravega/pravega-benchmark/contributors","subscribers_url":"https://api.github.com/repos/pravega/pravega-benchmark/subscribers","subscription_url":"https://api.github.com/repos/pravega/pravega-benchmark/subscription","commits_url":"https://api.github.com/repos/pravega/pravega-benchmark/commits{/sha}","git_commits_url":"https://api.github.com/repos/pravega/pravega-benchmark/git/commits{/sha}","comments_url":"https://api.github.com/repos/pravega/pravega-benchmark/comments{/number}","issue_comment_url":"https://api.github.com/repos/pravega/pravega-benchmark/issues/comments{/number}","contents_url":"https://api.github.com/repos/pravega/pravega-benchmark/contents/{+path}","compare_url":"https://api.github.com/repos/pravega/pravega-benchmark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pravega/pravega-benchmark/merges","archive_url":"https://api.github.com/repos/pravega/pravega-benchmark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pravega/pravega-benchmark/downloads","issues_url":"https://api.github.com/repos/pravega/pravega-benchmark/issues{/number}","pulls_url":"https://api.github.com/repos/pravega/pravega-benchmark/pulls{/number}","milestones_url":"https://api.github.com/repos/pravega/pravega-benchmark/milestones{/number}","notifications_url":"https://api.github.com/repos/pravega/pravega-benchmark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pravega/pravega-benchmark/labels{/name}","releases_url":"https://api.github.com/repos/pravega/pravega-benchmark/releases{/id}","deployments_url":"https://api.github.com/repos/pravega/pravega-benchmark/deployments","created_at":"2017-04-18T17:52:28Z","updated_at":"2018-06-27T22:40:45Z","pushed_at":"2018-10-24T06:42:01Z","git_url":"git://github.com/pravega/pravega-benchmark.git","ssh_url":"git@github.com:pravega/pravega-benchmark.git","clone_url":"https://github.com/pravega/pravega-benchmark.git","svn_url":"https://github.com/pravega/pravega-benchmark","homepage":null,"size":58,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":3,"open_issues":7,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11"},"html":{"href":"https://github.com/pravega/pravega-benchmark/pull/11"},"issue":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/issues/11"},"comments":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/issues/11/comments"},"review_comments":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/pravega/pravega-benchmark/statuses/2f83f9da6b28689d23f5736f1b8083b3ba512c85"}},"author_association":"NONE"}}
{"actor":{"display_login":"kmgowda"}}