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.service.ServiceManager; import org.fastcatsearch.util.ResponseWriter; import org.fastcatsearch.util.ResultWriterException; //@ActionMapping(value = "/management/collections/all-node-indexing-status", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.READABLE) @ActionMapping(value = "/management/collections/all-node-indexing-status", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.NONE) public class GetAllNodeIndexingStatusAction 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(); NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class); Node indexNode = nodeService.getNodeById(indexNodeId); List<Node> dataNodeList = nodeService.getNodeById(dataNodeIdList); dataNodeList.remove(indexNode); //색인노드가 data노드에 있다면 빼준다. List<ResultFuture> resultFutureList = new ArrayList<ResultFuture>(); if(indexNode != null && indexNode.isActive()){ GetIndexingDataInfoJob job = new GetIndexingDataInfoJob(); job.setArgs(collectionId); ResultFuture resultFuture1 = nodeService.sendRequest(indexNode, job); resultFutureList.add(resultFuture1); }else{ resultFutureList.add(null); } for (Node dataNode : dataNodeList) { GetIndexingDataInfoJob job = new GetIndexingDataInfoJob(); job.setArgs(collectionId); if(dataNode != null && dataNode.isActive()){ ResultFuture resultFuture = nodeService.sendRequest(dataNode, 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); } } IndexingDataInfo indexingDataInfo = indexingDataInfoList.remove(0); Writer writer = response.getWriter(); ResponseWriter responseWriter = getDefaultResponseWriter(writer); responseWriter.object(); responseWriter.key("collectionId").value(collectionId); responseWriter.key("indexNode"); writeIndexingDataInfo(indexNode, responseWriter, indexingDataInfo); responseWriter.key("dataNode").array(); for (int i = 0; i < indexingDataInfoList.size(); i++) { IndexingDataInfo indexingDataInfo2 = indexingDataInfoList.get(i); Node dataNode = dataNodeList.get(i); writeIndexingDataInfo(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(); } }