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 { | 
