package org.fastcatsearch.job.indexing;
import java.io.File;
import java.util.List;
import org.fastcatsearch.cluster.Node;
import org.fastcatsearch.cluster.NodeJobResult;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.control.JobService;
import org.fastcatsearch.control.ResultFuture;
import org.fastcatsearch.exception.FastcatSearchException;
import org.fastcatsearch.job.Job;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.task.IndexFileTransfer;
import org.fastcatsearch.transport.TransportException;
public class TransferIndexFileMultiNodeJob extends Job {
private static final long serialVersionUID = 6571189743024849707L;
private File file;
private List<Node> nodeList;
public TransferIndexFileMultiNodeJob(File file, List<Node> nodeList) {
this.file = file;
this.nodeList = nodeList;
}
@Override
public JobResult doRun() throws FastcatSearchException {
int nodeSize = nodeList.size();
NodeJobResult[] nodeJobResultList = new NodeJobResult[nodeSize];
ResultFuture[] resultList = new ResultFuture[nodeSize];
for (int i = 0; i < nodeList.size(); i++) {
Node node = nodeList.get(i);
TransferIndexFileJob transferJob = new TransferIndexFileJob(file, node);
resultList[i] = JobService.getInstance().offer(transferJob);
}
for (int i = 0; i < nodeList.size(); i++) {
boolean isSuccess = false;
if(resultList[i] != null){
Object obj = resultList[i].take();
isSuccess = resultList[i].isSuccess() && obj instanceof Boolean && (Boolean) obj;
}
nodeJobResultList[i] = new NodeJobResult(nodeList.get(i), null, isSuccess);
}
return new JobResult(nodeJobResultList);
}
public static class TransferIndexFileJob extends Job {
private static final long serialVersionUID = 7392952546461673256L;
private File file;
private Node node;
public TransferIndexFileJob(File file, Node node) {
this.file = file;
this.node = node;
}
@Override
public JobResult doRun() throws FastcatSearchException {
NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class);
try {
new IndexFileTransfer(environment).transferFile(file, nodeService, node);
} catch (TransportException e) {
logger.error("", e);
return new JobResult(false);
}
return new JobResult(true);
}
}
}