Mercurial Hosting > luan
comparison src/goodjava/lucene/logging/LoggingIndexWriter.java @ 1486:2469aa31f31b
LogOutputStream
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Fri, 01 May 2020 16:09:35 -0600 |
| parents | 1fa6e8ec2d53 |
| children | 044a360c2300 |
comparison
equal
deleted
inserted
replaced
| 1485:6a24c8b33d6b | 1486:2469aa31f31b |
|---|---|
| 45 private static final Random rnd = new Random(); | 45 private static final Random rnd = new Random(); |
| 46 | 46 |
| 47 public final LuceneIndexWriter indexWriter; | 47 public final LuceneIndexWriter indexWriter; |
| 48 private final File logDir; | 48 private final File logDir; |
| 49 private final List<LogFile> logs = new ArrayList<LogFile>(); | 49 private final List<LogFile> logs = new ArrayList<LogFile>(); |
| 50 private LogOutputStream log; | |
| 50 private final File index; | 51 private final File index; |
| 51 private boolean isMerging = false; | 52 private boolean isMerging = false; |
| 52 | 53 |
| 53 public LoggingIndexWriter(LuceneIndexWriter indexWriter,File logDir) throws IOException { | 54 public LoggingIndexWriter(LuceneIndexWriter indexWriter,File logDir) throws IOException { |
| 54 this.indexWriter = indexWriter; | 55 this.indexWriter = indexWriter; |
| 62 try { | 63 try { |
| 63 if( dis.readInt() == version ) { | 64 if( dis.readInt() == version ) { |
| 64 final int n = dis.readInt(); | 65 final int n = dis.readInt(); |
| 65 for( int i=0; i<n; i++ ) { | 66 for( int i=0; i<n; i++ ) { |
| 66 File file = new File( logDir, dis.readUTF() ); | 67 File file = new File( logDir, dis.readUTF() ); |
| 67 logs.add( LogFile.newLogFile(file) ); | 68 logs.add( new LogFile(file) ); |
| 68 } | 69 } |
| 69 deleteUnusedFiles(); | 70 deleteUnusedFiles(); |
| 71 setLog(); | |
| 70 return; | 72 return; |
| 71 } | 73 } |
| 72 } finally { | 74 } finally { |
| 73 dis.close(); | 75 dis.close(); |
| 74 } | 76 } |
| 75 } | 77 } |
| 76 newLogs(); | 78 newLogs(); |
| 79 } | |
| 80 | |
| 81 private void setLog() throws IOException { | |
| 82 if( log != null ) | |
| 83 log.close(); | |
| 84 log = logs.get(logs.size()-1).output(); | |
| 77 } | 85 } |
| 78 | 86 |
| 79 public synchronized boolean isMerging() { | 87 public synchronized boolean isMerging() { |
| 80 return isMerging; | 88 return isMerging; |
| 81 } | 89 } |
| 92 for( int i=0; i<2; i++ ) { | 100 for( int i=0; i<2; i++ ) { |
| 93 logs.add( newLogFile() ); | 101 logs.add( newLogFile() ); |
| 94 } | 102 } |
| 95 logLucene( System.currentTimeMillis(), logs.get(0), indexWriter ); | 103 logLucene( System.currentTimeMillis(), logs.get(0), indexWriter ); |
| 96 writeIndex(); | 104 writeIndex(); |
| 105 setLog(); | |
| 97 logger.info("done building new logs"); | 106 logger.info("done building new logs"); |
| 98 } | 107 } |
| 99 | 108 |
| 100 private static void logLucene(long time,LogFile log,LuceneIndexWriter indexWriter) throws IOException { | 109 private static void logLucene(long time,LogFile logLucene,LuceneIndexWriter indexWriter) throws IOException { |
| 110 LogOutputStream log = logLucene.output(); | |
| 101 IndexReader reader = indexWriter.openReader(); | 111 IndexReader reader = indexWriter.openReader(); |
| 102 final IndexSearcher searcher = new IndexSearcher(reader); | 112 final IndexSearcher searcher = new IndexSearcher(reader); |
| 103 Query query = new MatchAllDocsQuery(); | 113 Query query = new MatchAllDocsQuery(); |
| 104 searcher.search( query, new GoodCollector(){ | 114 searcher.search( query, new GoodCollector(){ |
| 105 public void collectDoc(int iDoc) throws IOException { | 115 public void collectDoc(int iDoc) throws IOException { |
| 110 log.writeMap(storedFields); | 120 log.writeMap(storedFields); |
| 111 } | 121 } |
| 112 }); | 122 }); |
| 113 reader.close(); | 123 reader.close(); |
| 114 log.commit(); | 124 log.commit(); |
| 125 log.close(); | |
| 115 } | 126 } |
| 116 | 127 |
| 117 private LogFile newLogFile() throws IOException { | 128 private LogFile newLogFile() throws IOException { |
| 118 File file; | 129 File file; |
| 119 do { | 130 do { |
| 120 file = new File(logDir,"_"+rnd.nextInt(100)+".log"); | 131 file = new File(logDir,"_"+rnd.nextInt(100)+".log"); |
| 121 } while( file.exists() ); | 132 } while( file.exists() ); |
| 122 return LogFile.newLogFile(file); | 133 return new LogFile(file); |
| 123 } | 134 } |
| 124 | 135 |
| 125 private void deleteUnusedFiles() throws IOException { | 136 private void deleteUnusedFiles() throws IOException { |
| 126 Set<String> used = new HashSet<String>(); | 137 Set<String> used = new HashSet<String>(); |
| 127 used.add( index.getName() ); | 138 used.add( index.getName() ); |
| 304 }; | 315 }; |
| 305 searcher.search(query,col); | 316 searcher.search(query,col); |
| 306 return col.total; | 317 return col.total; |
| 307 } | 318 } |
| 308 | 319 |
| 309 private LogFile log() { | |
| 310 return logs.get(logs.size()-1); | |
| 311 } | |
| 312 | |
| 313 public synchronized void close() throws IOException { | 320 public synchronized void close() throws IOException { |
| 314 indexWriter.close(); | 321 indexWriter.close(); |
| 315 LogFile log = log(); | |
| 316 log.commit(); | 322 log.commit(); |
| 323 log.close(); | |
| 317 } | 324 } |
| 318 | 325 |
| 319 public synchronized void commit() throws IOException { | 326 public synchronized void commit() throws IOException { |
| 320 indexWriter.commit(); | 327 indexWriter.commit(); |
| 321 LogFile log = log(); | |
| 322 log.commit(); | 328 log.commit(); |
| 323 if( isMerging ) | 329 if( isMerging ) |
| 324 return; | 330 return; |
| 325 if( log.end() > logs.get(0).end() ) { | 331 if( log.logFile.end() > logs.get(0).end() ) { |
| 326 logs.add( newLogFile() ); | 332 logs.add( newLogFile() ); |
| 327 writeIndex(); | 333 writeIndex(); |
| 334 setLog(); | |
| 328 } | 335 } |
| 329 if( logs.size() > 3 ) { | 336 if( logs.size() > 3 ) { |
| 330 isMerging = true; | 337 isMerging = true; |
| 331 new Thread(mergeLogs).start(); | 338 new Thread(mergeLogs).start(); |
| 332 // mergeLogs.run(); | 339 // mergeLogs.run(); |
| 333 } | 340 } |
| 334 } | 341 } |
| 335 | 342 |
| 336 public synchronized void rollback() throws IOException { | 343 public synchronized void rollback() throws IOException { |
| 337 indexWriter.rollback(); | 344 indexWriter.rollback(); |
| 338 LogFile log = log(); | |
| 339 log.rollback(); | 345 log.rollback(); |
| 340 } | 346 } |
| 341 | 347 |
| 342 public synchronized void deleteAll() throws IOException { | 348 public synchronized void deleteAll() throws IOException { |
| 343 indexWriter.deleteAll(); | 349 indexWriter.deleteAll(); |
| 344 LogFile log = log(); | 350 writeOp(OP_DELETE_ALL); |
| 345 writeOp(log,OP_DELETE_ALL); | |
| 346 } | 351 } |
| 347 | 352 |
| 348 public synchronized void deleteDocuments(Query query) throws IOException { | 353 public synchronized void deleteDocuments(Query query) throws IOException { |
| 349 indexWriter.deleteDocuments(query); | 354 indexWriter.deleteDocuments(query); |
| 350 LogFile log = log(); | 355 writeOp(OP_DELETE_DOCUMENTS); |
| 351 writeOp(log,OP_DELETE_DOCUMENTS); | |
| 352 log.writeQuery(query); | 356 log.writeQuery(query); |
| 353 } | 357 } |
| 354 | 358 |
| 355 public synchronized void addDocument(Map<String,Object> storedFields) throws IOException { | 359 public synchronized void addDocument(Map<String,Object> storedFields) throws IOException { |
| 356 indexWriter.addDocument(storedFields); | 360 indexWriter.addDocument(storedFields); |
| 357 LogFile log = log(); | 361 writeOp(OP_ADD_DOCUMENT); |
| 358 writeOp(log,OP_ADD_DOCUMENT); | |
| 359 log.writeMap(storedFields); | 362 log.writeMap(storedFields); |
| 360 } | 363 } |
| 361 | 364 |
| 362 public synchronized void updateDocument(String keyFieldName,Map<String,Object> storedFields) throws IOException { | 365 public synchronized void updateDocument(String keyFieldName,Map<String,Object> storedFields) throws IOException { |
| 363 indexWriter.updateDocument(keyFieldName,storedFields); | 366 indexWriter.updateDocument(keyFieldName,storedFields); |
| 364 LogFile log = log(); | 367 writeOp(OP_UPDATE_DOCUMENT); |
| 365 writeOp(log,OP_UPDATE_DOCUMENT); | |
| 366 log.writeUTF(keyFieldName); | 368 log.writeUTF(keyFieldName); |
| 367 log.writeMap(storedFields); | 369 log.writeMap(storedFields); |
| 368 } | 370 } |
| 369 | 371 |
| 370 public synchronized void reindexDocuments(String keyFieldName,Query query) throws IOException { | 372 public synchronized void reindexDocuments(String keyFieldName,Query query) throws IOException { |
| 371 indexWriter.reindexDocuments(keyFieldName,query); | 373 indexWriter.reindexDocuments(keyFieldName,query); |
| 372 } | 374 } |
| 373 | 375 |
| 374 private void writeOp(LogFile log,int op) throws IOException { | 376 private void writeOp(int op) throws IOException { |
| 375 log.writeLong(System.currentTimeMillis()); | 377 log.writeLong(System.currentTimeMillis()); |
| 376 log.writeByte(op); | 378 log.writeByte(op); |
| 377 } | 379 } |
| 378 | 380 |
| 379 public synchronized void playLogs() throws IOException { | 381 public synchronized void playLogs() throws IOException { |
