1499
|
1 package goodjava.lucene.backup;
|
|
2
|
|
3 import java.io.File;
|
|
4 import java.io.IOException;
|
|
5 import java.util.List;
|
|
6 import java.util.ArrayList;
|
|
7 import java.util.Map;
|
|
8 import java.util.Arrays;
|
|
9 import goodjava.io.IoUtils;
|
|
10 import goodjava.rpc.RpcServer;
|
|
11 import goodjava.rpc.RpcCall;
|
|
12 import goodjava.rpc.RpcResult;
|
|
13 import goodjava.logging.Logger;
|
|
14 import goodjava.logging.LoggerFactory;
|
|
15 import goodjava.lucene.logging.LogFile;
|
|
16 import goodjava.lucene.logging.LoggingIndexWriter;
|
|
17 import goodjava.lucene.logging.LogOutputStream;
|
|
18
|
|
19
|
|
20 class Backup {
|
|
21 private static final Logger logger = LoggerFactory.getLogger(Backup.class);
|
|
22
|
|
23 private final File dir;
|
|
24
|
|
25 Backup(File dir) {
|
|
26 this.dir = dir;
|
|
27 }
|
|
28
|
|
29 synchronized void handle(RpcServer rpc,RpcCall call) {
|
|
30 try {
|
|
31 handle2(rpc,call);
|
|
32 } catch(IOException e) {
|
|
33 throw new RuntimeException(e);
|
|
34 }
|
|
35 }
|
|
36
|
|
37 void handle2(RpcServer rpc,RpcCall call) throws IOException {
|
|
38 dir.mkdirs();
|
|
39 //logger.info(call.cmd+" "+Arrays.asList(call.args));
|
|
40 String fileName = null;
|
|
41 if( call.cmd.equals("check") ) {
|
|
42 // nothing
|
|
43 } else if( call.cmd.equals("add") || call.cmd.equals("append") ) {
|
|
44 fileName = (String)call.args[2];
|
|
45 File f = new File(dir,fileName);
|
|
46 LogFile log = new LogFile(f);
|
|
47 LogOutputStream out = log.output();
|
|
48 IoUtils.copyAll(call.in,out);
|
|
49 out.commit();
|
|
50 out.close();
|
|
51 logger.info(call.cmd+" "+fileName+" "+call.lenIn);
|
|
52 } else
|
|
53 throw new RuntimeException("cmd "+call.cmd);
|
|
54 List logInfo = (List)call.args[1];
|
|
55 logger.info("check "+logInfo);
|
|
56 RpcResult result = new RpcResult("ok");
|
|
57 for( Object obj : logInfo ) {
|
|
58 Map fileInfo = (Map)obj;
|
|
59 String name = (String)fileInfo.get("name");
|
|
60 File f = new File(dir,name);
|
|
61 if( !f.exists() ) {
|
|
62 if( name.equals(fileName) ) logger.error("missing");
|
|
63 result = new RpcResult("missing",name);
|
|
64 break;
|
|
65 }
|
|
66 long end = (Long)fileInfo.get("end");
|
|
67 LogFile log = new LogFile(f);
|
|
68 long logEnd = log.end();
|
|
69 if( logEnd > end ) {
|
|
70 logger.error("logEnd > end - shouldn't happen, file="+name+" logEnd="+logEnd+" end="+end);
|
|
71 result = new RpcResult("missing",name);
|
|
72 break;
|
|
73 }
|
|
74 if( logEnd < end ) {
|
|
75 if( name.equals(fileName) ) logger.error("incomplete");
|
|
76 result = new RpcResult("incomplete",name,logEnd);
|
|
77 break;
|
|
78 }
|
|
79 }
|
|
80 if( call.cmd.equals("add") ) {
|
|
81 boolean complete = true;
|
|
82 List<LogFile> logs = new ArrayList<LogFile>();
|
|
83 for( Object obj : logInfo ) {
|
|
84 Map fileInfo = (Map)obj;
|
|
85 String name = (String)fileInfo.get("name");
|
|
86 File f = new File(dir,name);
|
|
87 if( !f.exists() ) {
|
|
88 complete = false;
|
|
89 break;
|
|
90 }
|
|
91 logs.add( new LogFile(f) );
|
|
92 }
|
|
93 if( complete ) {
|
|
94 File index = new File(dir,"index");
|
|
95 LoggingIndexWriter.writeIndex(logs,index);
|
|
96 logger.info("write index");
|
|
97 }
|
|
98 }
|
|
99 rpc.write(result);
|
|
100 }
|
|
101
|
|
102
|
|
103 }
|