You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by st...@apache.org on 2021/10/08 00:54:43 UTC

[impala] branch branch-4.0.1 updated (80a1dc3 -> edca349)

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

stigahuang pushed a change to branch branch-4.0.1
in repository https://gitbox.apache.org/repos/asf/impala.git.


    from 80a1dc3  IMPALA-10714: Defer advancing read page until the buffer is attached
     new ce433ba  IMPALA-10936: Fix NPE in collecting policy tables on FailedLoadLocalTable
     new edca349  IMPALA-10942: Fix memory leak in admission controller

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 be/src/scheduling/admission-control-service.cc     |  2 +-
 be/src/scheduling/admission-controller.cc          |  6 +++---
 be/src/scheduling/admission-controller.h           |  2 +-
 .../scheduling/local-admission-control-client.cc   |  2 +-
 .../apache/impala/analysis/StmtMetadataLoader.java |  9 ++++++--
 .../apache/impala/catalog/local/LocalTable.java    | 18 ++++++++--------
 .../impala/analysis/StmtMetadataLoaderTest.java    | 25 +++++++++++++++++++++-
 7 files changed, 46 insertions(+), 18 deletions(-)

[impala] 02/02: IMPALA-10942: Fix memory leak in admission controller

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

stigahuang pushed a commit to branch branch-4.0.1
in repository https://gitbox.apache.org/repos/asf/impala.git

commit edca349527657a9847659d7b0400bf62aa6938ce
Author: Bikramjeet Vig <bi...@gmail.com>
AuthorDate: Thu Sep 30 19:03:15 2021 -0700

    IMPALA-10942: Fix memory leak in admission controller
    
    This patch fixes a memory leak in the admission controller where
    objects tracking state required for queuing were being retained
    despite the query being admitted or rejected immediately.
    
    Change-Id: I1df0de0e658f6dcb5a044d108d0943aaa3dea0a1
    Reviewed-on: http://gerrit.cloudera.org:8080/17893
    Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 be/src/scheduling/admission-control-service.cc      | 2 +-
 be/src/scheduling/admission-controller.cc           | 6 +++---
 be/src/scheduling/admission-controller.h            | 2 +-
 be/src/scheduling/local-admission-control-client.cc | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/be/src/scheduling/admission-control-service.cc b/be/src/scheduling/admission-control-service.cc
