blob: 9b754c1f8545d04050a35197b08d8f409499d188 [file] [log] [blame]
/*
* 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.solr.store.blockcache;
import java.math.BigDecimal;
import java.util.Map;
import org.apache.lucene.util.TestUtil;
import org.apache.solr.SolrTestCase;
import org.apache.solr.metrics.MetricsMap;
import org.apache.solr.metrics.SolrMetricManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class BufferStoreTest extends SolrTestCase {
private final static int blockSize = 1024;
private Metrics metrics;
private MetricsMap metricsMap;
private Store store;
@Before
public void setup() {
metrics = new Metrics();
SolrMetricManager metricManager = new SolrMetricManager();
String registry = TestUtil.randomSimpleString(random(), 2, 10);
String scope = TestUtil.randomSimpleString(random(), 2, 10);
metrics.initializeMetrics(metricManager, registry, "foo", scope);
metricsMap = (MetricsMap) ((SolrMetricManager.GaugeWrapper)metricManager.registry(registry).getMetrics().get("CACHE." + scope + ".hdfsBlockCache")).getGauge();
BufferStore.initNewBuffer(blockSize, blockSize, metrics);
store = BufferStore.instance(blockSize);
}
@After
public void clearBufferStores() {
BufferStore.clearBufferStores();
}
@Test
public void testBufferTakePut() {
byte[] b1 = store.takeBuffer(blockSize);
assertGaugeMetricsChanged(false, false);
byte[] b2 = store.takeBuffer(blockSize);
byte[] b3 = store.takeBuffer(blockSize);
assertRawMetricCounts(2, 0);
assertGaugeMetricsChanged(true, false);
store.putBuffer(b1);
assertGaugeMetricsChanged(false, false);
store.putBuffer(b2);
store.putBuffer(b3);
assertRawMetricCounts(0, 2);
assertGaugeMetricsChanged(false, true);
}
private void assertRawMetricCounts(int allocated, int lost) {
assertEquals("Buffer allocation count is wrong.", allocated,
metrics.shardBuffercacheAllocate.get());
assertEquals("Lost buffer count is wrong", lost,
metrics.shardBuffercacheLost.get());
}
/**
* Stateful method to verify whether the amount of buffers allocated and lost
* since the last call has changed.
*
* @param allocated
* whether buffers should have been allocated since the last call
* @param lost
* whether buffers should have been lost since the last call
*/
private void assertGaugeMetricsChanged(boolean allocated, boolean lost) {
Map<String,Object> stats = metricsMap.getValue();
assertEquals("Buffer allocation metric not updating correctly.",
allocated, isMetricPositive(stats, "buffercache.allocations"));
assertEquals("Buffer lost metric not updating correctly.",
lost, isMetricPositive(stats, "buffercache.lost"));
}
private boolean isMetricPositive(Map<String,Object> stats, String metric) {
return new BigDecimal(stats.get(metric).toString()).compareTo(BigDecimal.ZERO) > 0;
}
}