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

maytasm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 8cc58a4  Add sql query id to response header for failed sql query 
(#11756)
8cc58a4 is described below

commit 8cc58a4368428e155ba0d44490dfbbf4e98eb8fc
Author: Maytas Monsereenusorn <[email protected]>
AuthorDate: Thu Sep 30 13:43:39 2021 +0700

    Add sql query id to response header for failed sql query (#11756)
    
    * add impl
    
    * add impl
---
 .../org/apache/druid/sql/http/SqlResource.java     | 17 ++++++----
 .../org/apache/druid/sql/http/SqlResourceTest.java | 37 ++++++++++++++++++++++
 2 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java 
b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
index 2a070f4..6815292 100644
--- a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
+++ b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
@@ -73,6 +73,7 @@ import java.util.stream.Collectors;
 @Path("/druid/v2/sql/")
 public class SqlResource
 {
+  public static final String SQL_QUERY_ID_RESPONSE_HEADER = 
"X-Druid-SQL-Query-Id";
   private static final Logger log = new Logger(SqlResource.class);
 
   private final ObjectMapper jsonMapper;
@@ -164,7 +165,7 @@ public class SqlResource
                   }
                 }
             )
-            .header("X-Druid-SQL-Query-Id", sqlQueryId)
+            .header(SQL_QUERY_ID_RESPONSE_HEADER, sqlQueryId)
             .build();
       }
       catch (Throwable e) {
@@ -175,19 +176,19 @@ public class SqlResource
     }
     catch (QueryCapacityExceededException cap) {
       endLifecycle(sqlQueryId, lifecycle, cap, remoteAddr, -1);
-      return buildNonOkResponse(QueryCapacityExceededException.STATUS_CODE, 
cap);
+      return buildNonOkResponse(QueryCapacityExceededException.STATUS_CODE, 
cap, sqlQueryId);
     }
     catch (QueryUnsupportedException unsupported) {
       endLifecycle(sqlQueryId, lifecycle, unsupported, remoteAddr, -1);
-      return buildNonOkResponse(QueryUnsupportedException.STATUS_CODE, 
unsupported);
+      return buildNonOkResponse(QueryUnsupportedException.STATUS_CODE, 
unsupported, sqlQueryId);
     }
     catch (QueryTimeoutException timeout) {
       endLifecycle(sqlQueryId, lifecycle, timeout, remoteAddr, -1);
-      return buildNonOkResponse(QueryTimeoutException.STATUS_CODE, timeout);
+      return buildNonOkResponse(QueryTimeoutException.STATUS_CODE, timeout, 
sqlQueryId);
     }
     catch (SqlPlanningException | ResourceLimitExceededException e) {
       endLifecycle(sqlQueryId, lifecycle, e, remoteAddr, -1);
-      return buildNonOkResponse(BadQueryException.STATUS_CODE, e);
+      return buildNonOkResponse(BadQueryException.STATUS_CODE, e, sqlQueryId);
     }
     catch (ForbiddenException e) {
       endLifecycleWithoutEmittingMetrics(sqlQueryId, lifecycle);
@@ -207,7 +208,8 @@ public class SqlResource
 
       return buildNonOkResponse(
           Status.INTERNAL_SERVER_ERROR.getStatusCode(),
-          QueryInterruptedException.wrapIfNeeded(exceptionToReport)
+          QueryInterruptedException.wrapIfNeeded(exceptionToReport),
+          sqlQueryId
       );
     }
     finally {
@@ -235,7 +237,7 @@ public class SqlResource
     sqlLifecycleManager.remove(sqlQueryId, lifecycle);
   }
 
-  private Response buildNonOkResponse(int status, SanitizableException e) 
throws JsonProcessingException
+  private Response buildNonOkResponse(int status, SanitizableException e, 
String sqlQueryId) throws JsonProcessingException
   {
     return Response.status(status)
                    .type(MediaType.APPLICATION_JSON_TYPE)
@@ -244,6 +246,7 @@ public class SqlResource
                            
serverConfig.getErrorResponseTransformStrategy().transformIfNeeded(e)
                        )
                    )
+                   .header(SQL_QUERY_ID_RESPONSE_HEADER, sqlQueryId)
                    .build();
   }
 
diff --git a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java 
b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
index f52335d..6da9ccb 100644
--- a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
@@ -22,6 +22,7 @@ package org.apache.druid.sql.http;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
@@ -88,6 +89,7 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.StreamingOutput;
@@ -974,6 +976,41 @@ public class SqlResourceTest extends CalciteTestBase
   }
 
   @Test
+  public void testErrorResponseReturnSameQueryIdWhenSetInContext() throws 
Exception
+  {
+    String queryId = "id123";
+    String errorMessage = "This will be support in Druid 9999";
+    SqlQuery badQuery = EasyMock.createMock(SqlQuery.class);
+    EasyMock.expect(badQuery.getQuery()).andReturn("SELECT ANSWER TO LIFE");
+    
EasyMock.expect(badQuery.getContext()).andReturn(ImmutableMap.of("sqlQueryId", 
queryId));
+    EasyMock.expect(badQuery.getParameterList()).andThrow(new 
QueryUnsupportedException(errorMessage));
+    EasyMock.replay(badQuery);
+    final Response response = resource.doPost(badQuery, req);
+    Assert.assertNotEquals(200, response.getStatus());
+    final MultivaluedMap<String, Object> headers = response.getMetadata();
+    
Assert.assertTrue(headers.containsKey(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER));
+    Assert.assertEquals(1, 
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).size());
+    Assert.assertEquals(queryId, 
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).get(0));
+  }
+
+  @Test
+  public void testErrorResponseReturnNewQueryIdWhenNotSetInContext() throws 
Exception
+  {
+    String errorMessage = "This will be support in Druid 9999";
+    SqlQuery badQuery = EasyMock.createMock(SqlQuery.class);
+    EasyMock.expect(badQuery.getQuery()).andReturn("SELECT ANSWER TO LIFE");
+    EasyMock.expect(badQuery.getContext()).andReturn(ImmutableMap.of());
+    EasyMock.expect(badQuery.getParameterList()).andThrow(new 
QueryUnsupportedException(errorMessage));
+    EasyMock.replay(badQuery);
+    final Response response = resource.doPost(badQuery, req);
+    Assert.assertNotEquals(200, response.getStatus());
+    final MultivaluedMap<String, Object> headers = response.getMetadata();
+    
Assert.assertTrue(headers.containsKey(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER));
+    Assert.assertEquals(1, 
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).size());
+    
Assert.assertFalse(Strings.isNullOrEmpty(headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).get(0).toString()));
+  }
+
+  @Test
   public void testUnsupportedQueryThrowsExceptionWithFilterResponse() throws 
Exception
   {
     resource = new SqlResource(

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to