package org.fastcatsearch.http.action.management.collections; 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.ir.IRService; import org.fastcatsearch.ir.search.CollectionHandler; import org.fastcatsearch.job.management.collections.OperateCollectionJob; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.util.ResponseWriter; @ActionMapping(value = "/management/collections/operate", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE) public class OperateCollectionAction extends AuthAction { @Override public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception { String collectionId = request.getParameter("collectionId"); String command = request.getParameter("command"); boolean isSuccess = false; String errorMessage = null; try { OperateCollectionJob operateCollectionJob = new OperateCollectionJob(collectionId, command); IRService irService = ServiceManager.getInstance().getService(IRService.class); CollectionHandler collectionHandler = irService.collectionHandler(collectionId); if (collectionHandler == null) { errorMessage = "Collection [" + collectionId + "] is not exist."; return; } ResultFuture resultFuture = JobService.getInstance().offer(operateCollectionJob); Object object = resultFuture.take(); if(object instanceof Boolean) { isSuccess = (Boolean) object; } Set<String> nodeIdSet = collectionHandler.collectionContext().collectionConfig().getCollectionNodeIDSet(); nodeIdSet.remove(environment.myNodeId()); NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class); NodeJobResult[] resultList = ClusterUtils.sendJobToNodeIdSet(operateCollectionJob, nodeService, nodeIdSet, true); for(NodeJobResult r : resultList) { logger.debug("Operation {} >> {} : {}", command, r.node(), r.result()); isSuccess = (isSuccess && r.isSuccess()); } } catch (Exception e) { isSuccess = false; errorMessage = e.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(); } } }