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

Roman Puchkovskiy updated IGNITE-21112:
---------------------------------------
    Description: 
A. Each node should handle the following message: 
RwTransactionsFinishedRequest; it will have targetSchemaVersion field of type 
int (which represents a Catalog version). The response will be 
RwTransactionsFinishedResponse containing the only field: finished (of type 
boolean).

B. When the node gets such a request, it should (1) first check whether the 
target version has activated (not just appeared in the local Catalog) on the 
node. If not, (2) it should return false. If it has already been activated on 
the node, then the node should atomically query its TxManager whether it has 
any non-finished RW transactions that started on schema versions preceding the 
target version (this is determined by the beginTs of the transaction).

C. To avoid a race between starting an RW transaction and checking for 
non-finished transactions, we need to start RW transactions in the following 
way:
 # beginTs = HLC.now()
 # {*}Without doing a schema sync{*}, find the Catalog version active at 
beginTs, assign it to TxCatalogVersion
 # Atomically wrt checking for transactions existence on schemas before X (see 
B.2), wrt finishing RW transactions and wrt raising the 'latest activated 
Catalog version' (used in B.1), add the new transaction with beginTs to the map 
of the currently active transactions (only if the 'latest activated Catalog 
version' is not higher than TxCatalogVersion)
 # If on item 3 it turned out that TxCatalogVersion is already lower than the 
'latest activated Catalog version', goto step 1

  was:
A. Each node should handle the following message: 
RwTransactionsFinishedRequest; it will have targetSchemaVersion field of type 
int (which represents a Catalog version). The response will be 
RwTransactionsFinishedResponse containing the only field: finished (of type 
boolean).

B. When the node gets such a request, it should (1) first check whether the 
target version has activated on the node. If not, (2) it should return false. 
If it has already been activated on the node, then the node should atomically 
query its TxManager whether it has any non-finished RW transactions that 
started on schema versions preceding the target version (this is determined by 
the beginTs of the transaction).

C. To avoid a race between starting an RW transaction and checking for 
non-finished transactions, we need to start RW transactions in the following 
way:
 # beginTs = HLC.now()
 # {*}Without doing a schema sync{*}, find the Catalog version active at 
beginTs, assign it to TxCatalogVersion
 # Atomically wrt checking for transactions existence on schemas before X (see 
B.2), wrt finishing RW transactions and wrt raising the 'latest activated 
Catalog version' (used in B.1), add the new transaction with beginTs to the map 
of the currently active transactions (only if the 'latest activated Catalog 
version' is not higher than TxCatalogVersion)
 # If on item 3 it turned out that TxCatalogVersion is already lower than the 
'latest activated Catalog version', goto step 1


> Mechanism to wait for completion of transactions started on schema versions 
> preceding a target schema version
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-21112
>                 URL: https://issues.apache.org/jira/browse/IGNITE-21112
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Roman Puchkovskiy
>            Priority: Major
>              Labels: ignite-3
>
> A. Each node should handle the following message: 
> RwTransactionsFinishedRequest; it will have targetSchemaVersion field of type 
> int (which represents a Catalog version). The response will be 
> RwTransactionsFinishedResponse containing the only field: finished (of type 
> boolean).
> B. When the node gets such a request, it should (1) first check whether the 
> target version has activated (not just appeared in the local Catalog) on the 
> node. If not, (2) it should return false. If it has already been activated on 
> the node, then the node should atomically query its TxManager whether it has 
> any non-finished RW transactions that started on schema versions preceding 
> the target version (this is determined by the beginTs of the transaction).
> C. To avoid a race between starting an RW transaction and checking for 
> non-finished transactions, we need to start RW transactions in the following 
> way:
>  # beginTs = HLC.now()
>  # {*}Without doing a schema sync{*}, find the Catalog version active at 
> beginTs, assign it to TxCatalogVersion
>  # Atomically wrt checking for transactions existence on schemas before X 
> (see B.2), wrt finishing RW transactions and wrt raising the 'latest 
> activated Catalog version' (used in B.1), add the new transaction with 
> beginTs to the map of the currently active transactions (only if the 'latest 
> activated Catalog version' is not higher than TxCatalogVersion)
>  # If on item 3 it turned out that TxCatalogVersion is already lower than the 
> 'latest activated Catalog version', goto step 1



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

Reply via email to