/**
* 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.hadoop.hive.llap.cache;
import static org.junit.Assert.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.hadoop.hive.llap.cache.LowLevelCache.Priority;
import org.apache.hadoop.hive.llap.io.metadata.OrcFileMetadata;
import org.apache.hadoop.hive.llap.io.metadata.OrcMetadataCache;
import org.apache.hadoop.hive.llap.io.metadata.OrcStripeMetadata;
import org.junit.Test;
public class TestOrcMetadataCache {
private static class DummyCachePolicy implements LowLevelCachePolicy {
int lockCount = 0, unlockCount = 0;
public void cache(LlapCacheableBuffer buffer, Priority pri) {
++lockCount;
}
public void notifyLock(LlapCacheableBuffer buffer) {
++lockCount;
}
public void notifyUnlock(LlapCacheableBuffer buffer) {
++unlockCount;
}
public long evictSomeBlocks(long memoryToReserve) {
return memoryToReserve;
}
public void setEvictionListener(EvictionListener listener) {
}
public String debugDumpForOom() {
return "";
}
public void setParentDebugDumper(LlapOomDebugDump dumper) {
}
public void verifyEquals(int i) {
assertEquals(i, lockCount);
assertEquals(i, unlockCount);
}
@Override
public long tryEvictContiguousData(int allocationSize, int count) {
return 0;
}
@Override
public void debugDumpShort(StringBuilder sb) {
}
}
private static class DummyMemoryManager implements MemoryManager {
int allocs = 0;
@Override
public void reserveMemory(long memoryToReserve) {
++allocs;
}
@Override
public void releaseMemory(long memUsage) {
--allocs;
}
@Override
public String debugDumpForOom() {
return "";
}
@Override
public void updateMaxSize(long maxSize) {
}
@Override
public long forceReservedMemory(int allocationSize, int count) {
return allocationSize * count;
}
@Override
public void debugDumpShort(StringBuilder sb) {
}
}
@Test
public void testGetPut() throws Exception {
DummyMemoryManager mm = new DummyMemoryManager();
DummyCachePolicy cp = new DummyCachePolicy();
OrcMetadataCache cache = new OrcMetadataCache(mm, cp, false);
OrcFileMetadata ofm1 = OrcFileMetadata.createDummy(1), ofm2 = OrcFileMetadata.createDummy(2);
assertSame(ofm1, cache.putFileMetadata(ofm1));
assertEquals(1, mm.allocs);
cp.verifyEquals(1);
assertSame(ofm2, cache.putFileMetadata(ofm2));
assertEquals(2, mm.allocs);
cp.verifyEquals(2);
assertSame(ofm1, cache.getFileMetadata(1));
assertSame(ofm2, cache.getFileMetadata(2));
cp.verifyEquals(4);
OrcFileMetadata ofm3 = OrcFileMetadata.createDummy(1);
assertSame(ofm1, cache.putFileMetadata(ofm3));
assertEquals(2, mm.allocs);
cp.verifyEquals(5);
assertSame(ofm1, cache.getFileMetadata(1));
cp.verifyEquals(6);
OrcStripeMetadata osm1 = OrcStripeMetadata.createDummy(1), osm2 = OrcStripeMetadata.createDummy(2);
assertSame(osm1, cache.putStripeMetadata(osm1));
assertEquals(3, mm.allocs);
assertSame(osm2, cache.putStripeMetadata(osm2));
assertEquals(4, mm.allocs);
assertSame(osm1, cache.getStripeMetadata(osm1.getKey()));
assertSame(osm2, cache.getStripeMetadata(osm2.getKey()));
OrcStripeMetadata osm3 = OrcStripeMetadata.createDummy(1);
assertSame(osm1, cache.putStripeMetadata(osm3));
assertEquals(4, mm.allocs);
assertSame(osm1, cache.getStripeMetadata(osm3.getKey()));
cp.verifyEquals(12);
}
}