Mercurial Hosting > luan
annotate src/goodjava/lucene/backup/Backup.java @ 1674:af18eacf187c
automatic restore
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 29 May 2022 23:38:34 -0600 |
parents | 1b9f9fdb3b41 |
children | ea7075b7afe1 |
rev | line source |
---|---|
1499 | 1 package goodjava.lucene.backup; |
2 | |
3 import java.io.File; | |
1509 | 4 import java.io.InputStream; |
5 import java.io.FileInputStream; | |
1499 | 6 import java.io.IOException; |
7 import java.util.List; | |
8 import java.util.ArrayList; | |
9 import java.util.Map; | |
10 import java.util.Arrays; | |
11 import goodjava.io.IoUtils; | |
1509 | 12 import goodjava.io.BufferedInputStream; |
1499 | 13 import goodjava.rpc.RpcServer; |
14 import goodjava.rpc.RpcCall; | |
15 import goodjava.rpc.RpcResult; | |
1512 | 16 import goodjava.rpc.RpcException; |
1499 | 17 import goodjava.logging.Logger; |
18 import goodjava.logging.LoggerFactory; | |
19 import goodjava.lucene.logging.LogFile; | |
20 import goodjava.lucene.logging.LoggingIndexWriter; | |
21 import goodjava.lucene.logging.LogOutputStream; | |
22 | |
23 | |
1672 | 24 final class Backup { |
1499 | 25 private static final Logger logger = LoggerFactory.getLogger(Backup.class); |
26 | |
27 private final File dir; | |
1500 | 28 private final File index; |
1499 | 29 |
30 Backup(File dir) { | |
31 this.dir = dir; | |
1500 | 32 this.index = new File(dir,"index"); |
1673
1b9f9fdb3b41
remove backup password
Franklin Schmidt <fschmidt@gmail.com>
parents:
1672
diff
changeset
|
33 dir.setLastModified(System.currentTimeMillis()); |
1499 | 34 } |
35 | |
1509 | 36 void handle(RpcServer rpc,RpcCall call) { |
1499 | 37 try { |
1509 | 38 IoUtils.mkdirs(dir); |
39 if( call.cmd.equals("zip") ) { | |
40 handleZip(rpc); | |
41 } else { | |
42 handle2(rpc,call); | |
43 } | |
1499 | 44 } catch(IOException e) { |
45 throw new RuntimeException(e); | |
46 } | |
47 } | |
48 | |
1509 | 49 private static final RpcResult OK = new RpcResult(new Object[]{"ok"}); |
50 | |
51 synchronized void handle2(RpcServer rpc,RpcCall call) throws IOException { | |
1499 | 52 //logger.info(call.cmd+" "+Arrays.asList(call.args)); |
53 String fileName = null; | |
54 if( call.cmd.equals("check") ) { | |
55 // nothing | |
56 } else if( call.cmd.equals("add") || call.cmd.equals("append") ) { | |
1512 | 57 fileName = (String)call.args[1]; |
1499 | 58 File f = new File(dir,fileName); |
1508
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
59 if( call.cmd.equals("add") ) |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
60 IoUtils.delete(f); |
1499 | 61 LogFile log = new LogFile(f); |
62 LogOutputStream out = log.output(); | |
63 IoUtils.copyAll(call.in,out); | |
64 out.commit(); | |
65 out.close(); | |
1512 | 66 //logger.info(call.cmd+" "+fileName+" "+call.lenIn); |
67 } else { | |
68 logger.error("bad cmd '"+call.cmd+"'"); | |
69 rpc.write( new RpcException("bad cmd '"+call.cmd+"'") ); | |
70 return; | |
71 } | |
72 List logInfo = (List)call.args[0]; | |
73 //logger.info("check "+logInfo); | |
1509 | 74 RpcResult result = OK; |
1499 | 75 for( Object obj : logInfo ) { |
76 Map fileInfo = (Map)obj; | |
77 String name = (String)fileInfo.get("name"); | |
78 File f = new File(dir,name); | |
79 if( !f.exists() ) { | |
80 if( name.equals(fileName) ) logger.error("missing"); | |
1509 | 81 result = new RpcResult(new Object[]{"missing",name}); |
1499 | 82 break; |
83 } | |
84 long end = (Long)fileInfo.get("end"); | |
85 LogFile log = new LogFile(f); | |
86 long logEnd = log.end(); | |
87 if( logEnd > end ) { | |
88 logger.error("logEnd > end - shouldn't happen, file="+name+" logEnd="+logEnd+" end="+end); | |
1509 | 89 result = new RpcResult(new Object[]{"missing",name}); |
1499 | 90 break; |
91 } | |
92 if( logEnd < end ) { | |
93 if( name.equals(fileName) ) logger.error("incomplete"); | |
1509 | 94 result = new RpcResult(new Object[]{"incomplete",name,logEnd}); |
1499 | 95 break; |
96 } | |
1508
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
97 Object checksumObj = fileInfo.get("checksum"); |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
98 if( checksumObj != null ) { |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
99 long checksum = (Long)checksumObj; |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
100 if( log.checksum() != checksum ) { |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
101 index.delete(); |
1509 | 102 result = new RpcResult(new Object[]{"bad_checksum",name}); |
1508
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
103 break; |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
104 } |
86c5e7000ecf
lucene.backup checksum
Franklin Schmidt <fschmidt@gmail.com>
parents:
1501
diff
changeset
|
105 } |
1499 | 106 } |
107 if( call.cmd.equals("add") ) { | |
108 boolean complete = true; | |
1548 | 109 final LogFile[] logs = new LogFile[logInfo.size()]; |
110 for( int i=0; i<logs.length; i++ ) { | |
111 Map fileInfo = (Map)logInfo.get(i); | |
1499 | 112 String name = (String)fileInfo.get("name"); |
113 File f = new File(dir,name); | |
114 if( !f.exists() ) { | |
115 complete = false; | |
116 break; | |
117 } | |
1548 | 118 logs[i] = new LogFile(f); |
1499 | 119 } |
120 if( complete ) { | |
121 LoggingIndexWriter.writeIndex(logs,index); | |
1512 | 122 //logger.info("write index"); |
1499 | 123 } |
124 } | |
125 rpc.write(result); | |
126 } | |
127 | |
1509 | 128 void handleZip(RpcServer rpc) throws IOException { |
129 File zip = File.createTempFile("luan_",".zip"); | |
130 IoUtils.delete(zip); | |
1674 | 131 String cmd = "zip " + zip + " *"; |
1509 | 132 synchronized(this) { |
1674 | 133 Process proc = Runtime.getRuntime().exec(new String[]{"bash","-c",cmd},null,dir); |
1509 | 134 IoUtils.waitFor(proc); |
135 } | |
136 InputStream in = new BufferedInputStream(new FileInputStream(zip)); | |
137 RpcResult result = new RpcResult(in,zip.length(),new Object[0]); | |
138 rpc.write(result); | |
139 IoUtils.delete(zip); | |
140 } | |
1499 | 141 |
142 } |