@@ -154,9 +154,16 @@ private List<NamedIndexReader> getNamedIndexReaders(
154
154
/** {@inheritDoc} */
155
155
@ Override
156
156
public void refresh (final Configuration configuration ) {
157
+ logger .log (Level .FINE , "Refreshing suggester for new configuration {0}" , configuration );
157
158
lock .writeLock ().lock ();
158
159
try {
159
- suggester .close ();
160
+ // close and init from scratch because many things may have changed in the configuration
161
+ // e.g. sourceRoot
162
+ cancelScheduledRebuild ();
163
+ if (suggester != null ) {
164
+ suggester .close ();
165
+ }
166
+ suggester = null ;
160
167
initSuggester ();
161
168
} finally {
162
169
lock .writeLock ().unlock ();
@@ -170,34 +177,75 @@ public void refresh(final String project) {
170
177
171
178
Project p = config .getProjects ().get (project );
172
179
if (p == null ) {
173
- logger .log (Level .WARNING , "Cannot refresh suggester because project for name {0} was not found" , project );
180
+ logger .log (Level .WARNING , "Cannot refresh suggester because project for name {0} was not found" ,
181
+ project );
174
182
return ;
175
183
}
176
- suggester .rebuild (Collections .singletonList (Paths .get (config .getDataRoot (), IndexDatabase .INDEX_DIR , p .getPath ())));
184
+ lock .readLock ().lock ();
185
+ try {
186
+ if (suggester == null ) {
187
+ logger .log (Level .FINE , "Cannot refresh {0} because suggester is not initialized" , project );
188
+ return ;
189
+ }
190
+ suggester .rebuild (Collections .singletonList (Paths .get (config .getDataRoot (), IndexDatabase .INDEX_DIR ,
191
+ p .getPath ())));
192
+ } finally {
193
+ lock .readLock ().unlock ();
194
+ }
177
195
}
178
196
179
197
/** {@inheritDoc} */
180
198
@ Override
181
199
public void delete (final String project ) {
182
- suggester .remove (Collections .singleton (project ));
200
+ lock .readLock ().lock ();
201
+ try {
202
+ if (suggester == null ) {
203
+ logger .log (Level .FINE , "Cannot remove {0} because suggester is not initialized" , project );
204
+ return ;
205
+ }
206
+ suggester .remove (Collections .singleton (project ));
207
+ } finally {
208
+ lock .readLock ().unlock ();
209
+ }
183
210
}
184
211
185
212
/** {@inheritDoc} */
186
213
@ Override
187
214
public void onSearch (final Iterable <String > projects , final Query q ) {
188
- suggester .onSearch (projects , q );
215
+ lock .readLock ().lock ();
216
+ try {
217
+ if (suggester == null ) {
218
+ logger .log (Level .FINEST , "Suggester not initialized, ignoring query {0} in onSearch event" , q );
219
+ return ;
220
+ }
221
+ suggester .onSearch (projects , q );
222
+ } finally {
223
+ lock .readLock ().unlock ();
224
+ }
189
225
}
190
226
191
227
/** {@inheritDoc} */
192
228
@ Override
193
229
public void increaseSearchCount (final String project , final Term term , final int value ) {
194
- suggester .increaseSearchCount (project , term , value );
230
+ lock .readLock ().lock ();
231
+ try {
232
+ if (suggester == null ) {
233
+ return ;
234
+ }
235
+ suggester .increaseSearchCount (project , term , value );
236
+ } finally {
237
+ lock .readLock ().unlock ();
238
+ }
195
239
}
196
240
197
241
private void initSuggester () {
198
242
Configuration config = env .getConfiguration ();
199
243
200
244
SuggesterConfig suggesterConfig = config .getSuggesterConfig ();
245
+ if (!suggesterConfig .isEnabled ()) {
246
+ logger .log (Level .INFO , "Suggester disabled" );
247
+ return ;
248
+ }
201
249
202
250
File suggesterDir = new File (config .getDataRoot (), IndexDatabase .SUGGESTER_DIR );
203
251
suggester = new Suggester (suggesterDir ,
@@ -227,15 +275,21 @@ private static List<Path> getAllProjectIndexDirs() {
227
275
228
276
private Runnable getRebuildAllProjectsRunnable () {
229
277
return () -> {
230
- suggester .rebuild (getAllProjectIndexDirs ());
231
- scheduleRebuild ();
278
+ lock .readLock ().lock ();
279
+ try {
280
+ if (suggester == null ) {
281
+ return ;
282
+ }
283
+ suggester .rebuild (getAllProjectIndexDirs ());
284
+ scheduleRebuild ();
285
+ } finally {
286
+ lock .readLock ().unlock ();
287
+ }
232
288
};
233
289
}
234
290
235
291
private void scheduleRebuild () {
236
- if (future != null && !future .isDone ()) {
237
- future .cancel (false );
238
- }
292
+ cancelScheduledRebuild ();
239
293
240
294
Duration timeToNextRebuild = getTimeToNextRebuild ();
241
295
if (timeToNextRebuild == null ) {
@@ -249,6 +303,12 @@ private void scheduleRebuild() {
249
303
TimeUnit .MILLISECONDS );
250
304
}
251
305
306
+ private void cancelScheduledRebuild () {
307
+ if (future != null && !future .isDone ()) {
308
+ future .cancel (false );
309
+ }
310
+ }
311
+
252
312
private Duration getTimeToNextRebuild () {
253
313
String cronDefinition = env .getConfiguration ().getSuggesterConfig ().getRebuildCronConfig ();
254
314
if (cronDefinition == null ) {
@@ -274,7 +334,16 @@ private Duration getTimeToNextRebuild() {
274
334
/** {@inheritDoc} */
275
335
@ Override
276
336
public void close () {
277
- scheduler .shutdownNow ();
337
+ lock .writeLock ().lock ();
338
+ try {
339
+ scheduler .shutdownNow ();
340
+ if (suggester != null ) {
341
+ suggester .close ();
342
+ suggester = null ;
343
+ }
344
+ } finally {
345
+ lock .writeLock ().unlock ();
346
+ }
278
347
}
279
348
280
349
}
0 commit comments