package com.taobao.tddl.repo.bdb.executor;
import java.util.ArrayList;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.taobao.tddl.common.exception.TddlException;
public class MasterResourceSelector extends CommonResourceSelector {
private static final Log logger = LogFactory.getLog(MasterResourceSelector.class);
// private final AtomicInteger masterIndex = new AtomicInteger(0);
private final AtomicInteger masterExecutor = new AtomicInteger(0);
private final Random random = new Random();
public MasterResourceSelector(Integer index){
super(index);
if (index == 0) {
throw new IllegalArgumentException("executor list size is 0");
}
}
@Override
public Integer select(Map<Integer, String> excludeKey) throws TddlException {
if (excludeKey == null) {
return masterExecutor.get();
} else {
Integer temp = masterExecutor.get();
if (!excludeKey.containsKey(temp)) {
logger.warn("not contains key :" + excludeKey + " .temp key is " + temp);
return temp;
} else {
ArrayList<Integer> clone = removeExcludeKey(excludeKey);
int restSize = clone.size();
if (restSize == 0) {
throw new TddlException("No More selections ." + excludeKey);
}
// 这里存在随机选择错误,导致后续选择也会错误的问题,但这依赖excludeKey来协调。
int index = random.nextInt(restSize);
masterExecutor.set(clone.get(index));
return masterExecutor.get();
}
}
}
@Override
public int getRetryTimes() {
return executorList.size();
}
@Override
public String toString() {
return "MasterResourceSelector [masterExecutor=" + masterExecutor + "]";
}
public AtomicInteger getMasterExecutor() {
return masterExecutor;
}
}