Search code examples
c#.netignite

Apache Ignite .Net (2.8.1) Entry ICacheEntryProcessor write Failure


I want to validate if my understanding is correct.. having read the documentation about ICacheEntryProcessor, it says that if we want to update a field in cache entry, we implement this class and use Invoke on cache to update the field in cache record atomically..

when I implement the above approach, the record does not seem to be updated..there are no exceptions thrown in the process method.

here's my implementation

public class UserConnectionUpdateProcessor : ICacheEntryProcessor<string, User, UserConnection, bool>
    {
        /// <summary>
        /// Processes the update
        /// </summary>
        /// <param name="entry"></param>
        /// <param name="arg"></param>
        /// <returns></returns>
        public bool Process(IMutableCacheEntry<string, User> entry, UserConnection arg)
        {
            var connection = (from conn in entry.Value.Connections
                             where conn.ConnectionId == arg.ConnectionId
                             select conn).FirstOrDefault();
            if(connection == null)
            {
                //this is a new connection
                entry.Value.Connections.Add(arg);
                return true;
            }

            if(arg.Disconnected)
            {
                entry.Value.Connections.Remove(connection);
            }
            else
            {
                connection.LastActivity = DateTime.Now;
            }

            return true;
        }
    }

I enabled Ignite Trace logs and this got printed

2020-06-21 21:09:54.1732|DEBUG|org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache|<usersCache> Entry did not pass the filter or conflict resolution (will skip write) [entry=GridDhtCacheEntry [rdrs=ReaderId[] [], part=358, super=GridDistributedCacheEntry [super=GridCacheMapEntry [key=KeyCacheObjectImpl [part=358,

also I was going through Ignite source to understand what operations are performed..no luck yet

https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java


Solution

  • Your code is fine, but since you only change the data inside the entry.Value object, Ignite does not detect those changes and does not update the entry.

    Add entry.Value = entry.Value right before return true. Ignite uses the Value property setter to mark the entry as updated.