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

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


The following commit(s) were added to refs/heads/master by this push:
     new 079a720  HIVE-21597: WM trigger validation should happen at the time 
of create or alter (Prasanth Jayachandran reviewed by Daniel Dai)
079a720 is described below

commit 079a7208363e4798d24a54d997d5b0f1cb7cd657
Author: Prasanth Jayachandran <prasan...@apache.org>
AuthorDate: Fri Apr 12 16:37:13 2019 -0700

    HIVE-21597: WM trigger validation should happen at the time of create or 
alter (Prasanth Jayachandran reviewed by Daniel Dai)
---
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java    | 11 +++++++
 .../hive/ql/exec/tez/TriggerValidatorRunnable.java |  8 ++++-
 ql/src/test/queries/clientpositive/resourceplan.q  | 10 ++++--
 .../results/clientpositive/llap/resourceplan.q.out | 36 ++++++++++++++--------
 .../apache/hive/service/server/KillQueryImpl.java  |  4 +--
 5 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 7c5a47e..7f0eb40 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -190,6 +190,7 @@ import 
org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeObje
 import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveRoleGrant;
 import 
org.apache.hadoop.hive.ql.security.authorization.plugin.HiveV1Authorizer;
 import org.apache.hadoop.hive.ql.session.SessionState;
+import org.apache.hadoop.hive.ql.wm.ExecutionTrigger;
 import org.apache.hadoop.hive.serde2.Deserializer;
 import org.apache.hadoop.hive.serde2.MetadataTypedColumnsetSerDe;
 import org.apache.hadoop.hive.serde2.avro.AvroSerdeUtils;
@@ -595,11 +596,21 @@ public class DDLTask extends Task<DDLWork> implements 
Serializable {
   }
 
   private int createWMTrigger(Hive db, CreateWMTriggerDesc desc) throws 
HiveException {
+    validateTrigger(desc.getTrigger());
     db.createWMTrigger(desc.getTrigger());
     return 0;
   }
 
+  private void validateTrigger(final WMTrigger trigger) throws HiveException {
+    try {
+      ExecutionTrigger.fromWMTrigger(trigger);
+    } catch (IllegalArgumentException e) {
+      throw new HiveException(e);
+    }
+  }
+
   private int alterWMTrigger(Hive db, AlterWMTriggerDesc desc) throws 
