Description
Currently, index depends on a table, while table depends on RAFT groups start, which may need to apply commands (including inserts), and inserts depend on indices of the table. There is a dependency cycle. This is just one example of such a cycle in the current design.
One idea is to split 'Table' entity into 2: 'Table Structure' and 'Full Table'. Table structure would only comprise objects representing bare table information (no indices), something like current TableImpl/InternalTable. Then, the following dependencies could be created:
- Table Structure depends on Configuration
- Index depends on Configuration and Table Structure
- Sql Schema depends on Table Structure and Index
- Full Table depends on Table Structure, Index, Sql Schema
This requires a redesign of how TableManager, IndexManager, SqlSchemaManager interact, probably TableManager needs to be broken in 2.
Upd
I've tried to redesign the TableManager in order to split the table into two parts: schema based "client" one (used by indeces, etc) and the one that assumes starting server endpoints. Unfortunately I didn't succeed in it. We will have one more attempt within distribution zone collocation related issues. Thus in order to fix the deadlock I've proposed rather crappy solution with async raft log application on restart based on the latch that bind PartitionReplicaListener.invoke and NodeImpl together. Ugly one that hopefully will be eliminated in the future.
Ticket was renamed:
"Redesign table/index creation to avoid dependency cycles" -> "Table/index dependecy deadlock on node restart"
Attachments
Issue Links
- blocks
-
IGNITE-18468 ItSecondaryIndexTest testNullCondition[1-3] tests unstable.
- Resolved
-
IGNITE-18170 Deadlock in TableManager#updateAssignmentInternal()
- Resolved
- causes
-
IGNITE-18631 ItSqlAsynchronousApiTest#checkMixedTransactionsForIndex is flaky
- Resolved
-
IGNITE-19047 Implement metastorage and cmg raft log re-application in async manner
- Open
- fixes
-
IGNITE-18170 Deadlock in TableManager#updateAssignmentInternal()
- Resolved
- links to