[ 
https://issues.apache.org/jira/browse/IMPALA-12189?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17733708#comment-17733708
 ] 

Quanlong Huang commented on IMPALA-12189:
-----------------------------------------

Note that this only happens in INSERT on transacational tables. Impala 
currently only supports INSERT on "insert_only" transactional tables. INSERT to 
ACID tables is not supported yet.

> updateCatalog not releasing the catalog lock if createTblTransaction() throws 
> exceptions
> ----------------------------------------------------------------------------------------
>
>                 Key: IMPALA-12189
>                 URL: https://issues.apache.org/jira/browse/IMPALA-12189
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Catalog
>            Reporter: Quanlong Huang
>            Assignee: Quanlong Huang
>            Priority: Critical
>             Fix For: Impala 4.3.0
>
>
> We saw an issue that catalogd can't finish RPC requests after this error:
> {code:java}
> I0605 21:04:49.356642  6145 jni-util.cc:288] 
> org.apache.impala.common.TransactionException: Internal error processing 
> allocate_table_write_ids
>         at 
> org.apache.impala.catalog.Hive3MetastoreShimBase.allocateTableWriteId(Hive3MetastoreShimBase.java:763)
>         at 
> org.apache.impala.catalog.Hive3MetastoreShimBase.createTblTransaction(Hive3MetastoreShimBase.java:129)
>         at 
> org.apache.impala.service.CatalogOpExecutor.updateCatalog(CatalogOpExecutor.java:6394)
>         at 
> org.apache.impala.service.JniCatalog.updateCatalog(JniCatalog.java:507)
> I0605 21:04:49.356665  6145 status.cc:129] TransactionException: Internal 
> error processing allocate_table_write_ids
> {code}
> Code snipper of the downstream branch:
> {code:java}
> 6370   public TUpdateCatalogResponse updateCatalog(TUpdateCatalogRequest 
> update)
> 6371       throws ImpalaException {
> 6372     TUpdateCatalogResponse response = new TUpdateCatalogResponse();
> 6373     // Only update metastore for Hdfs tables.
> 6374     Table table = getExistingTable(update.getDb_name(), 
> update.getTarget_table(),
> 6375         "Load for INSERT");
> 6376     if (!(table instanceof FeFsTable)) {
> 6377       throw new InternalException("Unexpected table type: " +
> 6378           update.getTarget_table());
> 6379     }
> 6380 
> 6381     tryWriteLock(table, "updating the catalog");
> 6382     final Timer.Context context
> 6383         = 
> table.getMetrics().getTimer(HdfsTable.CATALOG_UPDATE_DURATION_METRIC).time();
> 6384 
> 6385     long transactionId = -1;
> 6386     TblTransaction tblTxn = null;
> 6387     if (update.isSetTransaction_id()) {
> 6388       transactionId = update.getTransaction_id();
> 6389       Preconditions.checkState(transactionId > 0);
> 6390       try (MetaStoreClient msClient = catalog_.getMetaStoreClient()) {
> 6391          // Setup transactional parameters needed to do alter 
> table/partitions later.
> 6392          // TODO: Could be optimized to possibly save some RPCs, as 
> these parameters are
> 6393          //       not always needed + the writeId of the INSERT could be 
> probably reused.
> 6394          tblTxn = MetastoreShim.createTblTransaction(
> 6395              msClient.getHiveClient(), table.getMetaStoreTable(), 
> transactionId);
> 6396       }
> 6397     }
> 6398 
> 6399     try {
> 6400       // Get new catalog version for table in insert.
> 6401       long newCatalogVersion = catalog_.incrementAndGetCatalogVersion();
> 6402       catalog_.getLock().writeLock().unlock();
> ...
> 6617     } finally {
> 6618       context.stop();
> 6619       UnlockWriteLockIfErronouslyLocked();
> 6620       table.releaseWriteLock();
> 6621     }
> {code}
> The catalog lock (versionLock) is acquired at line 6381 if the current thread 
> get the table lock. In normal workload, it will be released at line 6402. 
> However, if MetastoreShim.createTblTransaction() throws exceptions, there are 
> no place to release the lock. Note that there is a finally-clause at line 
> 6619 that can release the lock. But it's not guarding the code that calls 
> createTblTransaction().
> If the write lock of versionLock is not released, other threads can't proceed 
> in their catalog operations, including table loading and the event-processor.
> I'm able to reproduce the issue by modifying the code to explicitly throws an 
> exception at
> [https://github.com/apache/impala/blob/4cf0bfa83f9641eb95d83c76af7962e6a3f1e064/fe/src/main/java/org/apache/impala/service/CatalogOpExecutor.java#L6636]
> CC [~csringhofer] [~gfurnstahl] 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to