Mercurial Hosting > luan
view src/goodjava/lucene/backup/Backup.java @ 1499:22e15cf73040
lucene.backup
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 09 May 2020 23:14:13 -0600 |
parents | |
children | f01abd6d5858 |
line wrap: on
line source
package goodjava.lucene.backup; import java.io.File; import java.io.IOException; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.Arrays; import goodjava.io.IoUtils; import goodjava.rpc.RpcServer; import goodjava.rpc.RpcCall; import goodjava.rpc.RpcResult; import goodjava.logging.Logger; import goodjava.logging.LoggerFactory; import goodjava.lucene.logging.LogFile; import goodjava.lucene.logging.LoggingIndexWriter; import goodjava.lucene.logging.LogOutputStream; class Backup { private static final Logger logger = LoggerFactory.getLogger(Backup.class); private final File dir; Backup(File dir) { this.dir = dir; } synchronized void handle(RpcServer rpc,RpcCall call) { try { handle2(rpc,call); } catch(IOException e) { throw new RuntimeException(e); } } void handle2(RpcServer rpc,RpcCall call) throws IOException { dir.mkdirs(); //logger.info(call.cmd+" "+Arrays.asList(call.args)); String fileName = null; if( call.cmd.equals("check") ) { // nothing } else if( call.cmd.equals("add") || call.cmd.equals("append") ) { fileName = (String)call.args[2]; File f = new File(dir,fileName); LogFile log = new LogFile(f); LogOutputStream out = log.output(); IoUtils.copyAll(call.in,out); out.commit(); out.close(); logger.info(call.cmd+" "+fileName+" "+call.lenIn); } else throw new RuntimeException("cmd "+call.cmd); List logInfo = (List)call.args[1]; logger.info("check "+logInfo); RpcResult result = new RpcResult("ok"); for( Object obj : logInfo ) { Map fileInfo = (Map)obj; String name = (String)fileInfo.get("name"); File f = new File(dir,name); if( !f.exists() ) { if( name.equals(fileName) ) logger.error("missing"); result = new RpcResult("missing",name); break; } long end = (Long)fileInfo.get("end"); LogFile log = new LogFile(f); long logEnd = log.end(); if( logEnd > end ) { logger.error("logEnd > end - shouldn't happen, file="+name+" logEnd="+logEnd+" end="+end); result = new RpcResult("missing",name); break; } if( logEnd < end ) { if( name.equals(fileName) ) logger.error("incomplete"); result = new RpcResult("incomplete",name,logEnd); break; } } if( call.cmd.equals("add") ) { boolean complete = true; List<LogFile> logs = new ArrayList<LogFile>(); for( Object obj : logInfo ) { Map fileInfo = (Map)obj; String name = (String)fileInfo.get("name"); File f = new File(dir,name); if( !f.exists() ) { complete = false; break; } logs.add( new LogFile(f) ); } if( complete ) { File index = new File(dir,"index"); LoggingIndexWriter.writeIndex(logs,index); logger.info("write index"); } } rpc.write(result); } }