package com.alimama.mdrill.partion;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.solr.client.solrj.SolrServerException;
import com.alimama.mdrill.topology.SolrStartJetty;
import com.alipay.bluewhale.core.cluster.SolrInfo;
import com.alipay.bluewhale.core.cluster.SolrInfo.ShardCount;
public class PartionListener implements StatListenerInterface{
@Override
public void init() {
}
private String parttype;
@Override
public void setPartionType(String parttype) {
this.parttype=parttype;
}
public String getPartionType()
{
return this.parttype;
}
private ArrayList<String> tablePartions = new ArrayList<String>();
private HashSet<String> tablePartionsSet = new HashSet<String>();
private HashMap<String, ShardCount> recorecount = new HashMap<String, ShardCount>();
private AtomicInteger lastPartionIndex = new AtomicInteger(0);
public boolean containsTablePartion(String partion)
{
return this.tablePartionsSet.contains(partion);
}
private void requestPartions(SolrStartJetty solrservice,String tablename) throws MalformedURLException, SolrServerException
{
String partion = "";
int len = tablePartions.size();
if (len > 0) {
int index = lastPartionIndex.incrementAndGet();
if (index >= len) {
index = 0;
lastPartionIndex.set(index);
}
partion = tablePartions.get(index);
}
if (partion != null) {
long cnt = solrservice.checkSolr(tablename, partion);
this.recorecount.put(partion, new ShardCount(cnt));
}
}
@Override
public void fetchCount(SolrStartJetty solrservice, String tablename,
GetPartions.TablePartion part) throws MalformedURLException,
SolrServerException {
this.requestPartions(solrservice,tablename);
}
@Override
public void syncClearPartions() {
tablePartions.clear();
tablePartionsSet.clear();
}
@Override
public void syncClearStat() {
HashSet<String> toclear = new HashSet<String>();
for(String k:recorecount.keySet())
{
if(!this.containsTablePartion(k))
{
toclear.add(k);
}
}
for(String k:toclear)
{
this.recorecount.remove(k);
}
}
@Override
public void addPartionStat(String partion) {
tablePartions.add(partion);
tablePartionsSet.add(partion);
}
@Override
public HashMap<String, ShardCount> getPartioncount() {
return recorecount;
}
@Override
public HashMap<String, ShardCount> getExtaCount() {
return new HashMap<String, SolrInfo.ShardCount>();
}
}