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

Philipp Shergalis reassigned IGNITE-24436:
------------------------------------------

    Assignee: Philipp Shergalis

> Do not clean index on tx cleanup if no index info is available
> --------------------------------------------------------------
>
>                 Key: IGNITE-24436
>                 URL: https://issues.apache.org/jira/browse/IGNITE-24436
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Roman Puchkovskiy
>            Assignee: Philipp Shergalis
>            Priority: Major
>              Labels: ignite-3
>
> Original problem is described in IGNITE-24368.
> A couple of observations:
>  # For write intents (WIs) of committed transactions, indexes are actually 
> not relevant for cleanup (they are not used), so we should not obtain them at 
> all
>  # For WIs of aborted transactions, if we don't remove the tuple from the 
> index, this will not cause any consistency problems, just some garbage will 
> remain in the index. The garbage will consume disk space and it will slow 
> down reads via the index, but that's it
> So the idea of a quick and dirty fix is to do the following when doing write 
> intent switch in PartitionReplicaListener and PartitionListener:
>  # In StorageUpdateHandler, make last parameter (accepting a list of indexes) 
> a Supplier
>  # If the transaction is committed, don't call the supplier
>  # In the supplier, call not the existing TableUtils#indexIdsAtRwTxBeginTs(), 
> but a variant of it (it might be called indexIdsAtRwTxBeginTsOrEmpty()) which 
> will not fail if there is no catalog version or it doesn't contain indexes 
> for the table, but it would just return an empty list
> But first, an integration test has to be written to make sure that analysis 
> made in IGNITE-24368 was correct. The scenario (parameterized with whether a 
> transaction is committed or rolled back) is:
>  # Start a cluster of 3 nodes with dataAvailabilityTime set to 1 second
>  # Make sure transaction cleanups do not happen (the interval between 
> cleanups can be configured probably)
>  # Create a zone with 1 partition (not necessarily, might be default 25, but 
> could be easier to debug with just 1) and 3 replicas
>  # Create table A in the zone
>  # Start an *explicit* transaction, make a put in it, commit/rollback
>  # Create table B in the zone (to make the catalog version in which A was 
> created not the freshest version)
>  # Stop all nodes
>  # Wait for dataAvailabilityTime to pass (1 second)
>  # Start all 3 nodes and expect the start to fail
> After the fix is made, it would be great to also add a test that makes sure 
> that if this happens for a rolled-back transaction, after a restart we can 
> still make a put of the same key as the one that was rolled-back.



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

Reply via email to