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:32:00 UTC
[jira] [Updated] (IMPALA-9211) CreateTable with sync_ddl may fail
with concurrent INVALIDATE METADATA
[ https://issues.apache.org/jira/browse/IMPALA-9211?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Quanlong Huang updated IMPALA-9211:
-----------------------------------
Labels: concurrency (was: )
> CreateTable with sync_ddl may fail with concurrent INVALIDATE METADATA
> ----------------------------------------------------------------------
>
> Key: IMPALA-9211
> URL: https://issues.apache.org/jira/browse/IMPALA-9211
> Project: IMPALA
> Issue Type: Bug
> Components: Catalog
> Affects Versions: Impala 3.0, Impala 3.1.0, Impala 3.2.0, Impala 3.3.0
> Reporter: Quanlong Huang
> Assignee: Quanlong Huang
> Priority: Major
> Labels: concurrency
> Fix For: Impala 3.4.0
>
>
> The execution flow for CreateTable is
> {code:java}
> hold metastoreDdlLock_
> | create table in HMS
> | if (success) add Table to catalog cache by calling CatalogServiceCatalog.addTable()
> |--free metastoreDdlLock_{code}
> The execution flow of CatalogServiceCatalog.addTable() is
> {code:java}
> get db from dbCache
> init an IncompleteTable for the table
> hold writeLock of versionLock_
> | incr catalog version and assign it to the table
> | add table to the db
> |-- free writeLock of versionLock_
> {code}
> The execution flow for INVALIDATE METADATA is (major part in reset()):
> {code:java}
> hold writeLock of versionLock_
> | create a new dbCache
> | for each db init a new item in new dbCache
> | get table names in db from HMS
> | for each table in the db
> | init a new table object and put it into the dbCache
> | replace original dbCache with the new one
> |-- free writeLock of versionLock_{code}
> *Buggy scenario:*
> {code:java}
> Thread-1(CreateTable):
> - create table in HMS
> - get db from dbCache
> - waiting for writeLock of versionLock_
> Thread-2(Invalidate Metadata):
> - holds the writeLock of versionLock_
> - replacing dbCache with a new one.
> - find the new table in HMS, create an IncompleteTable for it using catalogVersion=900
> - add it into the new db object
> Thread-1(CreateTable):
> - get the writeLock of versionLock_
> - Incr catalog version to 1000 and assign it to the table.
> - Add the table to the stale db object.
> - Then wait in waitForSyncDdlVersion() for the update to be sent.
> Thread-3(catalog-update-gathering):
> - get current catalog verion (1000) as toVersion.
> - Collecting updates in version range (800, 1000].
> - Sent the created table with catalogVersion=900.
> Thread-1(CreateTable):
> - Find an older version (900) is sent.
> - Keep waiting a verion > 1000 for this table to be sent. Let's say no other modifications on the table happen. It remains catalogVersion=900.
> Thread-3(catalog-update-gathering):
> - Collecting updates in version range (1000, 1234].
> - Do nothing for the table since its version not in range.
> {code}
> The created Table is added into a stale Db object. Reset() op already creates a new Db object. Thread-1 will finally run out of waiting attemps and throw an exception as described inĀ IMPALA-9135.
--
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