This is an automated email from the ASF dual-hosted git repository.

chengpan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-celeborn.git


The following commit(s) were added to refs/heads/main by this push:
     new 438cdf674 [CELEBORN-973] Improve HttpRequestHandler handle HTTP 
request with base, master and worker
438cdf674 is described below

commit 438cdf6747a240a5fd6a59e5f8a8d2bfeaac7076
Author: SteNicholas <[email protected]>
AuthorDate: Thu Oct 12 15:08:15 2023 +0800

    [CELEBORN-973] Improve HttpRequestHandler handle HTTP request with base, 
master and worker
    
    ### What changes were proposed in this pull request?
    
    The code that `HttpRequestHandler` handles HTTP request could be improved 
with handling HTTP request with base, master and worker.
    
    ### Why are the changes needed?
    
    Improves `HttpRequestHandler` handle HTTP request with base, master and 
worker.
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    Internal tests.
    
    Closes #1977 from SteNicholas/http-request-handler.
    
    Authored-by: SteNicholas <[email protected]>
    Signed-off-by: Cheng Pan <[email protected]>
---
 .../server/common/http/HttpRequestHandler.scala    | 106 ++++++++++++++++-----
 1 file changed, 80 insertions(+), 26 deletions(-)

diff --git 
a/service/src/main/scala/org/apache/celeborn/server/common/http/HttpRequestHandler.scala
 
b/service/src/main/scala/org/apache/celeborn/server/common/http/HttpRequestHandler.scala
index 2115aef14..d574947ed 100644
--- 
a/service/src/main/scala/org/apache/celeborn/server/common/http/HttpRequestHandler.scala
+++ 
b/service/src/main/scala/org/apache/celeborn/server/common/http/HttpRequestHandler.scala
@@ -27,14 +27,18 @@ import org.apache.celeborn.common.internal.Logging
 import org.apache.celeborn.common.metrics.sink.PrometheusHttpRequestHandler
 import org.apache.celeborn.server.common.{HttpService, Service}
 
+/**
+ * A handler for the REST API that defines how to handle the HTTP request 
given a message.
+ *
+ * @param service The service of HTTP server.
+ * @param uri The uri of HTTP request.
+ */
 @Sharable
 class HttpRequestHandler(
     service: HttpService,
     prometheusHttpRequestHandler: PrometheusHttpRequestHandler)
   extends SimpleChannelInboundHandler[FullHttpRequest] with Logging {
 
-  private val INVALID = "invalid"
-
   override def channelReadComplete(ctx: ChannelHandlerContext): Unit = {
     ctx.flush()
   }
@@ -43,11 +47,11 @@ class HttpRequestHandler(
     val uri = req.uri()
     val msg = handleRequest(uri)
     val response = msg match {
-      case INVALID =>
+      case "invalid" =>
         if (prometheusHttpRequestHandler != null) {
           prometheusHttpRequestHandler.handleRequest(uri)
         } else {
-          s"invalid uri ${uri}"
+          s"invalid uri $uri"
         }
       case _ => msg
     }
@@ -56,46 +60,96 @@ class HttpRequestHandler(
       HttpVersion.HTTP_1_1,
       HttpResponseStatus.OK,
       Unpooled.copiedBuffer(response, CharsetUtil.UTF_8))
-    res.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; 
charset=UTF-8");
-    ctx.writeAndFlush(res).addListener(ChannelFutureListener.CLOSE);
+    res.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8")
+    ctx.writeAndFlush(res).addListener(ChannelFutureListener.CLOSE)
+  }
+
+  private def handleRequest(uri: String): String = {
+    if (service.serviceName == Service.MASTER) {
+      new MasterRequestHandler(service, uri).handle()
+    } else {
+      new WorkerRequestHandler(service, uri).handle()
+    }
   }
+}
+
+/**
+ * A basic handler for the REST API that defines how to handle the HTTP 
request.
+ *
+ * @param service The service of HTTP server.
+ * @param uri The uri of HTTP request.
+ */
+class BaseRequestHandler(service: HttpService, uri: String) extends Logging {
 
-  def handleRequest(uri: String): String = {
-    val (path, parameters) = HttpUtils.parseUrl(uri)
+  val (path, parameters) = HttpUtils.parseUrl(uri)
+
+  def handle(): String = {
     path match {
       case "/conf" =>
         service.getConf
-      case "/masterGroupInfo" if service.serviceName == Service.MASTER =>
-        service.getMasterGroupInfo
       case "/workerInfo" =>
         service.getWorkerInfo
-      case "/lostWorkers" if service.serviceName == Service.MASTER =>
-        service.getLostWorkers
-      case "/excludedWorkers" if service.serviceName == Service.MASTER =>
-        service.getExcludedWorkers
-      case "/shutdownWorkers" if service.serviceName == Service.MASTER =>
-        service.getShutdownWorkers
       case "/threadDump" =>
         service.getThreadDump
-      case "/hostnames" if service.serviceName == Service.MASTER =>
-        service.getHostnameList
-      case "/applications" if service.serviceName == Service.MASTER =>
-        service.getApplicationList
       case "/shuffles" =>
         service.getShuffleList
       case "/listTopDiskUsedApps" =>
         service.listTopDiskUseApps
-      case "/listPartitionLocationInfo" if service.serviceName == 
Service.WORKER =>
+      case _ => "invalid"
+    }
+  }
+}
+
+/**
+ * A handler for the REST API that defines how to handle the HTTP request from 
master.
+ *
+ * @param service The service of HTTP server.
+ * @param uri The uri of HTTP request from master.
+ */
+class MasterRequestHandler(service: HttpService, uri: String)
+  extends BaseRequestHandler(service, uri) with Logging {
+
+  override def handle(): String = {
+    path match {
+      case "/masterGroupInfo" =>
+        service.getMasterGroupInfo
+      case "/lostWorkers" =>
+        service.getLostWorkers
+      case "/excludedWorkers" =>
+        service.getExcludedWorkers
+      case "/shutdownWorkers" =>
+        service.getShutdownWorkers
+      case "/hostnames" =>
+        service.getHostnameList
+      case "/applications" =>
+        service.getApplicationList
+      case _ => super.handle()
+    }
+  }
+}
+
+/**
+ * A handler for the REST API that defines how to handle the HTTP request from 
worker.
+ *
+ * @param service The service of HTTP server.
+ * @param uri The uri of HTTP request from worker.
+ */
+class WorkerRequestHandler(service: HttpService, uri: String)
+  extends BaseRequestHandler(service, uri) with Logging {
+
+  override def handle(): String = {
+    path match {
+      case "/listPartitionLocationInfo" =>
         service.listPartitionLocationInfo
-      case "/unavailablePeers" if service.serviceName == Service.WORKER =>
+      case "/unavailablePeers" =>
         service.getUnavailablePeers
-      case "/isShutdown" if service.serviceName == Service.WORKER =>
+      case "/isShutdown" =>
         service.isShutdown
-      case "/isRegistered" if service.serviceName == Service.WORKER =>
+      case "/isRegistered" =>
         service.isRegistered
-      case "/exit" if service.serviceName == Service.WORKER =>
+      case "/exit" =>
         service.exit(parameters.getOrElse("TYPE", ""))
-      case _ => INVALID
+      case _ => super.handle()
     }
   }
 }

Reply via email to