You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues-all@impala.apache.org by "Quanlong Huang (Jira)" <ji...@apache.org> on 2020/03/19 07:31:00 UTC

[jira] [Updated] (IMPALA-9214) REFRESH with sync_ddl may fail with concurrent INVALIDATE METADATA

     [ https://issues.apache.org/jira/browse/IMPALA-9214?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Quanlong Huang updated IMPALA-9214:
-----------------------------------
    Labels: concurrency  (was: )

> REFRESH with sync_ddl may fail with concurrent INVALIDATE METADATA
> ------------------------------------------------------------------
>
>                 Key: IMPALA-9214
>                 URL: https://issues.apache.org/jira/browse/IMPALA-9214
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Catalog
>            Reporter: Quanlong Huang
>            Priority: Major
>              Labels: concurrency
>
> The call trace for executing a REFRESH statement in Catalogd is
> {code:java}
> JniCatalog#resetMetadata
>   CatalogOpExecutor#execResetMetadata
>     CatalogServiceCatalog#reloadTable
>     CatalogServiceCatalog#waitForSyncDdlVersion
> {code}
> In CatalogServiceCatalog#reloadTable(), the {{Tbl}} object may be stale if there's a concurrent reset, i.e. INVALIDATE METADATA, running. Then {{CatalogServiceCatalog#reloadTable}} will return the thrift object of a stale Table. It can't be found in the catalog cache and the {{topicUpdateLog_}}, so {{waitForSyncDdlVersion}} will finally hang or run out of attempts.
> Here is an example. Let's say table1 is an unpartitioned table and is loaded. Two queries, "Refresh table1" and "Invalidate metadata" are running concurrently.
> Thread-1 (Refresh):
>  * Gets the {{Table}} object in CatalogServiceCatalog#execResetMetadata and goes into {{reloadTable}}. The catalog version of table1 is 50.
>  * Waiting for both version lock and table lock here: [https://github.com/apache/impala/blob/a1588e44980c648cb7f9263cbd0409abfbaeacf7/fe/src/main/java/org/apache/impala/catalog/CatalogServiceCatalog.java#L2023]
> Thread-2 (Invalidate Metadata):
>  * Holds the version lock and replace the whole catalog cache with a new one. Makes all existing catalog objects stale. Now the catalog version of table1 is 90.
>  * Release the version lock.
> Thread-1 (Refresh):
>  * Gets the version lock and table lock
>  * Get a new catalog version, let's say 100. Then release version lock.
>  * Load the metadata into the stale Table object. Bump its catalog version from 50 to 100.
>  * Return the thrift object of the updated stale object from {{reloadTable}}
>  * Goes into {{waitForSyncDdlVersion}}. Wait for an update of table1 is sent and the sent version >= 100.
> However, table1 in the catalog cache is with version 90. Unless there's another update on this table, Thread-1 will hang or run out of attempts for waiting the expected update.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-all-unsubscribe@impala.apache.org
For additional commands, e-mail: issues-all-help@impala.apache.org