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

Denis Chudov updated IGNITE-18219:
----------------------------------
    Description: 
*Motivation:*

Following code may be erroneous:
{code:java}
        if (causalityToken <= actualToken0) {
            return getValueForPreviousToken(causalityToken);
        }

        trimHistoryLock.readLock().lock();

        try {
            if (causalityToken <= actualToken0) {
                return getValueForPreviousToken(causalityToken);
            }
{code}

The original intention of making {{trimHistoryLock}} in {{VersionedValue}} 
class was to make adding tokens to {{history}} and switching actual token 
atomic. Seems that this atomicity has been lost after some changes. Need to 
dive deeper into it and fix possible problems related to consistency of 
internal mutable state of VersionedValue, and necessity of trimHistoryLock in 
presence of {{updateMutex}}.
Current use cases of VersionedValue (VV) imply that VV actual version is 
switched in single thread of configuration notifcator. On the other side, 
{{#update}} method can be called concurrently from different threads, which 
requires {{updateMutex}}, and switching actual version also should happen under 
this mutex, as it clears the update future. {{trimHistoryLock}}, which is 
read-write lock, is introduced due to {{history}} trimming, which can be done 
under write lock, and all the other access to the {history}} can be done under 
read lock. Possibly history trimming can be done under update mutex, and 
trimHistoryLock would be not needed.

Also, there is possible bug with trimming history as the last value in hostory 
can be not the same as actual token, we cant do direct arithmetics with token 
computation, we should compare history size and maximum history size instead.

*Definition of done:*
There should be either one mutex left or necessity of both of them explained in 
javadoc. Possibly, it is worth making multithreaded test for VersionedValue 
which would change the history concurrently with high intensity.

  was:
*Motivation:*

Following code may be erroneous:
{code:java}
        if (causalityToken <= actualToken0) {
            return getValueForPreviousToken(causalityToken);
        }

        trimHistoryLock.readLock().lock();

        try {
            if (causalityToken <= actualToken0) {
                return getValueForPreviousToken(causalityToken);
            }
{code}

The original intention of making {{trimHistoryLock}} in {{VersionedValue}} 
class was to make adding tokens to {{history}} and switching actual token 
atomic. Seems that this atomicity has been lost after some changes. Need to 
dive deeper into it and fix possible problems related to consistency of 
internal mutable state of VersionedValue, and necessity of trimHistoryLock in 
presence of {{updateMutex}}.

*Definition of done:*
There should be either one mutex left or necessity of both of them explained in 
javadoc. Possibly, it is worth making multithreaded test for VersionedValue 
which would change the history concurrently with high intensity.


> Actual token is compared twice in VersionedValue#getInternal
> ------------------------------------------------------------
>
>                 Key: IGNITE-18219
>                 URL: https://issues.apache.org/jira/browse/IGNITE-18219
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Denis Chudov
>            Priority: Major
>              Labels: ignite-3
>
> *Motivation:*
> Following code may be erroneous:
> {code:java}
>         if (causalityToken <= actualToken0) {
>             return getValueForPreviousToken(causalityToken);
>         }
>         trimHistoryLock.readLock().lock();
>         try {
>             if (causalityToken <= actualToken0) {
>                 return getValueForPreviousToken(causalityToken);
>             }
> {code}
> The original intention of making {{trimHistoryLock}} in {{VersionedValue}} 
> class was to make adding tokens to {{history}} and switching actual token 
> atomic. Seems that this atomicity has been lost after some changes. Need to 
> dive deeper into it and fix possible problems related to consistency of 
> internal mutable state of VersionedValue, and necessity of trimHistoryLock in 
> presence of {{updateMutex}}.
> Current use cases of VersionedValue (VV) imply that VV actual version is 
> switched in single thread of configuration notifcator. On the other side, 
> {{#update}} method can be called concurrently from different threads, which 
> requires {{updateMutex}}, and switching actual version also should happen 
> under this mutex, as it clears the update future. {{trimHistoryLock}}, which 
> is read-write lock, is introduced due to {{history}} trimming, which can be 
> done under write lock, and all the other access to the {history}} can be done 
> under read lock. Possibly history trimming can be done under update mutex, 
> and trimHistoryLock would be not needed.
> Also, there is possible bug with trimming history as the last value in 
> hostory can be not the same as actual token, we cant do direct arithmetics 
> with token computation, we should compare history size and maximum history 
> size instead.
> *Definition of done:*
> There should be either one mutex left or necessity of both of them explained 
> in javadoc. Possibly, it is worth making multithreaded test for 
> VersionedValue which would change the history concurrently with high 
> intensity.



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

Reply via email to