package org.fastcatsearch.http.action.management.collections; import java.io.Writer; import java.util.ArrayList; import java.util.List; import org.fastcatsearch.cluster.Node; import org.fastcatsearch.cluster.NodeService; 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.config.CollectionConfig; import org.fastcatsearch.job.management.GetIndexingDataInfoJob; import org.fastcatsearch.job.management.GetIndexingDataInfoJob.IndexingDataInfo; import org.fastcatsearch.job.management.GetRestorableIndexingDataInfoJob; import org.fastcatsearch.job.management.GetRestorableIndexingDataInfoJob.IndexingDataShortInfo; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.util.ResponseWriter; import org.fastcatsearch.util.ResultWriterException; @ActionMapping(value = "/management/collections/all-node-indexing-management-status", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.READABLE) public class GetAllNodeIndexingManagementStatusAction extends AuthAction { @Override public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception { String collectionId = request.getParameter("collectionId"); IRService irService = ServiceManager.getInstance().getService(IRService.class); CollectionConfig collectionConfig = irService.collectionContext(collectionId).collectionConfig(); String indexNodeId = collectionConfig.getIndexNode(); List<String> dataNodeIdList = collectionConfig.getDataNodeList(); List<String> nodeIdList = new ArrayList<String>(dataNodeIdList); //indexNodeId 까지 모두 합친다. if(!nodeIdList.contains(indexNodeId)){ nodeIdList.add(indexNodeId); } NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class); List<Node> nodeList = nodeService.getNodeById(nodeIdList); List<ResultFuture> resultFutureList = new ArrayList<ResultFuture>(); for (Node node : nodeList) { GetIndexingDataInfoJob job = new GetIndexingDataInfoJob(); job.setArgs(collectionId); if(node != null && node.isActive()){ ResultFuture resultFuture = nodeService.sendRequest(node, job); resultFutureList.add(resultFuture); }else{ resultFutureList.add(null); } } List<IndexingDataInfo> indexingDataInfoList = new ArrayList<IndexingDataInfo>(); for (ResultFuture resultFuture : resultFutureList) { if (resultFuture != null) { Object obj = resultFuture.take(); if (obj != null && obj instanceof IndexingDataInfo) { indexingDataInfoList.add((IndexingDataInfo) obj); } else { indexingDataInfoList.add(null); } } else { indexingDataInfoList.add(null); } } List<ResultFuture> resultFutureList2 = new ArrayList<ResultFuture>(); for (Node node : nodeList) { GetRestorableIndexingDataInfoJob job = new GetRestorableIndexingDataInfoJob(); job.setArgs(collectionId); if(node != null && node.isActive()){ ResultFuture resultFuture = nodeService.sendRequest(node, job); resultFutureList2.add(resultFuture); }else{ resultFutureList2.add(null); } } List<IndexingDataShortInfo> indexingDataShortInfoList = new ArrayList<IndexingDataShortInfo>(); for (ResultFuture resultFuture : resultFutureList2) { if (resultFuture != null) { Object obj = resultFuture.take(); if (obj != null && obj instanceof IndexingDataShortInfo) { indexingDataShortInfoList.add((IndexingDataShortInfo) obj); } else { indexingDataShortInfoList.add(null); } } else { indexingDataShortInfoList.add(null); } } Writer writer = response.getWriter(); ResponseWriter responseWriter = getDefaultResponseWriter(writer); responseWriter.object(); responseWriter.key("collectionId").value(collectionId); responseWriter.key("indexNodeId").value(indexNodeId); responseWriter.key("indexData").array(); for (int i = 0; i < indexingDataInfoList.size(); i++) { IndexingDataInfo indexingDataInfo2 = indexingDataInfoList.get(i); Node dataNode = nodeList.get(i); writeIndexingDataInfo(dataNode, responseWriter, indexingDataInfo2); } responseWriter.endArray(); responseWriter.key("restorableIndexData").array(); for (int i = 0; i < indexingDataShortInfoList.size(); i++) { IndexingDataShortInfo indexingDataInfo2 = indexingDataShortInfoList.get(i); Node dataNode = nodeList.get(i); writeIndexingDataShortInfo(dataNode, responseWriter, indexingDataInfo2); } responseWriter.endArray(); responseWriter.endObject(); responseWriter.done(); } private void writeIndexingDataInfo(Node node, ResponseWriter responseWriter, IndexingDataInfo indexingDataInfo) throws ResultWriterException { responseWriter.object(); responseWriter .key("nodeId").value(node.id()) .key("nodeName").value(node.name()); if(indexingDataInfo != null){ responseWriter .key("segmentSize").value(indexingDataInfo.segmentSize) .key("revisionUUID").value(indexingDataInfo.revisionUUID) .key("sequence").value(indexingDataInfo.sequence) .key("dataPath").value(indexingDataInfo.dataPath) .key("diskSize").value(indexingDataInfo.diskSize) .key("documentSize").value(indexingDataInfo.documentSize) .key("createTime").value(indexingDataInfo.createTime); }else{ responseWriter .key("segmentSize").value(0) .key("revisionUUID").value("") .key("sequence").value(-1) .key("dataPath").value("") .key("diskSize").value("") .key("documentSize").value(0) .key("createTime").value(""); } responseWriter.endObject(); } private void writeIndexingDataShortInfo(Node node, ResponseWriter responseWriter, IndexingDataShortInfo indexingDataInfo) throws ResultWriterException { responseWriter.object(); responseWriter .key("nodeId").value(node.id()) .key("nodeName").value(node.name()); if(indexingDataInfo != null){ responseWriter .key("revisionUUID").value(indexingDataInfo.revisionUUID) .key("sequence").value(indexingDataInfo.sequence) .key("dataPath").value(indexingDataInfo.dataPath) .key("diskSize").value(indexingDataInfo.diskSize) .key("documentSize").value(indexingDataInfo.documentSize); }else{ responseWriter .key("revisionUUID").value("") .key("sequence").value(-1) .key("dataPath").value("") .key("diskSize").value("") .key("documentSize").value(0); } responseWriter.endObject(); } }