package org.fastcatsearch.http.action.management.collections;
import java.util.HashSet;
import java.util.Set;
import org.fastcatsearch.cluster.ClusterUtils;
import org.fastcatsearch.cluster.NodeJobResult;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.control.JobService;
import org.fastcatsearch.control.ResultFuture;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.job.management.CreateCollectionJob;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.util.ResponseWriter;
/**
* 관리도구 컬렉션 생성 위자드 step1 에서 사용될 액션.
* */
@ActionMapping(value = "/management/collections/create-update", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE)
public class CreateCollectionAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
String collectionId = request.getParameter("collectionId");
String collectionName = request.getParameter("name");
String indexNode = request.getParameter("indexNode");
String searchNodeListString = request.getParameter("searchNodeList");
String dataNodeListString = request.getParameter("dataNodeList");
boolean isSuccess = false;
String errorMessage = "";
try {
CreateCollectionJob createCollectionJob = new CreateCollectionJob(collectionId, collectionName, indexNode, searchNodeListString, dataNodeListString);
ResultFuture resultFuture = JobService.getInstance().offer(createCollectionJob);
if (resultFuture != null) {
Boolean result = (Boolean) resultFuture.take();
if (result != null && result.booleanValue()) {
isSuccess = true;
Set<String> nodeIdSet = new HashSet<String>();
nodeIdSet.add(indexNode);
if (searchNodeListString != null) {
for (String nodeStr : searchNodeListString.split(",")) {
nodeStr = nodeStr.trim();
if (nodeStr.length() > 0) {
nodeIdSet.add(nodeStr);
}
}
}
if (dataNodeListString != null) {
for (String nodeStr : dataNodeListString.split(",")) {
nodeStr = nodeStr.trim();
if (nodeStr.length() > 0) {
nodeIdSet.add(nodeStr);
}
}
}
//자신을 제외하고 보낸다.
nodeIdSet.remove(environment.myNodeId());
NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class);
NodeJobResult[] resultList = ClusterUtils.sendJobToNodeIdSet(createCollectionJob, nodeService, nodeIdSet, false);
for (NodeJobResult r : resultList) {
if(!r.isSuccess()) {
isSuccess &= false;
if(errorMessage.length() > 0){
errorMessage += ", ";
}
errorMessage += (r.node() + ": collection create fail.");
}
}
}
}
} catch (Throwable t) {
errorMessage = t.getMessage();
} finally {
ResponseWriter responseWriter = getDefaultResponseWriter(response.getWriter());
responseWriter.object();
responseWriter.key("success").value(isSuccess);
if (errorMessage != null) {
responseWriter.key("errorMessage").value(errorMessage);
}
responseWriter.endObject();
responseWriter.done();
}
}
}