/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed 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 com.hazelcast.internal.nearcache;
import com.hazelcast.config.EvictionConfig;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.config.NearCacheConfig;
import com.hazelcast.monitor.NearCacheStats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public abstract class NearCacheRecordStoreTestSupport extends CommonNearCacheTestSupport {
protected void putAndGetRecord(InMemoryFormat inMemoryFormat) {
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(
createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat), inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
}
assertEquals(DEFAULT_RECORD_COUNT, nearCacheRecordStore.size());
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
assertEquals("Record-" + i, nearCacheRecordStore.get(i));
}
}
protected void putAndRemoveRecord(InMemoryFormat inMemoryFormat) {
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(nearCacheConfig, inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
// ensure that they are stored
assertNotNull(nearCacheRecordStore.get(i));
}
assertEquals(DEFAULT_RECORD_COUNT, nearCacheRecordStore.size());
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.remove(i);
assertNull(nearCacheRecordStore.get(i));
}
assertEquals(0, nearCacheRecordStore.size());
}
protected void clearRecordsOrDestroyStore(InMemoryFormat inMemoryFormat, boolean destroy) {
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(nearCacheConfig, inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
// ensure that they are stored
assertNotNull(nearCacheRecordStore.get(i));
}
if (destroy) {
nearCacheRecordStore.destroy();
} else {
nearCacheRecordStore.clear();
}
assertEquals(0, nearCacheRecordStore.size());
}
protected void statsCalculated(InMemoryFormat inMemoryFormat) {
long creationStartTime = System.currentTimeMillis();
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(nearCacheConfig, inMemoryFormat);
long creationEndTime = System.currentTimeMillis();
int expectedEntryCount = 0;
int expectedHits = 0;
int expectedMisses = 0;
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
expectedEntryCount++;
}
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
if (nearCacheRecordStore.get(i * 3) != null) {
expectedHits++;
} else {
expectedMisses++;
}
}
NearCacheStats nearCacheStats = nearCacheRecordStore.getNearCacheStats();
long memoryCostWhenFull = nearCacheStats.getOwnedEntryMemoryCost();
// Note that System.currentTimeMillis() is not monotonically increasing.
// Below assertions can fail anytime but for testing purposes we can use `assertTrueEventually`.
long nearCacheStatsCreationTime = nearCacheStats.getCreationTime();
assertTrue("nearCacheStatsCreationTime=" + nearCacheStatsCreationTime
+ ", and creationStartTime=" + creationStartTime, nearCacheStatsCreationTime >= creationStartTime);
assertTrue("nearCacheStatsCreationTime=" + nearCacheStatsCreationTime
+ ", and creationEndTime=" + creationEndTime, nearCacheStatsCreationTime <= creationEndTime);
assertEquals(expectedHits, nearCacheStats.getHits());
assertEquals(expectedMisses, nearCacheStats.getMisses());
assertEquals(expectedEntryCount, nearCacheStats.getOwnedEntryCount());
switch (inMemoryFormat) {
case BINARY:
assertTrue(memoryCostWhenFull > 0);
break;
case OBJECT:
assertEquals(0, memoryCostWhenFull);
}
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
if (nearCacheRecordStore.remove(i * 3)) {
expectedEntryCount--;
}
}
assertEquals(expectedEntryCount, nearCacheStats.getOwnedEntryCount());
switch (inMemoryFormat) {
case BINARY:
assertTrue(nearCacheStats.getOwnedEntryMemoryCost() > 0);
assertTrue(nearCacheStats.getOwnedEntryMemoryCost() < memoryCostWhenFull);
break;
case OBJECT:
assertEquals(0, nearCacheStats.getOwnedEntryMemoryCost());
break;
}
nearCacheRecordStore.clear();
switch (inMemoryFormat) {
case BINARY:
case OBJECT:
assertEquals(0, nearCacheStats.getOwnedEntryMemoryCost());
break;
}
}
protected void ttlEvaluated(InMemoryFormat inMemoryFormat) {
int ttlSeconds = 3;
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
nearCacheConfig.setTimeToLiveSeconds(ttlSeconds);
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(
nearCacheConfig, inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
}
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
assertNotNull(nearCacheRecordStore.get(i));
}
sleepSeconds(ttlSeconds + 1);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
assertNull(nearCacheRecordStore.get(i));
}
}
protected void maxIdleTimeEvaluatedSuccessfully(InMemoryFormat inMemoryFormat) {
int maxIdleSeconds = 3;
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
nearCacheConfig.setMaxIdleSeconds(maxIdleSeconds);
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(
nearCacheConfig, inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
}
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
assertNotNull(nearCacheRecordStore.get(i));
}
sleepSeconds(maxIdleSeconds + 1);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
assertNull(nearCacheRecordStore.get(i));
}
}
protected void expiredRecordsCleanedUpSuccessfully(InMemoryFormat inMemoryFormat, boolean useIdleTime) {
int cleanUpThresholdSeconds = 3;
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
if (useIdleTime) {
nearCacheConfig.setMaxIdleSeconds(cleanUpThresholdSeconds);
} else {
nearCacheConfig.setTimeToLiveSeconds(cleanUpThresholdSeconds);
}
NearCacheRecordStore<Integer, String> nearCacheRecordStore = createNearCacheRecordStore(
nearCacheConfig, inMemoryFormat);
for (int i = 0; i < DEFAULT_RECORD_COUNT; i++) {
nearCacheRecordStore.put(i, "Record-" + i);
}
sleepSeconds(cleanUpThresholdSeconds + 1);
nearCacheRecordStore.doExpiration();
assertEquals(0, nearCacheRecordStore.size());
NearCacheStats nearCacheStats = nearCacheRecordStore.getNearCacheStats();
assertEquals(0, nearCacheStats.getOwnedEntryCount());
assertEquals(0, nearCacheStats.getOwnedEntryMemoryCost());
}
protected void createNearCacheWithMaxSizePolicy(InMemoryFormat inMemoryFormat, EvictionConfig.MaxSizePolicy maxSizePolicy,
int size) {
NearCacheConfig nearCacheConfig = createNearCacheConfig(DEFAULT_NEAR_CACHE_NAME, inMemoryFormat);
EvictionConfig evictionConfig = new EvictionConfig();
evictionConfig.setMaximumSizePolicy(maxSizePolicy);
evictionConfig.setSize(size);
nearCacheConfig.setEvictionConfig(evictionConfig);
createNearCacheRecordStore(nearCacheConfig, inMemoryFormat);
}
}