Skip to content

Commit fc39eac

Browse files
ahornaceVladimir Kotal
authored andcommitted
Do not initialize suggester data when suggester is disabled and improve synchronization in SuggesterServiceImpl
1 parent 625b40a commit fc39eac

File tree

1 file changed

+81
-12
lines changed

1 file changed

+81
-12
lines changed

src/org/opensolaris/opengrok/web/api/v1/suggester/provider/service/impl/SuggesterServiceImpl.java

Lines changed: 81 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,16 @@ private List<NamedIndexReader> getNamedIndexReaders(
154154
/** {@inheritDoc} */
155155
@Override
156156
public void refresh(final Configuration configuration) {
157+
logger.log(Level.FINE, "Refreshing suggester for new configuration {0}", configuration);
157158
lock.writeLock().lock();
158159
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;
160167
initSuggester();
161168
} finally {
162169
lock.writeLock().unlock();
@@ -170,34 +177,75 @@ public void refresh(final String project) {
170177

171178
Project p = config.getProjects().get(project);
172179
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);
174182
return;
175183
}
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+
}
177195
}
178196

179197
/** {@inheritDoc} */
180198
@Override
181199
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+
}
183210
}
184211

185212
/** {@inheritDoc} */
186213
@Override
187214
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+
}
189225
}
190226

191227
/** {@inheritDoc} */
192228
@Override
193229
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+
}
195239
}
196240

197241
private void initSuggester() {
198242
Configuration config = env.getConfiguration();
199243

200244
SuggesterConfig suggesterConfig = config.getSuggesterConfig();
245+
if (!suggesterConfig.isEnabled()) {
246+
logger.log(Level.INFO, "Suggester disabled");
247+
return;
248+
}
201249

202250
File suggesterDir = new File(config.getDataRoot(), IndexDatabase.SUGGESTER_DIR);
203251
suggester = new Suggester(suggesterDir,
@@ -227,15 +275,21 @@ private static List<Path> getAllProjectIndexDirs() {
227275

228276
private Runnable getRebuildAllProjectsRunnable() {
229277
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+
}
232288
};
233289
}
234290

235291
private void scheduleRebuild() {
236-
if (future != null && !future.isDone()) {
237-
future.cancel(false);
238-
}
292+
cancelScheduledRebuild();
239293

240294
Duration timeToNextRebuild = getTimeToNextRebuild();
241295
if (timeToNextRebuild == null) {
@@ -249,6 +303,12 @@ private void scheduleRebuild() {
249303
TimeUnit.MILLISECONDS);
250304
}
251305

306+
private void cancelScheduledRebuild() {
307+
if (future != null && !future.isDone()) {
308+
future.cancel(false);
309+
}
310+
}
311+
252312
private Duration getTimeToNextRebuild() {
253313
String cronDefinition = env.getConfiguration().getSuggesterConfig().getRebuildCronConfig();
254314
if (cronDefinition == null) {
@@ -274,7 +334,16 @@ private Duration getTimeToNextRebuild() {
274334
/** {@inheritDoc} */
275335
@Override
276336
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+
}
278347
}
279348

280349
}

0 commit comments

Comments
 (0)