Hi Andrei,
Thanks a lot for your reply. Relatively to the dummy code I provided I take it
you mean the following ?
Cache Person<String,Person> personsCache=...
THREAD 1
personsCache.invoke("personKey1", new EntryProcessor<String, Person, Void>() {
@Override public Object process(MutableEntry<String, Person>entry, Object...
args) {
Person person= entry.getValue();
entry.setValue(person.setOccupation(“foo”));
Some additional calculation here involving key personKey2 <- - -some other key?
return null;
}
});
THREAD 2
personsCache.invoke("personKey2", new EntryProcessor<String, Person, Void>() {
@Override public Object process(MutableEntry<String, Person>entry, Object...
args) {
Person person= entry.getValue();
entry.setValue(person.setOccupation(“foo”));
Some additional calculation here involving key personKey1 <- - -some other key?
return null;
}
});
The 2 threads WILL deadlock in that situation.
So, could those keys of the person cache (for example) that I have marked
above, be the ones that are designated in the documentation (and hence in your
explanation as well) as “other keys” ?
Thanks
Evangelos Morakis
> On 9 Sep 2019, at 20:40, Andrei Aleksandrov <[email protected]> wrote:
>
> Hello,
>
> When you use the entry processor then you lock only provided key. So when you
> tries to work with other keys (different from provided one) that are being
> processed somewhere in other threads then deadlock is possible because other
> thread can take lock on these other keys and wait for provided one.
> Otherwise, entry processor will wait for these other keys. It's typical
> deadlock.
>
> Sorry, I will not provide the example but hopes that my explanation is clear.
>
> BR,
> Andrei
>
> 9/7/2019 6:31 PM, Evangelos Morakis пишет:
>>
>> Dear igniters,
>>
>> I would like to elicit your expert
>> advice in regards to how ignite differentiates
>> on the use of a call to: 1)IgniteCompute.affinityRun(...)
>> and
>> 2)IgniteCache.invoke(...)
>>
>> as far as dead locks are concerned. According to the documentation the main
>> difference is that method 2 above, operates within a lock. Specifically the
>> doc quotes:
>> “EntryProcessors are executed atomically within a lock on the given cache
>> key.”
>> Now it even comes with a warning that is meant to show how it is supposed to
>> be used (or conversely NOT to be used):
>> “You should not access other keys from within the EntryProcessor logic as it
>> may cause a deadlock.”
>> But this phrase “other keys” to what kind of keys does it refer to? The
>> remaining keys of the passed in cache? For e.g. :
>> Assume a persons cache...
>> Cache Person<String,Person> personsCache=...
>>
>> personsCache.invoke("personKey", new EntryProcessor<String, Person, Void>() {
>> @Override public Object process(MutableEntry<String, Person> entry,
>> Object... args) {
>> Person person= entry.getValue(); entry.setValue(person.setOccupation(“foo”));
>> return null;
>> }
>> });
>> In other words can someone provide an example based on the above dummy code
>> that would make invoke deadlock so that I could get an understanding of what
>> the documentation refers to?
>>
>> Thanks
>>
>> Evangelos Morakis
>>