{"action":"created","comment":{"url":"https://api.github.com/repos/apache/kafka/pulls/comments/242389976","pull_request_review_id":185886416,"id":242389976,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MjM4OTk3Ng==","diff_hunk":"@@ -133,112 +168,162 @@ class SocketServer(val config: KafkaConfig, val metrics: Metrics, val time: Time\n         }\n       }\n     )\n-    info(s\"Started ${acceptors.size} acceptor threads\")\n+    newGauge(\"ControlPlaneExpiredConnectionsKilledCount\",\n+      new Gauge[Double] {\n+\n+        def value = SocketServer.this.synchronized {\n+          val expiredConnectionsKilledCountMetricNames = controlPlaneProcessorOpt.map { p =>\n+            metrics.metricName(\"expired-connections-killed-count\", \"socket-server-metrics\", p.metricTags)\n+          }\n+          expiredConnectionsKilledCountMetricNames.map { metricName =>\n+            Option(metrics.metric(metricName)).fold(0.0)(m => m.metricValue.asInstanceOf[Double])\n+          }.getOrElse(0.0)\n+        }\n+      }\n+    )\n+    info(s\"Started ${dataPlaneAcceptors.size} acceptor threads for data-plane\")\n+    controlPlaneAcceptorOpt.foreach(_ => info(\"Started 1 acceptor thread for control-plane\"))\n+  }\n+\n+  /**\n+   * Starts processors of all the data plane acceptors of this server if they have not already been started.\n+   * This method is used for delayed starting of data plane processors if [[kafka.network.SocketServer#startup]]\n+   * was invoked with `startupProcessors=false`.\n+   */\n+  def startDataPlaneProcessors(): Unit = synchronized {\n+    dataPlaneAcceptors.values.asScala.foreach { _.startProcessors(DataPlanePrefix) }\n+    info(s\"Started data plane processors for ${dataPlaneAcceptors.size} acceptors\")\n   }\n \n   /**\n-   * Starts processors of all the acceptors of this server if they have not already been started.\n-   * This method is used for delayed starting of processors if [[kafka.network.SocketServer#startup]]\n+   * Start the processor of control plane acceptor of this server if it has not already been started.\n+   * This method is used for delayed starting of control plane processor if [[kafka.network.SocketServer#startup]]\n    * was invoked with `startupProcessors=false`.\n    */\n-  def startProcessors(): Unit = synchronized {\n-    acceptors.values.asScala.foreach { _.startProcessors() }\n-    info(s\"Started processors for ${acceptors.size} acceptors\")\n+  def startControlPlaneProcessor(): Unit = synchronized {\n+    controlPlaneAcceptorOpt.foreach { acceptor =>\n+      acceptor.startProcessors(ControlPlanePrefix)\n+      info(s\"Started control plane processor for ${controlPlaneAcceptorOpt.size} acceptors\")\n+    }\n   }\n \n   private def endpoints = config.listeners.map(l => l.listenerName -> l).toMap\n \n-  private def createAcceptorAndProcessors(processorsPerListener: Int,\n-                                          endpoints: Seq[EndPoint]): Unit = synchronized {\n+  private def createDataPlaneAcceptorsAndProcessors(dataProcessorsPerListener: Int,\n+                                                    endpoints: Seq[EndPoint]): Unit = synchronized {\n+    endpoints.foreach { endpoint =>\n+      val dataPlaneAcceptor = createAcceptor(endpoint)\n+      addDataPlaneProcessors(dataPlaneAcceptor, endpoint, dataProcessorsPerListener)\n+      KafkaThread.nonDaemon(s\"data-plane-kafka-socket-acceptor-${endpoint.listenerName}-${endpoint.securityProtocol}-${endpoint.port}\", dataPlaneAcceptor).start()\n+      dataPlaneAcceptor.awaitStartup()\n+      dataPlaneAcceptors.put(endpoint, dataPlaneAcceptor)\n+      info(s\"Created data-plane acceptor and processors for endpoint : $endpoint\")\n+    }\n+  }\n \n+  private def createControlPlaneAcceptorAndProcessor(endpointOpt: Option[EndPoint]): Unit = synchronized {\n+    endpointOpt.foreach { endpoint =>\n+      controlPlaneAcceptorOpt = Some(createAcceptor(endpoint))\n+      controlPlaneProcessorOpt = Some(newProcessor(nextProcessorId, controlPlaneRequestChannelOpt.get, connectionQuotas, endpoint.listenerName, endpoint.securityProtocol, memoryPool))\n+      val listenerProcessors = new ArrayBuffer[Processor]()\n+      controlPlaneProcessorOpt.foreach { processor =>\n+        listenerProcessors += processor\n+        controlPlaneRequestChannelOpt.foreach(_.addProcessor(processor))\n+        val controlPlaneAcceptor = controlPlaneAcceptorOpt.get\n+        controlPlaneAcceptor.addProcessors(listenerProcessors, ControlPlanePrefix)\n+        KafkaThread.nonDaemon(s\"control-plane-kafka-socket-acceptor-${endpoint.listenerName}-${endpoint.securityProtocol}-${endpoint.port}\", controlPlaneAcceptor).start()\n+        controlPlaneAcceptor.awaitStartup()\n+      }\n+      info(s\"Created control-plane acceptor and processor for endpoint : $endpoint\")\n+    }\n+  }\n+\n+  private def createAcceptor(endPoint: EndPoint) : Acceptor = synchronized {\n     val sendBufferSize = config.socketSendBufferBytes\n     val recvBufferSize = config.socketReceiveBufferBytes\n     val brokerId = config.brokerId\n-\n-    endpoints.foreach { endpoint =>\n-      val listenerName = endpoint.listenerName\n-      val securityProtocol = endpoint.securityProtocol\n-\n-      val acceptor = new Acceptor(endpoint, sendBufferSize, recvBufferSize, brokerId, connectionQuotas)\n-      addProcessors(acceptor, endpoint, processorsPerListener)\n-      KafkaThread.nonDaemon(s\"kafka-socket-acceptor-$listenerName-$securityProtocol-${endpoint.port}\", acceptor).start()\n-      acceptor.awaitStartup()\n-      acceptors.put(endpoint, acceptor)\n-    }\n+    new Acceptor(endPoint, sendBufferSize, recvBufferSize, brokerId, connectionQuotas)\n   }\n \n-  private def addProcessors(acceptor: Acceptor, endpoint: EndPoint, newProcessorsPerListener: Int): Unit = synchronized {\n+  private def addDataPlaneProcessors(acceptor: Acceptor, endpoint: EndPoint, newProcessorsPerListener: Int): Unit = synchronized {\n     val listenerName = endpoint.listenerName\n     val securityProtocol = endpoint.securityProtocol\n     val listenerProcessors = new ArrayBuffer[Processor]()\n-\n     for (_ <- 0 until newProcessorsPerListener) {\n-      val processor = newProcessor(nextProcessorId, connectionQuotas, listenerName, securityProtocol, memoryPool)\n+      val processor = newProcessor(nextProcessorId, dataPlaneRequestChannel, connectionQuotas, listenerName, securityProtocol, memoryPool)\n       listenerProcessors += processor\n-      requestChannel.addProcessor(processor)\n+      dataPlaneRequestChannel.addProcessor(processor)\n       nextProcessorId += 1\n     }\n-    listenerProcessors.foreach(p => processors.put(p.id, p))\n-    acceptor.addProcessors(listenerProcessors)\n+    listenerProcessors.foreach(p => dataPlaneProcessors.put(p.id, p))\n+    acceptor.addProcessors(listenerProcessors, DataPlanePrefix)\n   }\n \n   /**\n-    * Stop processing requests and new connections.\n-    */\n+   * Stop processing requests and new connections.\n+   */\n   def stopProcessingRequests() = {\n     info(\"Stopping socket server request processors\")\n     this.synchronized {\n-      acceptors.asScala.values.foreach(_.shutdown())\n-      processors.asScala.values.foreach(_.shutdown())\n-      requestChannel.clear()\n+      dataPlaneAcceptors.asScala.values.foreach(_.shutdown())\n+      controlPlaneAcceptorOpt.foreach(_.shutdown())\n+      dataPlaneProcessors.asScala.values.foreach(_.shutdown())\n+      controlPlaneProcessorOpt.foreach(_.shutdown())\n+      dataPlaneRequestChannel.clear()\n+      controlPlaneRequestChannelOpt.foreach(_.clear())\n       stoppedProcessingRequests = true\n     }\n     info(\"Stopped socket server request processors\")\n   }\n \n   def resizeThreadPool(oldNumNetworkThreads: Int, newNumNetworkThreads: Int): Unit = synchronized {\n-    info(s\"Resizing network thread pool size for each listener from $oldNumNetworkThreads to $newNumNetworkThreads\")\n+    info(s\"Resizing network thread pool size for each data plane listener from $oldNumNetworkThreads to $newNumNetworkThreads\")\n     if (newNumNetworkThreads > oldNumNetworkThreads) {\n-      acceptors.asScala.foreach { case (endpoint, acceptor) =>\n-        addProcessors(acceptor, endpoint, newNumNetworkThreads - oldNumNetworkThreads)\n+      dataPlaneAcceptors.asScala.foreach { case (endpoint, acceptor) =>\n+        addDataPlaneProcessors(acceptor, endpoint, newNumNetworkThreads - oldNumNetworkThreads)\n       }\n     } else if (newNumNetworkThreads < oldNumNetworkThreads)\n-      acceptors.asScala.values.foreach(_.removeProcessors(oldNumNetworkThreads - newNumNetworkThreads, requestChannel))\n+      dataPlaneAcceptors.asScala.values.foreach(_.removeProcessors(oldNumNetworkThreads - newNumNetworkThreads, dataPlaneRequestChannel))\n   }\n \n   /**\n-    * Shutdown the socket server. If still processing requests, shutdown\n-    * acceptors and processors first.\n-    */\n+   * Shutdown the socket server. If still processing requests, shutdown\n+   * acceptors and processors first.\n+   */\n   def shutdown() = {\n     info(\"Shutting down socket server\")\n     this.synchronized {\n       if (!stoppedProcessingRequests)\n         stopProcessingRequests()\n-      requestChannel.shutdown()\n+      dataPlaneRequestChannel.shutdown()\n+      controlPlaneRequestChannelOpt.foreach(_.shutdown())\n     }\n     info(\"Shutdown completed\")\n   }\n \n   def boundPort(listenerName: ListenerName): Int = {\n     try {\n-      acceptors.get(endpoints(listenerName)).serverChannel.socket.getLocalPort\n+      if (dataPlaneAcceptors.containsKey(endpoints(listenerName))) {\n+        dataPlaneAcceptors.get(endpoints(listenerName)).serverChannel.socket.getLocalPort\n+      } else {\n+        controlPlaneAcceptorOpt.map (_.serverChannel.socket().getLocalPort).getOrElse(throw new KafkaException())","path":"core/src/main/scala/kafka/network/SocketServer.scala","position":287,"original_position":287,"commit_id":"983b0f466700586befd5c7dde4dae87768116c55","original_commit_id":"983b0f466700586befd5c7dde4dae87768116c55","user":{"login":"MayureshGharat","id":4326831,"node_id":"MDQ6VXNlcjQzMjY4MzE=","avatar_url":"https://avatars2.githubusercontent.com/u/4326831?v=4","gravatar_id":"","url":"https://api.github.com/users/MayureshGharat","html_url":"https://github.com/MayureshGharat","followers_url":"https://api.github.com/users/MayureshGharat/followers","following_url":"https://api.github.com/users/MayureshGharat/following{/other_user}","gists_url":"https://api.github.com/users/MayureshGharat/gists{/gist_id}","starred_url":"https://api.github.com/users/MayureshGharat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MayureshGharat/subscriptions","organizations_url":"https://api.github.com/users/MayureshGharat/orgs","repos_url":"https://api.github.com/users/MayureshGharat/repos","events_url":"https://api.github.com/users/MayureshGharat/events{/privacy}","received_events_url":"https://api.github.com/users/MayureshGharat/received_events","type":"User","site_admin":false},"body":"Agreed.","created_at":"2018-12-18T02:38:12Z","updated_at":"2018-12-18T02:38:12Z","html_url":"https://github.com/apache/kafka/pull/5921#discussion_r242389976","pull_request_url":"https://api.github.com/repos/apache/kafka/pulls/5921","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/kafka/pulls/comments/242389976"},"html":{"href":"https://github.com/apache/kafka/pull/5921#discussion_r242389976"},"pull_request":{"href":"https://api.github.com/repos/apache/kafka/pulls/5921"}},"in_reply_to_id":241845180},"pull_request":{"url":"https://api.github.com/repos/apache/kafka/pulls/5921","id":231619356,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMxNjE5MzU2","html_url":"https://github.com/apache/kafka/pull/5921","diff_url":"https://github.com/apache/kafka/pull/5921.diff","patch_url":"https://github.com/apache/kafka/pull/5921.patch","issue_url":"https://api.github.com/repos/apache/kafka/issues/5921","number":5921,"state":"open","locked":false,"title":"KAFKA-4453 : Added code to separate controller connections and requests from the data plane","user":{"login":"MayureshGharat","id":4326831,"node_id":"MDQ6VXNlcjQzMjY4MzE=","avatar_url":"https://avatars2.githubusercontent.com/u/4326831?v=4","gravatar_id":"","url":"https://api.github.com/users/MayureshGharat","html_url":"https://github.com/MayureshGharat","followers_url":"https://api.github.com/users/MayureshGharat/followers","following_url":"https://api.github.com/users/MayureshGharat/following{/other_user}","gists_url":"https://api.github.com/users/MayureshGharat/gists{/gist_id}","starred_url":"https://api.github.com/users/MayureshGharat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MayureshGharat/subscriptions","organizations_url":"https://api.github.com/users/MayureshGharat/orgs","repos_url":"https://api.github.com/users/MayureshGharat/repos","events_url":"https://api.github.com/users/MayureshGharat/events{/privacy}","received_events_url":"https://api.github.com/users/MayureshGharat/received_events","type":"User","site_admin":false},"body":"KIP-291 Implementation : Added code to separate controller connections and requests from the data plane.\r\n\r\n- Tested with local deployment that the controller request are handled by the control plane and other requests are handled by the data plane.\r\n- Also added unit tests in order to test the functionality.\r\n\r\n### Committer Checklist (excluded from commit message)\r\n- [ ] Verify design and implementation \r\n- [ ] Verify test coverage and CI build status\r\n- [ ] Verify documentation (including upgrade notes)\r\n","created_at":"2018-11-16T18:36:15Z","updated_at":"2018-12-18T02:38:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c628e502c114cf23d083959e9a67027bf28545bb","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/kafka/pulls/5921/commits","review_comments_url":"https://api.github.com/repos/apache/kafka/pulls/5921/comments","review_comment_url":"https://api.github.com/repos/apache/kafka/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/kafka/issues/5921/comments","statuses_url":"https://api.github.com/repos/apache/kafka/statuses/983b0f466700586befd5c7dde4dae87768116c55","head":{"label":"MayureshGharat:KAFKA-4453","ref":"KAFKA-4453","sha":"983b0f466700586befd5c7dde4dae87768116c55","user":{"login":"MayureshGharat","id":4326831,"node_id":"MDQ6VXNlcjQzMjY4MzE=","avatar_url":"https://avatars2.githubusercontent.com/u/4326831?v=4","gravatar_id":"","url":"https://api.github.com/users/MayureshGharat","html_url":"https://github.com/MayureshGharat","followers_url":"https://api.github.com/users/MayureshGharat/followers","following_url":"https://api.github.com/users/MayureshGharat/following{/other_user}","gists_url":"https://api.github.com/users/MayureshGharat/gists{/gist_id}","starred_url":"https://api.github.com/users/MayureshGharat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MayureshGharat/subscriptions","organizations_url":"https://api.github.com/users/MayureshGharat/orgs","repos_url":"https://api.github.com/users/MayureshGharat/repos","events_url":"https://api.github.com/users/MayureshGharat/events{/privacy}","received_events_url":"https://api.github.com/users/MayureshGharat/received_events","type":"User","site_admin":false},"repo":{"id":43786685,"node_id":"MDEwOlJlcG9zaXRvcnk0Mzc4NjY4NQ==","name":"kafka","full_name":"MayureshGharat/kafka","private":false,"owner":{"login":"MayureshGharat","id":4326831,"node_id":"MDQ6VXNlcjQzMjY4MzE=","avatar_url":"https://avatars2.githubusercontent.com/u/4326831?v=4","gravatar_id":"","url":"https://api.github.com/users/MayureshGharat","html_url":"https://github.com/MayureshGharat","followers_url":"https://api.github.com/users/MayureshGharat/followers","following_url":"https://api.github.com/users/MayureshGharat/following{/other_user}","gists_url":"https://api.github.com/users/MayureshGharat/gists{/gist_id}","starred_url":"https://api.github.com/users/MayureshGharat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MayureshGharat/subscriptions","organizations_url":"https://api.github.com/users/MayureshGharat/orgs","repos_url":"https://api.github.com/users/MayureshGharat/repos","events_url":"https://api.github.com/users/MayureshGharat/events{/privacy}","received_events_url":"https://api.github.com/users/MayureshGharat/received_events","type":"User","site_admin":false},"html_url":"https://github.com/MayureshGharat/kafka","description":"Mirror of Apache Kafka","fork":true,"url":"https://api.github.com/repos/MayureshGharat/kafka","forks_url":"https://api.github.com/repos/MayureshGharat/kafka/forks","keys_url":"https://api.github.com/repos/MayureshGharat/kafka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MayureshGharat/kafka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MayureshGharat/kafka/teams","hooks_url":"https://api.github.com/repos/MayureshGharat/kafka/hooks","issue_events_url":"https://api.github.com/repos/MayureshGharat/kafka/issues/events{/number}","events_url":"https://api.github.com/repos/MayureshGharat/kafka/events","assignees_url":"https://api.github.com/repos/MayureshGharat/kafka/assignees{/user}","branches_url":"https://api.github.com/repos/MayureshGharat/kafka/branches{/branch}","tags_url":"https://api.github.com/repos/MayureshGharat/kafka/tags","blobs_url":"https://api.github.com/repos/MayureshGharat/kafka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MayureshGharat/kafka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MayureshGharat/kafka/git/refs{/sha}","trees_url":"https://api.github.com/repos/MayureshGharat/kafka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MayureshGharat/kafka/statuses/{sha}","languages_url":"https://api.github.com/repos/MayureshGharat/kafka/languages","stargazers_url":"https://api.github.com/repos/MayureshGharat/kafka/stargazers","contributors_url":"https://api.github.com/repos/MayureshGharat/kafka/contributors","subscribers_url":"https://api.github.com/repos/MayureshGharat/kafka/subscribers","subscription_url":"https://api.github.com/repos/MayureshGharat/kafka/subscription","commits_url":"https://api.github.com/repos/MayureshGharat/kafka/commits{/sha}","git_commits_url":"https://api.github.com/repos/MayureshGharat/kafka/git/commits{/sha}","comments_url":"https://api.github.com/repos/MayureshGharat/kafka/comments{/number}","issue_comment_url":"https://api.github.com/repos/MayureshGharat/kafka/issues/comments{/number}","contents_url":"https://api.github.com/repos/MayureshGharat/kafka/contents/{+path}","compare_url":"https://api.github.com/repos/MayureshGharat/kafka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MayureshGharat/kafka/merges","archive_url":"https://api.github.com/repos/MayureshGharat/kafka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MayureshGharat/kafka/downloads","issues_url":"https://api.github.com/repos/MayureshGharat/kafka/issues{/number}","pulls_url":"https://api.github.com/repos/MayureshGharat/kafka/pulls{/number}","milestones_url":"https://api.github.com/repos/MayureshGharat/kafka/milestones{/number}","notifications_url":"https://api.github.com/repos/MayureshGharat/kafka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MayureshGharat/kafka/labels{/name}","releases_url":"https://api.github.com/repos/MayureshGharat/kafka/releases{/id}","deployments_url":"https://api.github.com/repos/MayureshGharat/kafka/deployments","created_at":"2015-10-07T00:28:03Z","updated_at":"2018-06-25T20:22:01Z","pushed_at":"2018-12-06T23:15:56Z","git_url":"git://github.com/MayureshGharat/kafka.git","ssh_url":"git@github.com:MayureshGharat/kafka.git","clone_url":"https://github.com/MayureshGharat/kafka.git","svn_url":"https://github.com/MayureshGharat/kafka","homepage":null,"size":71781,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"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":"trunk"}},"base":{"label":"apache:trunk","ref":"trunk","sha":"87cc31c4e7ea36e7e832a1d02d71480a91a75293","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":2211243,"node_id":"MDEwOlJlcG9zaXRvcnkyMjExMjQz","name":"kafka","full_name":"apache/kafka","private":false,"owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/apache/kafka","description":"Mirror of Apache Kafka","fork":false,"url":"https://api.github.com/repos/apache/kafka","forks_url":"https://api.github.com/repos/apache/kafka/forks","keys_url":"https://api.github.com/repos/apache/kafka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/kafka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/kafka/teams","hooks_url":"https://api.github.com/repos/apache/kafka/hooks","issue_events_url":"https://api.github.com/repos/apache/kafka/issues/events{/number}","events_url":"https://api.github.com/repos/apache/kafka/events","assignees_url":"https://api.github.com/repos/apache/kafka/assignees{/user}","branches_url":"https://api.github.com/repos/apache/kafka/branches{/branch}","tags_url":"https://api.github.com/repos/apache/kafka/tags","blobs_url":"https://api.github.com/repos/apache/kafka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/kafka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/kafka/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/kafka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/kafka/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/kafka/languages","stargazers_url":"https://api.github.com/repos/apache/kafka/stargazers","contributors_url":"https://api.github.com/repos/apache/kafka/contributors","subscribers_url":"https://api.github.com/repos/apache/kafka/subscribers","subscription_url":"https://api.github.com/repos/apache/kafka/subscription","commits_url":"https://api.github.com/repos/apache/kafka/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/kafka/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/kafka/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/kafka/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/kafka/contents/{+path}","compare_url":"https://api.github.com/repos/apache/kafka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/kafka/merges","archive_url":"https://api.github.com/repos/apache/kafka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/kafka/downloads","issues_url":"https://api.github.com/repos/apache/kafka/issues{/number}","pulls_url":"https://api.github.com/repos/apache/kafka/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/kafka/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/kafka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/kafka/labels{/name}","releases_url":"https://api.github.com/repos/apache/kafka/releases{/id}","deployments_url":"https://api.github.com/repos/apache/kafka/deployments","created_at":"2011-08-15T18:06:16Z","updated_at":"2018-12-18T02:02:45Z","pushed_at":"2018-12-18T02:29:35Z","git_url":"git://github.com/apache/kafka.git","ssh_url":"git@github.com:apache/kafka.git","clone_url":"https://github.com/apache/kafka.git","svn_url":"https://github.com/apache/kafka","homepage":null,"size":77364,"stargazers_count":10510,"watchers_count":10510,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":5827,"mirror_url":null,"archived":false,"open_issues_count":542,"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":5827,"open_issues":542,"watchers":10510,"default_branch":"trunk"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/kafka/pulls/5921"},"html":{"href":"https://github.com/apache/kafka/pull/5921"},"issue":{"href":"https://api.github.com/repos/apache/kafka/issues/5921"},"comments":{"href":"https://api.github.com/repos/apache/kafka/issues/5921/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/kafka/pulls/5921/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/kafka/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/kafka/pulls/5921/commits"},"statuses":{"href":"https://api.github.com/repos/apache/kafka/statuses/983b0f466700586befd5c7dde4dae87768116c55"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"MayureshGharat"}}