blob: c388d548036193ced3f5ee883300bf11e487592d [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.search;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Map;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrInfoBean.Category;
import org.apache.solr.search.SolrCache.State;
import static org.apache.solr.common.params.CommonParams.NAME;
/**
* Common base class of reusable functionality for SolrCaches
*/
public abstract class SolrCacheBase {
protected CacheRegenerator regenerator;
private State state;
private String name;
protected AutoWarmCountRef autowarm;
/**
* Decides how many things to autowarm based on the size of another cache
*/
public static class AutoWarmCountRef {
private final int autoWarmCount;
private final int autoWarmPercentage;
private final boolean autoWarmByPercentage;
private final boolean doAutoWarming;
private final String strVal;
public AutoWarmCountRef(final String configValue) {
try {
String input = (null == configValue) ? "0" : configValue.trim();
// odd undocumented legacy behavior, -1 meant "all" (now "100%")
strVal = ("-1".equals(input)) ? "100%" : input;
if (strVal.indexOf("%") == (strVal.length() - 1)) {
autoWarmCount = 0;
autoWarmPercentage = Integer.parseInt(strVal.substring(0, strVal.length() - 1));
autoWarmByPercentage = true;
doAutoWarming = (0 < autoWarmPercentage);
} else {
autoWarmCount = Integer.parseInt(strVal);
autoWarmPercentage = 0;
autoWarmByPercentage = false;
doAutoWarming = (0 < autoWarmCount);
}
} catch (Exception e) {
throw new RuntimeException("Can't parse autoWarm value: " + configValue, e);
}
}
@Override
public String toString() {
return strVal;
}
public boolean isAutoWarmingOn() {
return doAutoWarming;
}
public int getWarmCount(final int previousCacheSize) {
return autoWarmByPercentage ?
(previousCacheSize * autoWarmPercentage)/100 :
Math.min(previousCacheSize, autoWarmCount);
}
}
/**
* Returns a "Hit Ratio" (ie: max of 1.00, not a percentage) suitable for
* display purposes.
*/
protected static float calcHitRatio(long lookups, long hits) {
return (lookups == 0) ? 0.0f :
BigDecimal.valueOf((double) hits / (double) lookups)
.setScale(2, RoundingMode.HALF_EVEN)
.floatValue();
}
public String getVersion() {
return SolrCore.version;
}
public Category getCategory() {
return Category.CACHE;
}
public void init(Map<String, String> args, CacheRegenerator regenerator) {
this.regenerator = regenerator;
state = State.CREATED;
name = args.get(NAME);
autowarm = new AutoWarmCountRef(args.get("autowarmCount"));
}
protected String getAutowarmDescription() {
return "autowarmCount=" + autowarm + ", regenerator=" + regenerator;
}
protected boolean isAutowarmingOn() {
return autowarm.isAutoWarmingOn();
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
public String name() {
return this.name;
}
}