view src/goodjava/lucene/backup/Backup.java @ 1504:f443542d8650

threading
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 May 2020 11:13:16 -0600
parents e66e3d50b289
children 86c5e7000ecf
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;
	private final File index;

	Backup(File dir) {
		this.dir = dir;
		this.index = new File(dir,"index");
	}

	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 {
		IoUtils.mkdirs(dir);
		//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 ) {
				LoggingIndexWriter.writeIndex(logs,index);
				logger.info("write index");
			}
		}
		rpc.write(result);
	}


}