package org.fastcatsearch.http.action.management.collections; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.fastcatsearch.cluster.ClusterUtils; import org.fastcatsearch.cluster.NodeJobResult; import org.fastcatsearch.cluster.NodeService; 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.ir.config.CollectionContext; import org.fastcatsearch.job.management.UpdateCollectionConfigJob; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.util.CollectionContextUtil; import org.fastcatsearch.util.ResponseWriter; @ActionMapping(value = "/management/collections/update-config", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE) public class UpdateCollectionConfigAction extends AuthAction { @Override public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception { String collectionId = request.getParameter("collectionId"); String collectionName = request.getParameter("collectionName"); String indexNode = request.getParameter("indexNode"); String searchNodeList = request.getParameter("searchNodeList"); String dataNodeList = request.getParameter("dataNodeList"); int dataSequenceCycle = request.getIntParameter("dataSequenceCycle"); int segmentRevisionBackupSize = request.getIntParameter("segmentRevisionBackupSize"); int segmentDocumentLimit = request.getIntParameter("segmentDocumentLimit"); int fullIndexingSegmentSize = request.getIntParameter("fullIndexingSegmentSize"); IRService irService = ServiceManager.getInstance().getService(IRService.class); CollectionContext collectionContext = irService.collectionContext(collectionId); CollectionConfig collectionConfig = collectionContext.collectionConfig(); collectionConfig.setName(collectionName); collectionConfig.setIndexNode(indexNode.trim()); collectionConfig.getDataPlanConfig().setDataSequenceCycle(dataSequenceCycle); collectionConfig.getDataPlanConfig().setSegmentRevisionBackupSize(segmentRevisionBackupSize); collectionConfig.getDataPlanConfig().setSegmentDocumentLimit(segmentDocumentLimit); collectionConfig.setFullIndexingSegmentSize(fullIndexingSegmentSize); List<String> searchNodeListObj = new ArrayList<String>(); for(String nodeStr : searchNodeList.split(",")){ nodeStr = nodeStr.trim(); if(nodeStr.length() > 0){ searchNodeListObj.add(nodeStr); } } collectionConfig.setSearchNodeList(searchNodeListObj); List<String> dataNodeListObj = new ArrayList<String>(); for(String nodeStr : dataNodeList.split(",")){ nodeStr = nodeStr.trim(); if(nodeStr.length() > 0){ dataNodeListObj.add(nodeStr); } } collectionConfig.setDataNodeList(dataNodeListObj); boolean isSuccess = CollectionContextUtil.writeConfigFile(collectionConfig, collectionContext.collectionFilePaths()); NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class); nodeService.updateLoadBalance(collectionId, dataNodeListObj); //master노드의 컬렉션셋팅 업데이트가 성공했다면 나머지 노드에 수행한다. if(isSuccess){ logger.info("[{}] Master Update collection config success!", collectionId); Set<String> nodeSet = collectionConfig.getCollectionNodeIDSet(); nodeSet.remove(environment.myNodeId()); UpdateCollectionConfigJob job = new UpdateCollectionConfigJob(collectionId, collectionConfig); NodeJobResult[] resultList = ClusterUtils.sendJobToNodeIdSet(job, nodeService, nodeSet, false); for(NodeJobResult result : resultList){ logger.debug("[{}] [{}] [{}] Node Update collection config.", result.isSuccess(), result.node(), collectionId); } }else{ logger.error("[{}] Master Update collection config fail!", collectionId); } ResponseWriter responseWriter = getDefaultResponseWriter(response.getWriter()); responseWriter.object(); responseWriter.key("success").value(isSuccess); responseWriter.endObject(); responseWriter.done(); } }