package org.apache.solr.request.uninverted;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import org.apache.lucene.util.cache.Cache;
import org.apache.lucene.util.cache.SimpleMapCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alimama.mdrill.utils.UniqConfig;
public class GrobalCache {
private static long MAX_MEM_CACHE_SIZE = UniqConfig.getFieldValueMemSize();
private static long MAX_MEM_CACHE_SIZE_FQ = UniqConfig.getFieldValueMemSizefq();
public static Logger log = LoggerFactory.getLogger(GrobalCache.class);
public static interface ILruMemSizeCache{
public long memSize();
public void LRUclean();
}
public static interface ILruMemSizeKey{
}
public static class StringKey implements GrobalCache.ILruMemSizeKey{
private String str;
@Override
public String toString() {
return str;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((str == null) ? 0 : str.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StringKey other = (StringKey) obj;
if (str == null) {
if (other.str != null)
return false;
} else if (!str.equals(other.str))
return false;
return true;
}
public StringKey(String str) {
super();
this.str = str;
}
}
private Cache<ILruMemSizeKey,ILruMemSizeCache> fieldValueCache_instance=Cache.synchronizedCache((new SimpleMapCache<ILruMemSizeKey, ILruMemSizeCache>(new LinkedHashMap<ILruMemSizeKey, ILruMemSizeCache>(1000,0.75f,true) {
private static final long serialVersionUID = 1L;
private long totalUsedMemsize=0l;
public ILruMemSizeCache put(ILruMemSizeKey key, ILruMemSizeCache value){
ILruMemSizeCache old=this.remove(key);
if(old!=null)
{
this.totalUsedMemsize-=old.memSize();
old.LRUclean();
}
long newmemsize = value.memSize();
boolean isprint=newmemsize>1024*1024;
if ((newmemsize + this.totalUsedMemsize) >= MAX_MEM_CACHE_SIZE) {
long removesize = 0l;
ArrayList<ILruMemSizeKey> toremove = new ArrayList<ILruMemSizeKey>();
for (Entry<ILruMemSizeKey, ILruMemSizeCache> e : this.entrySet()) {
removesize += e.getValue().memSize();
toremove.add(e.getKey());
if (removesize >= newmemsize) {
break;
}
}
this.totalUsedMemsize -= removesize;
int printcnt=0;
for (ILruMemSizeKey rm : toremove) {
ILruMemSizeCache urm = this.remove(rm);
if (urm!=null) {
if(isprint&&printcnt++<10)
{
log.info("field value cache lru removed key "+rm.toString());
}
urm.LRUclean();
}
}
if(this.size()==0)
{
this.totalUsedMemsize=0l;
}
}
if(isprint)
{
log.info("####fieldvaluecache####"+(this.totalUsedMemsize/1024/1024)+"@"+(MAX_MEM_CACHE_SIZE/1024/1024)+"mb,size="+this.size()+",mem="+(newmemsize/1024/1024)+"mb,key "+key+"");
}
this.totalUsedMemsize+=newmemsize;
return super.put(key, value);
}
})));
private Cache<ILruMemSizeKey,ILruMemSizeCache> fieldValueCacheFq_instance=Cache.synchronizedCache((new SimpleMapCache<ILruMemSizeKey, ILruMemSizeCache>(new LinkedHashMap<ILruMemSizeKey, ILruMemSizeCache>(1000,0.75f,true) {
private static final long serialVersionUID = 1L;
private long totalUsedMemsize=0l;
public ILruMemSizeCache put(ILruMemSizeKey key, ILruMemSizeCache value){
ILruMemSizeCache old=this.remove(key);
if(old!=null)
{
this.totalUsedMemsize-=old.memSize();
old.LRUclean();
}
long newmemsize = value.memSize();
boolean isprint=newmemsize>1024*1024;
if ((newmemsize + this.totalUsedMemsize) >= MAX_MEM_CACHE_SIZE_FQ) {
long removesize = 0l;
ArrayList<ILruMemSizeKey> toremove = new ArrayList<ILruMemSizeKey>();
for (Entry<ILruMemSizeKey, ILruMemSizeCache> e : this.entrySet()) {
removesize += e.getValue().memSize();
toremove.add(e.getKey());
if (removesize >= newmemsize) {
break;
}
}
this.totalUsedMemsize -= removesize;
int printcnt=0;
for (ILruMemSizeKey rm : toremove) {
ILruMemSizeCache urm = this.remove(rm);
if (urm!=null) {
if(isprint&&printcnt++<10)
{
log.info("field value cache FQ lru removed key "+rm.toString());
}
urm.LRUclean();
}
}
if(this.size()==0)
{
this.totalUsedMemsize=0l;
}
}
if(isprint)
{
log.info("####fieldvaluecache FQ####"+(this.totalUsedMemsize/1024/1024)+"@"+(MAX_MEM_CACHE_SIZE_FQ/1024/1024)+"mb,size="+this.size()+",mem="+(newmemsize/1024/1024)+"mb,key "+key+"");
}
this.totalUsedMemsize+=newmemsize;
return super.put(key, value);
}
})));
public static GrobalCache gcache= new GrobalCache();
public static Cache<ILruMemSizeKey,ILruMemSizeCache> fieldValueCache=gcache.fieldValueCache_instance;
public static Cache<ILruMemSizeKey,ILruMemSizeCache> fieldValueCache_fq=gcache.fieldValueCacheFq_instance;
}