HiveException {
+    validateTrigger(desc.getTrigger());
     db.alterWMTrigger(desc.getTrigger());
     return 0;
   }
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
index 670184b..8fb0695 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
@@ -72,10 +72,16 @@ public class TriggerValidatorRunnable implements Runnable {
                       currentCounterValue);
                     violatedSessions.put(sessionState, currentTrigger);
                     LOG.info("KILL trigger replacing MOVE for query {}", 
queryId);
-                  } else {
+                  } else if 
(existingTrigger.getAction().getType().equals(Action.Type.MOVE_TO_POOL) &&
+                    
currentTrigger.getAction().getType().equals(Action.Type.MOVE_TO_POOL)){
                     // if multiple MOVE happens, only first move will be chosen
                     LOG.warn("Conflicting MOVE triggers ({} and {}). Choosing 
the first MOVE trigger: {}",
                       existingTrigger, currentTrigger, 
existingTrigger.getName());
+                  } else if 
(existingTrigger.getAction().getType().equals(Action.Type.KILL_QUERY) &&
+                    
currentTrigger.getAction().getType().equals(Action.Type.KILL_QUERY)){
+                    // if multiple KILL happens, only first kill will be chosen
+                    LOG.warn("Conflicting KILL triggers ({} and {}). Choosing 
the first KILL trigger: {}",
+                      existingTrigger, currentTrigger, 
existingTrigger.getName());
                   }
                 } else {
                   // first violation for the session
diff --git a/ql/src/test/queries/clientpositive/resourceplan.q 
b/ql/src/test/queries/clientpositive/resourceplan.q
index 46aae72..93d848b 100644
--- a/ql/src/test/queries/clientpositive/resourceplan.q
+++ b/ql/src/test/queries/clientpositive/resourceplan.q
@@ -179,11 +179,17 @@ CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME >= 
'30seconds' DO MOVE TO slow
 CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME < '30hour' DO MOVE TO 
slow_pool;
 CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME <= '30min' DO MOVE TO 
slow_pool;
 CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME = '0day' DO MOVE TO 
slow_pool;
+-- invalid size unit
+CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '10k' DO KILL;
+-- invalid time unit
+CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '10 millis' DO KILL;
+-- invalid long value
+CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '-1000' DO KILL;
 
 CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO 
slow_pool;
 SELECT * FROM SYS.WM_TRIGGERS;
 
-ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL;
+ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL;
 SELECT * FROM SYS.WM_TRIGGERS;
 
 DROP TRIGGER plan_1.trigger_1;
@@ -193,7 +199,7 @@ SELECT * FROM SYS.WM_TRIGGERS;
 CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > '100mb' DO MOVE TO null_pool;
 
 -- Add trigger with reserved keywords.
-CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table`;
+CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO 
`default`;
 CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO 
`default`;
 CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > "1GB" DO MOVE TO 
`default`;
 CREATE TRIGGER `table`.`trigger1` WHEN ELAPSED_TIME > 10 DO KILL;
diff --git a/ql/src/test/results/clientpositive/llap/resourceplan.q.out 
b/ql/src/test/results/clientpositive/llap/resourceplan.q.out
index 9ae68f4..c0d6ec2 100644
--- a/ql/src/test/results/clientpositive/llap/resourceplan.q.out
+++ b/ql/src/test/results/clientpositive/llap/resourceplan.q.out
@@ -4059,6 +4059,18 @@ FAILED: ParseException line 2:50 mismatched input '>=' 
expecting > near 'ELAPSED
 FAILED: ParseException line 2:50 mismatched input '<' expecting > near 
'ELAPSED_TIME' in comparisionOperator
 FAILED: ParseException line 2:50 mismatched input '<=' expecting > near 
'ELAPSED_TIME' in comparisionOperator
 FAILED: ParseException line 2:50 mismatched input '=' expecting > near 
'ELAPSED_TIME' in comparisionOperator
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '10k' DO KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: 
Invalid size unit k
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '10 
millis' DO KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: 
Invalid time unit millis
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '-1000' DO 
KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: 
Illegal value for counter limit. Expected a positive long value.
 PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' 
DO MOVE TO slow_pool
 PREHOOK: type: CREATE TRIGGER
 PREHOOK: Output: dummyHostnameForTest
@@ -4074,10 +4086,10 @@ POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
 plan_1 default trigger_1       BYTES_READ > '10kb'     KILL
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
-PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL
+PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL
 PREHOOK: type: ALTER TRIGGER
 PREHOOK: Output: dummyHostnameForTest
-POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO 
KILL
+POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL
 POSTHOOK: type: ALTER TRIGGER
 PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS
 PREHOOK: type: QUERY
@@ -4087,7 +4099,7 @@ POSTHOOK: query: SELECT * FROM SYS.WM_TRIGGERS
 POSTHOOK: type: QUERY
 POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
-plan_1 default trigger_1       BYTES_READ > '1min'     KILL
+plan_1 default trigger_1       BYTES_READ > '1GB'      KILL
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
 PREHOOK: query: DROP TRIGGER plan_1.trigger_1
 PREHOOK: type: DROP TRIGGER
@@ -4107,10 +4119,10 @@ PREHOOK: query: CREATE TRIGGER plan_2.trigger_1 WHEN 
BYTES_READ > '100mb' DO MOV
 PREHOOK: type: CREATE TRIGGER
 PREHOOK: Output: dummyHostnameForTest
 FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. 
InvalidOperationException(message:Resource plan must be disabled to edit it.)
-PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO 
MOVE TO `table`
+PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO 
MOVE TO `default`
 PREHOOK: type: CREATE TRIGGER
 PREHOOK: Output: dummyHostnameForTest
-POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' 
DO MOVE TO `table`
+POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' 
DO MOVE TO `default`
 POSTHOOK: type: CREATE TRIGGER
 PREHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' 
DO MOVE TO `default`
 PREHOOK: type: CREATE TRIGGER
@@ -4142,7 +4154,7 @@ POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
 table  default database        BYTES_WRITTEN > "1GB"   MOVE TO default
-table  default table   BYTES_WRITTEN > '100KB' MOVE TO table
+table  default table   BYTES_WRITTEN > '100KB' MOVE TO default
 table  default trigger BYTES_WRITTEN > '100MB' MOVE TO default
 table  default trigger1        ELAPSED_TIME > 10       KILL
 table  default trigger2        ELAPSED_TIME > '1hour'  KILL
@@ -4160,7 +4172,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
-table  default table   BYTES_WRITTEN > '100KB' MOVE TO table
+table  default table   BYTES_WRITTEN > '100KB' MOVE TO default
 table  default trigger BYTES_WRITTEN > '100MB' MOVE TO default
 table  default trigger1        ELAPSED_TIME > 10       KILL
 table  default trigger2        ELAPSED_TIME > '1hour'  KILL
@@ -4232,7 +4244,7 @@ POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
 plan_2 default trigger_1       BYTES_READ > 0  MOVE TO null_pool
-table  default table   BYTES_WRITTEN > '100KB' MOVE TO table
+table  default table   BYTES_WRITTEN > '100KB' MOVE TO default
 table  default trigger BYTES_WRITTEN > '100MB' MOVE TO default
 table  default trigger1        ELAPSED_TIME > 10       KILL
 table  default trigger2        ELAPSED_TIME > '1hour'  KILL
@@ -4615,13 +4627,13 @@ POSTHOOK: query: SHOW RESOURCE PLAN `table`
 POSTHOOK: type: SHOW RESOURCEPLAN
 table[status=DISABLED,parallelism=1,defaultPool=null]
  +  table[allocFraction=0.0,schedulingPolicy=fifo,parallelism=1]
-     |  trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO table }
+     |  trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO default }
      +  pool[allocFraction=0.9,schedulingPolicy=fair,parallelism=3]
          +  child2[allocFraction=0.7,schedulingPolicy=fair,parallelism=3]
              |  trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
              |  trigger trigger2: if (ELAPSED_TIME > '1hour') { KILL }
          +  child1[allocFraction=0.3,schedulingPolicy=fair,parallelism=1]
-             |  trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO table }
+             |  trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO default }
              |  trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
  +  <unmanaged queries>
      |  trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
@@ -4871,7 +4883,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: sys@wm_triggers
 #### A masked pattern was here ####
 plan_1 default trigger_2       ELAPSED_TIME > '30hour' MOVE TO slow_pool
-table  default table   BYTES_WRITTEN > '100KB' MOVE TO table
+table  default table   BYTES_WRITTEN > '100KB' MOVE TO default
 table  default trigger BYTES_WRITTEN > '100MB' MOVE TO default
 table  default trigger1        ELAPSED_TIME > 10       KILL
 table  default trigger2        ELAPSED_TIME > '1hour'  KILL
@@ -4977,7 +4989,7 @@ plan_4a   default trigger_1       BYTES_READ > '10GB'     
KILL
 plan_4a        default trigger_2       BYTES_READ > '11GB'     KILL
 plan_4b        default trigger_1       BYTES_READ > '10GB'     KILL
 plan_4b        default trigger_2       BYTES_READ > '11GB'     KILL
-table  default table   BYTES_WRITTEN > '100KB' MOVE TO table
+table  default table   BYTES_WRITTEN > '100KB' MOVE TO default
 table  default trigger BYTES_WRITTEN > '100MB' MOVE TO default
 table  default trigger1        ELAPSED_TIME > 10       KILL
 table  default trigger2        ELAPSED_TIME > '1hour'  KILL
diff --git a/service/src/java/org/apache/hive/service/server/KillQueryImpl.java 
b/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
index c7f2c91..d9a5033 100644
--- a/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
+++ b/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
@@ -162,7 +162,7 @@ public class KillQueryImpl implements KillQuery {
             killChildYarnJobs(conf, queryTag);
           } else {
             // no privilege to cancel
-            throw new HiveSQLException("No privilege");
+            throw new HiveSQLException("No privilege to kill query id");
           }
           break;
         case TAG:
@@ -174,7 +174,7 @@ public class KillQueryImpl implements KillQuery {
           }
           killChildYarnJobs(conf, queryIdOrTag);
           if (numCanceled == 0) {
-            throw new HiveSQLException("No privilege");
+            throw new HiveSQLException("No privilege to kill query tag");
           }
           break;
         case UNKNOWN:

Reply via email to