/**
*
*/
package com.taobao.top.analysis.util;
import java.io.File;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.taobao.top.analysis.config.MasterConfig;
import com.taobao.top.analysis.node.job.Job;
import com.taobao.top.analysis.node.operation.JobDataOperation;
import com.taobao.top.analysis.node.operation.MergeJobOperation;
/**
* 用于载入master出错时错过的片段数据
* @author fangweng
* @email: fangweng@taobao.com
* 2012-1-17 上午12:45:04
*
*/
public class MasterDataRecoverWorker extends Thread {
private static final Log logger = LogFactory.getLog(MasterDataRecoverWorker.class);
String tempStoreDataDir;
Map<String,Job> jobs;
String masterName;
boolean isRunnable = true;
private MasterConfig config;
public MasterDataRecoverWorker(String masterName,String tempStoreDataDir,Map<String,Job> jobs, MasterConfig config)
{
super("MasterDataRecoverWorker");
this.tempStoreDataDir = tempStoreDataDir;
this.jobs = jobs;
this.masterName = masterName;
this.config = config;
}
@Override
public void run() {
while(isRunnable)
{
int count = 0;
try
{
File destDir = new File(tempStoreDataDir);
if (!destDir.exists() || (destDir.exists() && !destDir.isDirectory()))
{
Thread.sleep(60 * 1000);
continue;
}
File[] files = destDir.listFiles(new AnalyzerFilenameFilter(AnalysisConstants.TEMP_MASTER_DATAFILE_SUFFIX));
for(File f : files)
{
String fileName = f.getName();
if (!fileName.startsWith(masterName + ":"))
continue;
String jobName = fileName.substring(fileName.indexOf(AnalysisConstants.SPLIT_KEY) + AnalysisConstants.SPLIT_KEY.length(),
fileName.indexOf(AnalysisConstants.TEMP_MASTER_DATAFILE_SUFFIX));
Job job = jobs.get(jobName);
List<Map<String, Map<String, Object>>> mergeResults = JobDataOperation.load(f, false,job,false);
//如果合并成功,删除临时文件
if (MergeJobOperation.mergeToTrunk(job, mergeResults, config))
{
f.delete();
}
count += 1;
logger.info(new StringBuilder("load recover data : ").append(fileName).toString());
}
}
catch(InterruptedException e)
{
//do nothing
}
catch(Exception ex)
{
logger.error("MasterDataRecoverWorker error.",ex);
}
if (count == 0)
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
//do nothing
}
}
}
public void stopWorker()
{
isRunnable = false;
this.interrupt();
}
}