Bladeren bron

AMBARI-5047. API proxy returns "204 No Content" if the underlying call takes more than a few seconds.(vbrodetskyi)

Vitaly Brodetskyi 11 jaren geleden
bovenliggende
commit
b4307db96d

+ 7 - 5
ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java

@@ -48,9 +48,9 @@ import java.util.HashMap;
 @Path("/")
 public class ProxyService {
 
-  private static final int REPO_URL_CONNECT_TIMEOUT = 3000;
-  private static final int REPO_URL_READ_TIMEOUT = 3000;
-  private static final int HTTP_ERROR_RANGE_START = 400;
+  private static final int URL_CONNECT_TIMEOUT = 20000;
+  private static final int URL_READ_TIMEOUT = 15000;
+  private static final int HTTP_ERROR_RANGE_START = Response.Status.BAD_REQUEST.getStatusCode();
 
   private static final String REQUEST_TYPE_GET = "GET";
   private static final String REQUEST_TYPE_POST = "POST";
@@ -85,8 +85,8 @@ public class ProxyService {
   }
 
   private Response handleRequest(String requestType, UriInfo ui, InputStream body, HttpHeaders headers) {
-    URLStreamProvider urlStreamProvider = new URLStreamProvider(REPO_URL_CONNECT_TIMEOUT,
-                                                REPO_URL_READ_TIMEOUT, null, null, null);
+    URLStreamProvider urlStreamProvider = new URLStreamProvider(URL_CONNECT_TIMEOUT,
+                                                URL_READ_TIMEOUT, null, null, null);
     String query = ui.getRequestUri().getQuery();
     if (query != null && query.indexOf(QUERY_PARAMETER_URL) != -1) {
       String url = query.replaceFirst(QUERY_PARAMETER_URL, "");
@@ -106,6 +106,8 @@ public class ProxyService {
         return rb.type(contentType).build();
       } catch (IOException e) {
         LOG.error(ERROR_PROCESSING_URL + url, e);
+        return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).type(MediaType.TEXT_PLAIN).
+               entity(e.getMessage()).build();
       }
     }
     return null;

+ 7 - 7
ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java

@@ -84,7 +84,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("text/plain");
     expect(urlConnectionMock.getInputStream()).andReturn(is);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(Response.status(200)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
@@ -121,7 +121,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("text/plain");
     expect(urlConnectionMock.getInputStream()).andReturn(is);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(Response.status(200)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
@@ -158,7 +158,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("text/plain");
     expect(urlConnectionMock.getInputStream()).andReturn(is);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(Response.status(200)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
@@ -194,7 +194,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("text/plain");
     expect(urlConnectionMock.getInputStream()).andReturn(is);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(Response.status(200)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
@@ -224,7 +224,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(uriMock.getQuery()).andReturn("url=testurl");
     expect(streamProviderMock.processURL("testurl", "GET", null, headerParamsToForward)).andReturn(urlConnectionMock);
     expect(urlConnectionMock.getResponseCode()).andReturn(405).times(2);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     PowerMock.replay(streamProviderMock, URLStreamProvider.class, uriMock, URI.class);
     replay(getUriInfo(), urlConnectionMock, getHttpHeaders());
     ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
@@ -255,7 +255,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("application/json");
     expect(urlConnectionMock.getInputStream()).andReturn(new ByteArrayInputStream("{ \"test\":\"test\" }".getBytes()));
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(Response.status(200)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.entity(map)).andReturn(responseBuilderMock);
     expect(responseBuilderMock.type("application/json")).andReturn(responseBuilderMock);
@@ -287,7 +287,7 @@ class ProxyServiceTest extends BaseServiceTest {
     expect(urlConnectionMock.getResponseCode()).andReturn(200);
     expect(urlConnectionMock.getContentType()).andReturn("text/plain");
     expect(urlConnectionMock.getInputStream()).andReturn(is);
-    PowerMock.expectNew(URLStreamProvider.class, 3000, 3000, null, null, null).andReturn(streamProviderMock);
+    PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock);
     expect(streamProviderMock.processURL("http://server:8188/ws/v1/timeline/HIVE_QUERY_ID?fields=events,primary" +
      "filters&limit=10&primaryFilter=user:hiveuser1", "GET", null, headerParamsToForward)).andReturn(urlConnectionMock);
     PowerMock.replay(streamProviderMock, URLStreamProvider.class);