index f00f335..748107f 100644
--- a/be/src/scheduling/admission-control-service.cc
+++ b/be/src/scheduling/admission-control-service.cc
@@ -323,7 +323,7 @@ void AdmissionControlService::AdmitFromThreadPool(UniqueIdPB query_id) {
         admission_state->blacklisted_executor_addresses};
     admission_state->admit_status =
         AdmissiondEnv::GetInstance()->admission_controller()->SubmitForAdmission(request,
-            &admission_state->admit_outcome, &admission_state->schedule, &queued,
+            &admission_state->admit_outcome, &admission_state->schedule, queued,
             &admission_state->request_pool);
     admission_state->submitted = true;
     if (!queued) {
diff --git a/be/src/scheduling/admission-controller.cc b/be/src/scheduling/admission-controller.cc
index 1d1f544..9aebfad 100644
--- a/be/src/scheduling/admission-controller.cc
+++ b/be/src/scheduling/admission-controller.cc
@@ -1133,9 +1133,9 @@ void AdmissionController::PoolStats::UpdateConfigMetrics(const TPoolConfig& pool
 
 Status AdmissionController::SubmitForAdmission(const AdmissionRequest& request,
     Promise<AdmissionOutcome, PromiseMode::MULTIPLE_PRODUCER>* admit_outcome,
-    unique_ptr<QuerySchedulePB>* schedule_result, bool* queued,
+    unique_ptr<QuerySchedulePB>* schedule_result, bool& queued,
     std::string* request_pool) {
-  *queued = false;
+  queued = false;
   DebugActionNoFail(request.query_options, "AC_BEFORE_ADMISSION");
   DCHECK(schedule_result->get() == nullptr);
 
@@ -1249,7 +1249,7 @@ Status AdmissionController::SubmitForAdmission(const AdmissionRequest& request,
       PROFILE_INFO_KEY_INITIAL_QUEUE_REASON, queue_node->initial_queue_reason);
 
   queue_node->wait_start_ms = MonotonicMillis();
-  *queued = true;
+  queued = true;
   return Status::OK();
 }
 
diff --git a/be/src/scheduling/admission-controller.h b/be/src/scheduling/admission-controller.h
index fb8bca2..635ceac 100644
--- a/be/src/scheduling/admission-controller.h
+++ b/be/src/scheduling/admission-controller.h
@@ -369,7 +369,7 @@ class AdmissionController {
   /// cancelled to ensure that the pool statistics are updated.
   Status SubmitForAdmission(const AdmissionRequest& request,
       Promise<AdmissionOutcome, PromiseMode::MULTIPLE_PRODUCER>* admit_outcome,
-      std::unique_ptr<QuerySchedulePB>* schedule_result, bool* queued,
+      std::unique_ptr<QuerySchedulePB>* schedule_result, bool& queued,
       std::string* request_pool = nullptr);
 
   /// After SubmitForAdmission(), if the query was queued this must be called. If
diff --git a/be/src/scheduling/local-admission-control-client.cc b/be/src/scheduling/local-admission-control-client.cc
index faf47a5..e85f34b 100644
--- a/be/src/scheduling/local-admission-control-client.cc
+++ b/be/src/scheduling/local-admission-control-client.cc
@@ -38,7 +38,7 @@ Status LocalAdmissionControlClient::SubmitForAdmission(
   query_events->MarkEvent(QUERY_EVENT_SUBMIT_FOR_ADMISSION);
   bool queued;
   Status status = ExecEnv::GetInstance()->admission_controller()->SubmitForAdmission(
-      request, &admit_outcome_, schedule_result, &queued);
+      request, &admit_outcome_, schedule_result, queued);
   if (queued) {
     query_events->MarkEvent(QUERY_EVENT_QUEUED);
     DCHECK(status.ok());

[impala] 01/02: IMPALA-10936: Fix NPE in collecting policy tables on FailedLoadLocalTable

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

stigahuang pushed a commit to branch branch-4.0.1
in repository https://gitbox.apache.org/repos/asf/impala.git

commit ce433ba42e8816217212de08ab5b6552b3cb9280
Author: stiga-huang <hu...@gmail.com>
AuthorDate: Thu Sep 30 10:39:26 2021 +0800

    IMPALA-10936: Fix NPE in collecting policy tables on FailedLoadLocalTable
    
    Ranger column-masking/row-filtering policies can have complex
    expressions that reference other tables (e.g. by using subqueries). So
    when loading metadata of a table, we also need to load all tables
    referenced by its related policies (i.e. "policy tables"). This requires
    getting all its columns so we can get the column-masking policies.
    However, for a failed loaded table in LocalCatalog mode, the table is
    represented by a FailedLoadLocalTable which has a null ColumnMap. This
    causes a NullPointerException when collecting policy tables for it.
    
    This patch skips collecting policy tables on failed loaded tables. Also
    add some null checks in LocalTable in case its ColumnMap is null. So
    FailedLoadLocalTable can have the same robustness as IncompleteTable
    which is the failed table representation in the legacy catalog mode.
    
    Tests:
     - Manually verified the NPE disappear in logs
     - Added FE unit test
    
    Change-Id: I7a6cd567685920211f05f2fdaac96bc98da41ac6
    Reviewed-on: http://gerrit.cloudera.org:8080/17888
    Reviewed-by: Joe McDonnell <jo...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 .../apache/impala/analysis/StmtMetadataLoader.java |  9 ++++++--
 .../apache/impala/catalog/local/LocalTable.java    | 18 ++++++++--------
 .../impala/analysis/StmtMetadataLoaderTest.java    | 25 +++++++++++++++++++++-
 3 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/fe/src/main/java/org/apache/impala/analysis/StmtMetadataLoader.java b/fe/src/main/java/org/apache/impala/analysis/StmtMetadataLoader.java
index fa8ecc4..5ed2f3b 100644
--- a/fe/src/main/java/org/apache/impala/analysis/StmtMetadataLoader.java
+++ b/fe/src/main/java/org/apache/impala/analysis/StmtMetadataLoader.java
@@ -18,6 +18,7 @@
 package org.apache.impala.analysis;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -44,6 +45,7 @@ import org.apache.impala.util.TUniqueIdUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 /**
@@ -315,7 +317,8 @@ public class StmtMetadataLoader {
         viewTbls.addAll(collectTableCandidates(((FeView) tbl).getQueryStmt()));
       }
       // Adds tables/views introduced by column-masking/row-filtering policies.
-      if (fe_.getAuthzFactory().getAuthorizationConfig().isEnabled()
+      if (!(tbl instanceof FeIncompleteTable)
+          && fe_.getAuthzFactory().getAuthorizationConfig().isEnabled()
           && fe_.getAuthzFactory().supportsTableMasking() && user_ != null) {
         try {
           viewTbls.addAll(collectPolicyTables(tbl));
@@ -346,8 +349,10 @@ public class StmtMetadataLoader {
     return tableNames;
   }
 
-  private Set<TableName> collectPolicyTables(FeTable tbl)
+  @VisibleForTesting
+  Set<TableName> collectPolicyTables(FeTable tbl)
       throws InternalException, AnalysisException {
+    if (tbl instanceof FeIncompleteTable) return Collections.emptySet();
     Set<TableName> tableNames = new HashSet<>();
     String dbName = tbl.getDb().getName();
     String tblName = tbl.getName();
diff --git a/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java b/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
index d89b960..44928a8 100644
--- a/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
@@ -18,6 +18,7 @@
 package org.apache.impala.catalog.local;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -210,8 +211,7 @@ abstract class LocalTable implements FeTable {
 
   @Override
   public List<Column> getColumns() {
-    // TODO(todd) why does this return ArrayList instead of List?
-    return new ArrayList<>(cols_.colsByPos_);
+    return cols_ == null ? Collections.emptyList() : cols_.colsByPos_;
   }
 
   @Override
@@ -228,37 +228,37 @@ abstract class LocalTable implements FeTable {
 
   @Override
   public List<String> getColumnNames() {
-    return cols_.getColumnNames();
+    return cols_ == null ? Collections.emptyList() : cols_.getColumnNames();
   }
 
   @Override
   public List<Column> getClusteringColumns() {
-    return cols_.getClusteringColumns();
+    return cols_ == null ? Collections.emptyList() : cols_.getClusteringColumns();
   }
 
   @Override
   public List<Column> getNonClusteringColumns() {
-    return cols_.getNonClusteringColumns();
+    return cols_ == null ? Collections.emptyList() : cols_.getNonClusteringColumns();
   }
 
   @Override
   public int getNumClusteringCols() {
-    return cols_.getNumClusteringCols();
+    return cols_ == null ? 0 : cols_.getNumClusteringCols();
   }
 
   @Override
   public boolean isClusteringColumn(Column c) {
-    return cols_.isClusteringColumn(c);
+    return cols_ != null && cols_.isClusteringColumn(c);
   }
 
   @Override
   public Column getColumn(String name) {
-    return cols_.getByName(name);
+    return cols_ == null ? null : cols_.getByName(name);
   }
 
   @Override
   public ArrayType getType() {
-    return cols_.getType();
+    return cols_ == null ? null : cols_.getType();
   }
 
   @Override
diff --git a/fe/src/test/java/org/apache/impala/analysis/StmtMetadataLoaderTest.java b/fe/src/test/java/org/apache/impala/analysis/StmtMetadataLoaderTest.java
index 730a02e..8a50b8e 100644
--- a/fe/src/test/java/org/apache/impala/analysis/StmtMetadataLoaderTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/StmtMetadataLoaderTest.java
@@ -21,17 +21,24 @@ import java.util.Arrays;
 
 import org.apache.impala.analysis.StmtMetadataLoader.StmtTableCache;
 import org.apache.impala.authorization.NoopAuthorizationFactory;
+import org.apache.impala.authorization.User;
 import org.apache.impala.catalog.Catalog;
 import org.apache.impala.catalog.FeTable;
+import org.apache.impala.catalog.TableLoadingException;
+import org.apache.impala.catalog.local.CatalogdMetaProvider;
+import org.apache.impala.catalog.local.FailedLoadLocalTable;
+import org.apache.impala.catalog.local.LocalCatalog;
+import org.apache.impala.catalog.local.LocalDb;
 import org.apache.impala.common.ImpalaException;
 import org.apache.impala.common.InternalException;
 import org.apache.impala.compat.MetastoreShim;
+import org.apache.impala.service.BackendConfig;
+import org.apache.impala.service.FeSupport;
 import org.apache.impala.service.Frontend;
 import org.apache.impala.testutil.ImpaladTestCatalog;
 import org.apache.impala.util.EventSequence;
 import org.junit.Assert;
 import org.junit.Assume;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class StmtMetadataLoaderTest {
@@ -232,4 +239,20 @@ public class StmtMetadataLoaderTest {
     Assume.assumeTrue(MetastoreShim.getMajorVersion() >= 3);
     testLoadAcidTables("select * from functional.insert_only_transactional_table");
   }
+
+  @Test
+  public void testCollectPolicyTablesOnFailedTables() throws ImpalaException {
+    FeSupport.loadLibrary();
+    CatalogdMetaProvider provider = new CatalogdMetaProvider(
+        BackendConfig.INSTANCE.getBackendCfg());
+    LocalCatalog catalog = new LocalCatalog(provider, /*defaultKuduMasterHosts=*/null);
+    Frontend fe = new Frontend(new NoopAuthorizationFactory(), catalog);
+    EventSequence timeline = new EventSequence("Test Timeline");
+    User user = new User("user");
+    StmtMetadataLoader mdLoader =
+        new StmtMetadataLoader(fe, Catalog.DEFAULT_DB, timeline, user);
+    LocalDb db = new LocalDb(catalog, "default");
+    mdLoader.collectPolicyTables(new FailedLoadLocalTable(
+        db, "tbl", new TableLoadingException("error", /*cause=*/new Exception())));
+  }
 }