@@ -71,7 +71,7 @@ public final class Suggester implements Closeable {
71
71
72
72
private static final String PROJECTS_DISABLED_KEY = "" ;
73
73
74
- private static final Logger logger = Logger .getLogger (Suggester .class .getName ());
74
+ private static final Logger LOGGER = Logger .getLogger (Suggester .class .getName ());
75
75
76
76
private final Map <String , SuggesterProjectData > projectData = new ConcurrentHashMap <>();
77
77
@@ -94,6 +94,7 @@ public final class Suggester implements Closeable {
94
94
private final int rebuildParallelismLevel ;
95
95
96
96
private volatile boolean rebuilding ;
97
+ private volatile boolean terminating ;
97
98
private final Lock rebuildLock = new ReentrantLock ();
98
99
private final Condition rebuildDone = rebuildLock .newCondition ();
99
100
@@ -164,7 +165,7 @@ public Suggester(
164
165
*/
165
166
public void init (final Collection <NamedIndexDir > luceneIndexes ) {
166
167
if (luceneIndexes == null || luceneIndexes .isEmpty ()) {
167
- logger .log (Level .INFO , "No index directories found, exiting..." );
168
+ LOGGER .log (Level .INFO , "No index directories found, exiting..." );
168
169
return ;
169
170
}
170
171
if (!projectsEnabled && luceneIndexes .size () > 1 ) {
@@ -173,11 +174,15 @@ public void init(final Collection<NamedIndexDir> luceneIndexes) {
173
174
174
175
synchronized (lock ) {
175
176
Instant start = Instant .now ();
176
- logger .log (Level .INFO , "Initializing suggester" );
177
+ LOGGER .log (Level .INFO , "Initializing suggester" );
177
178
178
179
ExecutorService executor = Executors .newWorkStealingPool (rebuildParallelismLevel );
179
180
180
181
for (NamedIndexDir indexDir : luceneIndexes ) {
182
+ if (terminating ) {
183
+ LOGGER .log (Level .INFO , "Terminating suggester initialization" );
184
+ return ;
185
+ }
181
186
submitInitIfIndexExists (executor , indexDir );
182
187
}
183
188
@@ -202,18 +207,22 @@ private void submitInitIfIndexExists(final ExecutorService executorService, fina
202
207
if (indexExists (indexDir .path )) {
203
208
executorService .submit (getInitRunnable (indexDir ));
204
209
} else {
205
- logger .log (Level .FINE , "Index in {0} directory does not exist, skipping..." , indexDir );
210
+ LOGGER .log (Level .FINE , "Index in {0} directory does not exist, skipping..." , indexDir );
206
211
}
207
212
} catch (IOException e ) {
208
- logger .log (Level .WARNING , "Could not check if index exists" , e );
213
+ LOGGER .log (Level .WARNING , "Could not check if index exists" , e );
209
214
}
210
215
}
211
216
212
217
private Runnable getInitRunnable (final NamedIndexDir indexDir ) {
213
218
return () -> {
214
219
try {
220
+ if (terminating ) {
221
+ return ;
222
+ }
223
+
215
224
Instant start = Instant .now ();
216
- logger .log (Level .FINE , "Initializing {0}" , indexDir );
225
+ LOGGER .log (Level .FINE , "Initializing {0}" , indexDir );
217
226
218
227
SuggesterProjectData wfst = new SuggesterProjectData (FSDirectory .open (indexDir .path ),
219
228
getSuggesterDir (indexDir .name ), allowMostPopular , allowedFields );
@@ -225,9 +234,9 @@ private Runnable getInitRunnable(final NamedIndexDir indexDir) {
225
234
}
226
235
227
236
Duration d = Duration .between (start , Instant .now ());
228
- logger .log (Level .FINE , "Finished initialization of {0}, took {1}" , new Object [] {indexDir , d });
237
+ LOGGER .log (Level .FINE , "Finished initialization of {0}, took {1}" , new Object [] {indexDir , d });
229
238
} catch (Exception e ) {
230
- logger .log (Level .SEVERE , "Could not initialize suggester data for " + indexDir , e );
239
+ LOGGER .log (Level .SEVERE , "Could not initialize suggester data for " + indexDir , e );
231
240
}
232
241
};
233
242
}
@@ -254,11 +263,11 @@ private void shutdownAndAwaitTermination(final ExecutorService executorService,
254
263
executorService .awaitTermination (awaitTerminationTime .toMillis (), TimeUnit .MILLISECONDS );
255
264
Duration duration = Duration .between (start , Instant .now ());
256
265
timer .record (duration );
257
- logger .log (Level .INFO , "{0} (took {1})" , new Object []{logMessageOnSuccess ,
266
+ LOGGER .log (Level .INFO , "{0} (took {1})" , new Object []{logMessageOnSuccess ,
258
267
DurationFormatUtils .formatDurationWords (duration .toMillis (),
259
268
true , true )});
260
269
} catch (InterruptedException e ) {
261
- logger .log (Level .SEVERE , "Interrupted while building suggesters" , e );
270
+ LOGGER .log (Level .SEVERE , "Interrupted while building suggesters" , e );
262
271
Thread .currentThread ().interrupt ();
263
272
}
264
273
}
@@ -269,7 +278,7 @@ private void shutdownAndAwaitTermination(final ExecutorService executorService,
269
278
*/
270
279
public void rebuild (final Collection <NamedIndexDir > indexDirs ) {
271
280
if (indexDirs == null || indexDirs .isEmpty ()) {
272
- logger .log (Level .INFO , "Not rebuilding suggester data because no index directories were specified" );
281
+ LOGGER .log (Level .INFO , "Not rebuilding suggester data because no index directories were specified" );
273
282
return ;
274
283
}
275
284
@@ -278,8 +287,12 @@ public void rebuild(final Collection<NamedIndexDir> indexDirs) {
278
287
rebuildLock .unlock ();
279
288
280
289
synchronized (lock ) {
290
+ if (terminating ) {
291
+ return ;
292
+ }
293
+
281
294
Instant start = Instant .now ();
282
- logger .log (Level .INFO , "Rebuilding the following suggesters: {0}" , indexDirs );
295
+ LOGGER .log (Level .INFO , "Rebuilding the following suggesters: {0}" , indexDirs );
283
296
284
297
ExecutorService executor = Executors .newWorkStealingPool (rebuildParallelismLevel );
285
298
@@ -325,14 +338,18 @@ public void waitForRebuild(long timeout, TimeUnit unit) throws InterruptedExcept
325
338
private Runnable getRebuildRunnable (final SuggesterProjectData data ) {
326
339
return () -> {
327
340
try {
341
+ if (terminating ) {
342
+ return ;
343
+ }
344
+
328
345
Instant start = Instant .now ();
329
- logger .log (Level .FINE , "Rebuilding {0}" , data );
346
+ LOGGER .log (Level .FINE , "Rebuilding {0}" , data );
330
347
data .rebuild ();
331
348
332
349
Duration d = Duration .between (start , Instant .now ());
333
- logger .log (Level .FINE , "Rebuild of {0} finished, took {1}" , new Object [] {data , d });
350
+ LOGGER .log (Level .FINE , "Rebuild of {0} finished, took {1}" , new Object [] {data , d });
334
351
} catch (Exception e ) {
335
- logger .log (Level .SEVERE , "Could not rebuild suggester" , e );
352
+ LOGGER .log (Level .SEVERE , "Could not rebuild suggester" , e );
336
353
}
337
354
};
338
355
}
@@ -347,12 +364,12 @@ public void remove(final Iterable<String> names) {
347
364
}
348
365
349
366
synchronized (lock ) {
350
- logger .log (Level .INFO , "Removing following suggesters: {0}" , names );
367
+ LOGGER .log (Level .INFO , "Removing following suggesters: {0}" , names );
351
368
352
369
for (String suggesterName : names ) {
353
370
SuggesterProjectData collection = projectData .get (suggesterName );
354
371
if (collection == null ) {
355
- logger .log (Level .WARNING , "Unknown suggester {0}" , suggesterName );
372
+ LOGGER .log (Level .WARNING , "Unknown suggester {0}" , suggesterName );
356
373
continue ;
357
374
}
358
375
collection .remove ();
@@ -403,7 +420,7 @@ private Suggestions prefixLookup(
403
420
List <LookupResultItem > results = readers .parallelStream ().flatMap (namedIndexReader -> {
404
421
SuggesterProjectData data = projectData .get (namedIndexReader .name );
405
422
if (data == null ) {
406
- logger .log (Level .FINE , "{0} not yet initialized" , namedIndexReader .name );
423
+ LOGGER .log (Level .FINE , "{0} not yet initialized" , namedIndexReader .name );
407
424
partialResult .value = true ;
408
425
return Stream .empty ();
409
426
}
@@ -442,7 +459,7 @@ private Suggestions complexLookup(
442
459
try {
443
460
futures = executorService .invokeAll (searchTasks , timeThreshold , TimeUnit .MILLISECONDS );
444
461
} catch (InterruptedException e ) {
445
- logger .log (Level .WARNING , "Interrupted while invoking suggester search" , e );
462
+ LOGGER .log (Level .WARNING , "Interrupted while invoking suggester search" , e );
446
463
Thread .currentThread ().interrupt ();
447
464
return new Suggestions (Collections .emptyList (), true );
448
465
}
@@ -461,7 +478,7 @@ private Suggestions complexLookup(
461
478
try {
462
479
searchTask .wait ();
463
480
} catch (InterruptedException e ) {
464
- logger .log (Level .WARNING , "Interrupted while waiting for task: {0}" , searchTask );
481
+ LOGGER .log (Level .WARNING , "Interrupted while waiting for task: {0}" , searchTask );
465
482
Thread .currentThread ().interrupt ();
466
483
}
467
484
}
@@ -501,7 +518,7 @@ public void onSearch(final Iterable<String> projects, final Query query) {
501
518
}
502
519
}
503
520
} catch (Exception e ) {
504
- logger .log (Level .FINE ,
521
+ LOGGER .log (Level .FINE ,
505
522
String .format ("Could not update search count map%s" ,
506
523
projectsEnabled ? " for projects: " + projects : "" ), e );
507
524
}
@@ -550,7 +567,7 @@ public boolean increaseSearchCount(final String project, final Term term, final
550
567
}
551
568
552
569
if (data == null ) {
553
- logger .log (Level .WARNING , "Cannot update search count because of missing suggester data{}" ,
570
+ LOGGER .log (Level .WARNING , "Cannot update search count because of missing suggester data{}" ,
554
571
projectsEnabled ? " for project " + project : "" );
555
572
return false ;
556
573
}
@@ -574,7 +591,7 @@ public List<Entry<BytesRef, Integer>> getSearchCounts(
574
591
) {
575
592
SuggesterProjectData data = projectData .get (project );
576
593
if (data == null ) {
577
- logger .log (Level .FINE , "Cannot retrieve search counts because suggester data for project {0} was not found" ,
594
+ LOGGER .log (Level .FINE , "Cannot retrieve search counts because suggester data for project {0} was not found" ,
578
595
project );
579
596
return Collections .emptyList ();
580
597
}
@@ -588,11 +605,12 @@ public List<Entry<BytesRef, Integer>> getSearchCounts(
588
605
@ Override
589
606
public void close () {
590
607
executorService .shutdownNow ();
608
+ terminating = true ;
591
609
projectData .values ().forEach (f -> {
592
610
try {
593
611
f .close ();
594
612
} catch (IOException e ) {
595
- logger .log (Level .WARNING , "Could not close suggester data " + f , e );
613
+ LOGGER .log (Level .WARNING , "Could not close suggester data " + f , e );
596
614
}
597
615
});
598
616
}
@@ -626,7 +644,7 @@ public Void call() {
626
644
627
645
SuggesterProjectData data = projectData .get (namedIndexReader .name );
628
646
if (data == null ) {
629
- logger .log (Level .FINE , "{0} not yet initialized" , namedIndexReader .name );
647
+ LOGGER .log (Level .FINE , "{0} not yet initialized" , namedIndexReader .name );
630
648
return null ;
631
649
}
632
650
boolean gotLock = data .tryLock ();
0 commit comments