Hi! Why do you do this inside an invoke()? All of this can be done just inside a receiver. Can you get rid of the invoke and check, that deadlocks disappear?
Denis пт, 29 июн. 2018 г. в 17:24, breischl <[email protected]>: > That does seem to be what's happening, but we're only invoke()'ing on keys > that were passed into receive(), so that should not require going off-box. > Right? > > Here's the relevant code... > > > @Override > public void receive(IgniteCache<TKey, TEntity> cache, > Collection<Map.Entry<TKey, TEntity>> newEntries) throws IgniteException > { > > for (val newEntry : newEntries) { > val entryKey = newEntry.getKey(); > > cache.invoke(entryKey, ((CacheEntryProcessor<TKey, TEntity, > Object>) > (entry, args) -> { > val key = > (TKey) args[0]; //passed this in to make the lambda > non-capturing, which is a slight perf optimization (fewer memory allocs) > val newVal = (TEntity) args[1]; > val oldVal = entry.getValue(); > > if (oldVal == null) { > //Didn't already exist, we can just set the new values and > be done > log.info("event=receiverCreatingNewInstance key={} > newValue={}", key, newVal); > entry.setValue(newVal); > } else if (isNewer(oldVal, newVal)) { > log.info("event=newEntryHasHigherVersion key={} > oldVersion={} newVersion={}", key, getVersionForLogging(oldVal), > getVersionForLogging(newVal)); > entry.setValue(newVal); > } else { > log.info("event=newEntryHasLowerVersion key={} > oldVersion={} > newVersion={}", key, getVersionForLogging(oldVal), > getVersionForLogging(newVal)); > } > return null; > }), entryKey, newEntry.getValue()); > } > } > > > > > > -- > Sent from: http://apache-ignite-users.70518.x6.nabble.com/ >
