You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2022/06/29 18:13:09 UTC

[superset] branch master updated: fix: SQL Lab cancel query in Redshift database connection does not wo… (#16326)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 90d486a643 fix: SQL Lab cancel query in Redshift database connection does not wo… (#16326)
90d486a643 is described below

commit 90d486a643e59b44278d2cef64652151eb6248f6
Author: yourssvk <yo...@gmail.com>
AuthorDate: Wed Jun 29 23:42:59 2022 +0530

    fix: SQL Lab cancel query in Redshift database connection does not wo… (#16326)
    
    * fix: SQL Lab cancel query in Redshift database connection does not work #16325
    
    
    Co-authored-by: Venkata Krishnan Somasundaram <ve...@Venkatas-MacBook-Pro.local>
    Co-authored-by: Elizabeth Thompson <es...@gmail.com>
---
 superset/db_engine_specs/redshift.py | 42 +++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/superset/db_engine_specs/redshift.py b/superset/db_engine_specs/redshift.py
index 6b79007526..7e2717d776 100644
--- a/superset/db_engine_specs/redshift.py
+++ b/superset/db_engine_specs/redshift.py
@@ -14,14 +14,18 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import logging
 import re
-from typing import Any, Dict, Pattern, Tuple
+from typing import Any, Dict, Optional, Pattern, Tuple
 
 from flask_babel import gettext as __
 
 from superset.db_engine_specs.base import BasicParametersMixin
 from superset.db_engine_specs.postgres import PostgresBaseEngineSpec
 from superset.errors import SupersetErrorType
+from superset.models.sql_lab import Query
+
+logger = logging.getLogger()
 
 # Regular expressions to catch custom errors
 CONNECTION_ACCESS_DENIED_REGEX = re.compile(
@@ -101,3 +105,39 @@ class RedshiftEngineSpec(PostgresBaseEngineSpec, BasicParametersMixin):
         :return: Conditionally mutated label
         """
         return label.lower()
+
+    @classmethod
+    def get_cancel_query_id(cls, cursor: Any, query: Query) -> Optional[str]:
+        """
+        Get Redshift PID that will be used to cancel all other running
+        queries in the same session.
+
+        :param cursor: Cursor instance in which the query will be executed
+        :param query: Query instance
+        :return: Redshift PID
+        """
+        cursor.execute("SELECT pg_backend_pid()")
+        row = cursor.fetchone()
+        return row[0]
+
+    @classmethod
+    def cancel_query(cls, cursor: Any, query: Query, cancel_query_id: str) -> bool:
+        """
+        Cancel query in the underlying database.
+
+        :param cursor: New cursor instance to the db of the query
+        :param query: Query instance
+        :param cancel_query_id: Redshift PID
+        :return: True if query cancelled successfully, False otherwise
+        """
+        try:
+            logger.info("Killing Redshift PID:%s", str(cancel_query_id))
+            cursor.execute(
+                "SELECT pg_cancel_backend(procpid) "
+                "FROM pg_stat_activity "
+                f"WHERE procpid='{cancel_query_id}'"
+            )
+            cursor.close()
+        except Exception:  # pylint: disable=broad-except
+            return False
+        return True