/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.internal.processors.cache.eviction.lru; import org.apache.ignite.cache.eviction.EvictableEntry; import org.apache.ignite.cache.eviction.lru.LruEvictionPolicy; import org.apache.ignite.internal.processors.cache.CacheEvictableEntryImpl; import org.apache.ignite.internal.processors.cache.eviction.EvictionAbstractTest; /** * LRU Eviction policy tests. */ public class LruEvictionPolicySelfTest extends EvictionAbstractTest<LruEvictionPolicy<String, String>> { /** * @throws Exception If failed. */ public void testMiddleAccess() throws Exception { startGrid(); try { LruEvictionPolicy<String, String> p = policy(); int max = 8; p.setMaxSize(max * MockEntry.ENTRY_SIZE); MockEntry entry1 = new MockEntry("1", "1"); MockEntry entry2 = new MockEntry("2", "2"); MockEntry entry3 = new MockEntry("3", "3"); p.onEntryAccessed(false, entry1); p.onEntryAccessed(false, entry2); p.onEntryAccessed(false, entry3); MockEntry[] freqUsed = new MockEntry[] { new MockEntry("4", "4"), new MockEntry("5", "5"), new MockEntry("6", "6"), new MockEntry("7", "7"), new MockEntry("8", "7") }; for (MockEntry e : freqUsed) p.onEntryAccessed(false, e); for (MockEntry e : freqUsed) assert !e.isEvicted(); int cnt = 1001; for (int i = 0; i < cnt; i++) p.onEntryAccessed(false, entry(freqUsed, i % freqUsed.length)); info(p); check(max, MockEntry.ENTRY_SIZE); } finally { stopGrid(); } } /** {@inheritDoc} */ @Override protected void doTestPolicy() throws Exception { startGrid(); try { MockEntry e1 = new MockEntry("1", "1"); MockEntry e2 = new MockEntry("2", "2"); MockEntry e3 = new MockEntry("3", "3"); MockEntry e4 = new MockEntry("4", "4"); MockEntry e5 = new MockEntry("5", "5"); LruEvictionPolicy<String, String> p = policy(); p.onEntryAccessed(false, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e1); p.onEntryAccessed(false, e2); check(MockEntry.ENTRY_SIZE, p.queue(), e1, e2); p.onEntryAccessed(false, e3); check(MockEntry.ENTRY_SIZE, p.queue(), e1, e2, e3); assertFalse(e1.isEvicted()); assertFalse(e2.isEvicted()); assertFalse(e3.isEvicted()); p.onEntryAccessed(false, e4); check(p.queue(), e2, e3, e4); check(MockEntry.ENTRY_SIZE, p.queue(), e2, e3, e4); assertTrue(e1.isEvicted()); assertFalse(e2.isEvicted()); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); p.onEntryAccessed(false, e5); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e5); assertTrue(e2.isEvicted()); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e1 = new MockEntry("1", "1")); check(MockEntry.ENTRY_SIZE, p.queue(), e4, e5, e1); assertTrue(e3.isEvicted()); assertFalse(e1.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e5); assertEquals(3, p.getCurrentSize()); check(MockEntry.ENTRY_SIZE, p.queue(), e4, e1, e5); assertFalse(e1.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e4, e5, e1); assertFalse(e1.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e5); assertEquals(3, p.getCurrentSize()); check(MockEntry.ENTRY_SIZE, p.queue(), e4, e1, e5); assertFalse(e1.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e4, e5); assertFalse(e1.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e4); check(MockEntry.ENTRY_SIZE, p.queue(), e5); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e5); check(MockEntry.ENTRY_SIZE, p.queue()); assertFalse(e5.isEvicted()); info(p); } finally { stopGrid(); } } /** {@inheritDoc} */ @Override protected void doTestPolicyWithBatch() throws Exception { startGrid(); try { MockEntry e1 = new MockEntry("1", "1"); MockEntry e2 = new MockEntry("2", "2"); MockEntry e3 = new MockEntry("3", "3"); MockEntry e4 = new MockEntry("4", "4"); MockEntry e5 = new MockEntry("5", "5"); LruEvictionPolicy<String, String> p = policy(); p.onEntryAccessed(false, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e1); p.onEntryAccessed(false, e2); check(MockEntry.ENTRY_SIZE, p.queue(), e1, e2); p.onEntryAccessed(false, e3); check(MockEntry.ENTRY_SIZE, p.queue(), e1, e2, e3); assertFalse(e1.isEvicted()); assertFalse(e2.isEvicted()); assertFalse(e3.isEvicted()); p.onEntryAccessed(false, e4); check(MockEntry.ENTRY_SIZE, p.queue(), e1, e2, e3, e4); assertFalse(e1.isEvicted()); assertFalse(e2.isEvicted()); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); p.onEntryAccessed(false, e5); // Batch evicted check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e5); assertTrue(e1.isEvicted()); assertTrue(e2.isEvicted()); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e1 = new MockEntry("1", "1")); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e5, e1); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); assertFalse(e1.isEvicted()); p.onEntryAccessed(false, e5); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e1, e5); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e1.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(false, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e5, e1); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); assertFalse(e1.isEvicted()); p.onEntryAccessed(false, e5); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e1, e5); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e1.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e1); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e4, e5); assertFalse(e3.isEvicted()); assertFalse(e4.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e4); check(MockEntry.ENTRY_SIZE, p.queue(), e3, e5); assertFalse(e3.isEvicted()); assertFalse(e5.isEvicted()); p.onEntryAccessed(true, e5); check(MockEntry.ENTRY_SIZE, p.queue(), e3); assertFalse(e3.isEvicted()); p.onEntryAccessed(true, e3); check(MockEntry.ENTRY_SIZE, p.queue()); info(p); } finally { stopGrid(); } } /** {@inheritDoc} */ @Override protected LruEvictionPolicy<String, String> createPolicy(int plcMax) { LruEvictionPolicy<String, String> plc = new LruEvictionPolicy<>(); plc.setMaxSize(this.plcMax); plc.setBatchSize(this.plcBatchSize); plc.setMaxMemorySize(this.plcMaxMemSize); return plc; } /** {@inheritDoc} */ @Override protected LruEvictionPolicy<String, String> createNearPolicy(int nearMax) { LruEvictionPolicy<String, String> plc = new LruEvictionPolicy<>(); plc.setMaxSize(nearMax); plc.setBatchSize(plcBatchSize); return plc; } /** {@inheritDoc} */ @Override protected void checkNearPolicies(int endNearPlcSize) { for (int i = 0; i < gridCnt; i++) for (EvictableEntry<String, String> e : nearPolicy(i).queue()) assert !e.isCached() : "Invalid near policy size: " + nearPolicy(i).queue(); } /** {@inheritDoc} */ @Override protected void checkPolicies() { for (int i = 0; i < gridCnt; i++) { if (plcMaxMemSize > 0) { int size = 0; for (EvictableEntry<String, String> entry : policy(i).queue()) size += ((CacheEvictableEntryImpl)entry).size(); assertEquals(size, ((LruEvictionPolicy)policy(i)).getCurrentMemorySize()); } else assertTrue(policy(i).queue().size() <= plcMax + plcBatchSize); } } }