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