Denis Chudov created IGNITE-17428:
-------------------------------------
Summary: Race between table create and table get
Key: IGNITE-17428
URL: https://issues.apache.org/jira/browse/IGNITE-17428
Project: Ignite
Issue Type: Bug
Reporter: Denis Chudov
Current version of TableManager#tableAsyncInternal can possibly not detect
table that is being created while tableAsyncInternal is called. Scenario:
- tableAsyncInternal checks tablesByIdVv.latest() and there is no table
- the table creation started, table metadata appears in meta storage
- TableEvent.CREATE is fired
- tableAsyncInternal registers a listener for TableEvent.CREATE (after it is
fired for corresponding table)
- tableAsyncInternal checks tablesByIdVv.latest() once again and there still is
no table, because the table creation is not completed
- {{!isTableConfigured(id)}} condition returns *false* as the table is present
in meta storage
- {{if (tbl != null && getTblFut.complete(tbl) || !isTableConfigured(id) &&
getTblFut.complete(null))}} evaluates *false* and the future created fot
getTable never completes.
Possibly we should use VersionedValue#whenComplete instead of creating listener
for event. The table is present in map wrapped in versioned value only when the
table creation is completed, and whenComplete allows to create a callback to
check the table presence.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)