package org.fastcatsearch.job.management; import java.io.File; import java.io.IOException; import javax.xml.bind.JAXBException; import org.apache.commons.io.FileUtils; import org.fastcatsearch.common.io.Streamable; import org.fastcatsearch.env.Path; import org.fastcatsearch.exception.FastcatSearchException; import org.fastcatsearch.ir.IRService; import org.fastcatsearch.ir.config.CollectionContext; import org.fastcatsearch.ir.config.DataInfo; import org.fastcatsearch.ir.config.DataInfo.SegmentInfo; import org.fastcatsearch.ir.io.DataInput; import org.fastcatsearch.ir.io.DataOutput; import org.fastcatsearch.job.Job; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.settings.SettingFileNames; import org.fastcatsearch.util.JAXBConfigs; /** * 현재 loading중인 seq의 색인정보가 아닌 restore시 사용될 색인정보. index#/info.xml의 정보를 이용한다. * */ public class GetRestorableIndexingDataInfoJob extends Job implements Streamable { private static final long serialVersionUID = -3683180705857933635L; @Override public JobResult doRun() throws FastcatSearchException { String collectionId = getStringArgs(); IndexingDataShortInfo result = new IndexingDataShortInfo(); IRService irService = ServiceManager.getInstance().getService(IRService.class); CollectionContext collectionContext = irService.collectionContext(collectionId); if(collectionContext == null){ //컬렉션이 올바로 로딩되지 않았다면 빈 객체리턴. return new JobResult(result); } //이전 시퀀스를 가져온다. int prevSequence = collectionContext.getPreviousDataSequence(); result.sequence = prevSequence; File prevIndexFileDir = collectionContext.dataFilePaths().indexDirFile(prevSequence); result.dataPath = new Path(collectionContext.collectionFilePaths().file()).relativise(prevIndexFileDir).getPath(); if(prevIndexFileDir.exists()){ long byteCount = FileUtils.sizeOfDirectory(prevIndexFileDir); result.diskSize = FileUtils.byteCountToDisplaySize(byteCount); } File dataInfoFile = new File(prevIndexFileDir, SettingFileNames.dataInfo); logger.debug("load dataInfoFile > {}", dataInfoFile.getAbsolutePath()); DataInfo dataInfo = null; try{ if(dataInfoFile.exists()){ dataInfo = JAXBConfigs.readConfig(dataInfoFile, DataInfo.class); String revisionUUID = null; SegmentInfo lastSegmentInfo = dataInfo.getLastSegmentInfo(); if(lastSegmentInfo != null){ revisionUUID = lastSegmentInfo.getRevisionInfo().getUuid(); }else{ revisionUUID = ""; } result.revisionUUID = revisionUUID; result.documentSize = dataInfo.getDocuments(); } }catch(JAXBException e){ logger.error("", e); } return new JobResult(result); } @Override public void readFrom(DataInput input) throws IOException { args = input.readString(); } @Override public void writeTo(DataOutput output) throws IOException { output.writeString(getStringArgs()); } public static class IndexingDataShortInfo implements Streamable { public String revisionUUID; public int sequence; public String dataPath; public String diskSize; public int documentSize; @Override public void readFrom(DataInput input) throws IOException { revisionUUID = input.readString(); sequence = input.readInt(); dataPath = input.readString(); diskSize = input.readString(); documentSize = input.readInt(); } @Override public void writeTo(DataOutput output) throws IOException { output.writeString(revisionUUID); output.writeInt(sequence); output.writeString(dataPath); output.writeString(diskSize); output.writeInt(documentSize); } } }