You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by waterg <je...@gmail.com> on 2017/05/26 01:19:45 UTC

Expired entry in cache with persistent store

Hello all,

I have test program to help me better understand the design behavior of
expired entry in cache with persistent store. I have write behind/read
through enabled and created listener for expire event. The log below shows
that if I use a get operation after an entry is expired,  the entry will be
loaded from database, and return the cache value. 

[16:20:36] Topology snapshot [ver=1, servers=1, clients=0, CPUs=4,
heap=0.5GB]
Try get entry before sleep
[Sample Mode]col1:10; col2: 10String value of     ; col3: 10String value of    
String value of     ; 
[1495754442269]-----------Datebase BATCH upsert:1 entries successful
----------------
Received event [evt=CACHE_OBJECT_EXPIRED, key=10|10String value of     |,
oldVal=com.sample.model.SampleModel [idHash=2074419914, hash=1504083002,
col2=10String value of     , col3=10String value of     String value of    
, col1=10], newVal=null
Try get entry after 2 minute sleep
*entry with key =10|10String value of     | loaded from database*
[Sample Mode]col1:10; col2: 10String value of     ; col3: 10String value of    
String value of     ; 
[16:22:41] Ignite node stopped OK [uptime=00:02:04:396]

when I disable write through/behind and leave read through true, ignite
still tries to load data from database.

Try get entry before sleep
[Sample Mode]col1:10; col2: 10String value of     ; col3: 10String value of    
String value of     ; 
[18:08:29] New version is available at ignite.apache.org: 2.0.0
Received event [evt=CACHE_OBJECT_EXPIRED, key=10|10String value of     |,
oldVal=com.sample.model.SampleModel [idHash=532656278, hash=449338124,
col2=10String value of     , col3=10String value of     String value of    
, col1=10], newVal=null
Try get entry after 2 minute sleep
*entry with key =10|10String value of     | loaded from database
null*
[18:10:24] Ignite node stopped OK [uptime=00:02:04:613]

When I disable write through/behind and read through, no cache.load is
executed.

Try get entry before sleep
[Sample Mode]col1:10; col2: 10String value of     ; col3: 10String value of    
String value of     ; 
[18:13:04] New version is available at ignite.apache.org: 2.0.0
Received event [evt=CACHE_OBJECT_EXPIRED, key=10|10String value of     |,
oldVal=com.sample.model.SampleModel [idHash=1018189201, hash=449338124,
col2=10String value of     , col3=10String value of     String value of    
, col1=10], newVal=null
Try get entry after 2 minute sleep
null

Is it a designed behavior? Appreciate clarification. The example below is
great, but doesn't show how it behave when a persistent store is in picture.

https://github.com/gridgain/gridgain-advanced-examples/blob/master/src/main/java/org/gridgain/examples/datagrid/eviction/CacheTtlExample.java


The program looks like below:

   public static void main(String[] args) throws IgniteException {

        System.out.println(new Date()+ "IGNITE START
----------------------------");
        Ignite ignite = null;
        try {

            Ignition.setClientMode(false);
            ignite = Ignition.start("config/ignite-writebehind.xml");

            try (IgniteCache<String, SampleModel> cache =
ignite.getOrCreateCache("sampleCache")) {

                //test expiry
                // Local listener that listenes to local events.
                IgnitePredicate<CacheEvent> rmtLsnr = evt -> {
                    System.out.println("Received event [evt=" + evt.name() +
", key=" + evt.key() +
                            ", oldVal=" + evt.oldValue() + ", newVal=" +
evt.newValue());

                    return true; // Continue listening.
                };

                // Subscribe to specified cache events occuring on local
node.
               
ignite.events(ignite.cluster().forCacheNodes("sampleCache")).remoteListen(null,
rmtLsnr,
//                        EventType.EVT_CACHE_OBJECT_PUT,
//                        EventType.EVT_CACHE_OBJECT_READ,
//                        EventType.EVT_CACHE_OBJECT_REMOVED,
                        EventType.EVT_CACHE_OBJECT_EXPIRED);

                testTouchdExpiry(cache);
            }
        } finally {
            if (ignite != null) {
                ignite.close();
            }
        }

    }

    private static void testTouchdExpiry(IgniteCache<String, SampleModel>
cache) {
        //create
        SampleModel entry = new SampleModel( Long.valueOf(10),
                String.valueOf(10) + "String value of     ",
                String.valueOf(10) + "String value of     String value of    
" );
        cache.put(entry.getKeyString(), entry);
        System.out.println("Try get entry before sleep");
        System.out.println(cache.get(entry.getKeyString()));


        //exire?
        try {
            TimeUnit.MINUTES.sleep(2);
        }catch (InterruptedException e) {

        }
        System.out.println("Try get entry after 2 minute sleep");
        System.out.println(cache.get(entry.getKeyString()));

    }
  
configuration file

         <property name="cacheConfiguration">

            <list>
            <bean
class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="name" value="sampleCache"/>
                
                <property name="readThrough" value="false"/>
                <property name="writeThrough" value="false"/>
                <property name="writeBehindEnabled" value="false"/>
                <property name="writeBehindFlushFrequency" value="5000" />
                <property name="writeBehindFlushSize" value="1000"/>
                <property name="writeBehindFlushThreadCount" value="10"/>
                <property name="writeBehindBatchSize" value="100"/>
                <property name="expiryPolicyFactory" >
                    <bean id ="expiryPolicy" class
="javax.cache.expiry.CreatedExpiryPolicy"
                          factory-method="factoryOf">
                        <constructor-arg>
                            <bean class="javax.cache.expiry.Duration">
                                <constructor-arg value="MINUTES" />
                                <constructor-arg value="1"/>
                            </bean>
                        </constructor-arg>
                    </bean>
                </property>

                
                <property name="cacheStoreFactory">
                    <bean class="javax.cache.configuration.FactoryBuilder"
factory-method="factoryOf">
                        <constructor-arg
value="com.sample.store.SampleStore" />
                    </bean>
                </property>
               

            </bean>
        </list>
        </property>

        <property name="peerClassLoadingEnabled" value="true"/>

        
        <property name="includeEventTypes">
            <list>
                <util:constant
static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_EXPIRED"/>
                <util:constant
static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT" />
            </list>
        </property>

 



--
View this message in context: http://apache-ignite-users.70518.x6.nabble.com/Expired-entry-in-cache-with-persistent-store-tp13156.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.

Re: Expired entry in cache with persistent store

Posted by dkarachentsev <dk...@gridgain.com>.
Hi,

This is a correct behavior, by design any cache evictions and expirations
don't affect store, because cache usually keeps only hot data. If you set
read though, then Ignite will request store in case if entry wasn't found in
cache, otherwise it returns null and to load that data back in cache you
need to call IgniteCache.loadCache().

Write through writes any cache changes into database immediately, but write
behind does it in background, that significantly increases performance.

Thanks!
-Dmitry.



--
View this message in context: http://apache-ignite-users.70518.x6.nabble.com/Expired-entry-in-cache-with-persistent-store-tp13156p13354.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.

Re: Expired entry in cache with persistent store

Posted by waterg <je...@gmail.com>.
Hello, does someone have an ignite on this topic? Thank you very much!



--
View this message in context: http://apache-ignite-users.70518.x6.nabble.com/Expired-entry-in-cache-with-persistent-store-tp13156p13243.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.