Hello Igniters.

During investigation flaky test IgniteClientDataStructuresTest.testAtomicLong. 
I found a issue and now I need your help because I don't have enough knowledge 
about IgniteAtomicLong.
I created the task for it - https://issues.apache.org/jira/browse/IGNITE-7845. 
And also I duplicate information below:

Given:

IgniteAtomicLong was created e.g. atomicLong = ignite.atomicLong("long1", 1L, 
true)

When:

IgniteAtomicLong was closed e.g. atomicLong.close()

Then:

If you try to get this value again - sometimes you will get null 
IgniteAtomicLong value and sometimes you will get not null IgniteAtomicLong 
value e.g. ignite.atomicLong("long1", 1L, false) sometimes null, sometimes not 
null

But if we will get not null value IgniteAtomicLong and we will call method 
"get" on it, we will have one of two exceptions IllegalStateException("Sequence 
was removed from cache: " + name) if it already marked as deleted, and 
IgniteException("Failed to find atomic long: " + name) if it sill no marked as 
deleted but already deleted from cache.

Expected:

IgniteAtomicLong value always should be null(or not?)

Why it's happend:

When we close IgniteAtomicLong we removing value from cache in transaction but 
removing from internal storage(dsMap) happen asynchroniously in 
DataStructuresEntryListener for all nodes include local node. And when we try 
get value after close we still sometimes able to get IgniteAtomicLong from 
internal local storage.


Solution(In my opinion):

I guess in common case we don't  need call Ignite#atomicLong  every time when 
we need value, but we should use IgniteAtomicLong object received after first 
call. And if it is true, we can remove receiving IgniteAtomicLong from local 
storage(dsMap) - this changes will fix problem

-- 
Best regards,
Anton Kalashnikov

Reply via email to