接着写solr的预热过程
void org.apache.solr.search.SolrIndexSearcher.warm(SolrIndexSearcher old) throws IOException
会预热所有缓存
try {
this.cacheList[i].warm(this, old.cacheList[i]);
} finally {
try {
req.close();
} finally {
SolrRequestInfo.clearRequestInfo();
}
}
LRUCache的预热方法:
void org.apache.solr.search.LRUCache.warm(SolrIndexSearcher searcher, SolrCache<K, V> old)
先要获取旧缓存对象的同步锁
synchronized (other.map)
获得预热的数目 如果是0就不用预热了
int sz = autowarm.getWarmCount(other.map.size());
然后 遍历所有的key 并预热,
for (int i=0; i<keys.length; i++) {
try {
// 这一步是最终预热的过程 也就是把旧缓存导到新的缓存里
boolean continueRegen = regenerator.regenerateItem(searcher, this, old, keys[i], vals[i]);
if (!continueRegen) break;
}
catch (Throwable e) {
SolrException.log(log,"Error during auto-warming of key:" + keys[i], e);
}
}
这个预热是回调solrIndexSearcher类的initRegenerators方法的
solrConfig.fieldValueCacheConfig.setRegenerator方法实例化的匿名内部类的regenerateItem方法
详见SolrIndexSearcher的 void org.apache.solr.search.SolrIndexSearcher.initRegenerators(SolrConfig solrConfig)方法
如果是fieldValueCacheConfig
UnInvertedField.getUnInvertedField((String)oldKey, newSearcher); 会获得缓存的fieldValue
如果是filterCacheConfig就调用
newSearcher.cacheDocSet((Query)oldKey, null, false);
queryResultCacheConfig 调用
DocSet org.apache.solr.search.SolrIndexSearcher.getDocSet(List<Query> queries) throws IOException
如果有缓存就从缓存取得 没有的话 插入缓存