Skip to content

Commit a336144

Browse files
author
Vladimir Kotal
committed
add method to wait for suggester init
1 parent 477571c commit a336144

File tree

4 files changed

+21
-18
lines changed

4 files changed

+21
-18
lines changed

opengrok-web/src/main/java/org/opengrok/web/api/v1/suggester/provider/service/SuggesterService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ public interface SuggesterService {
6969
*/
7070
void waitForRebuild(long timeout, TimeUnit unit) throws InterruptedException;
7171

72+
/**
73+
* Wait for the initialization. For testing.
74+
* @param timeout timeout to wait for
75+
* @param unit timeout unit
76+
*/
77+
void waitForInit(long timeout, TimeUnit unit) throws InterruptedException;
78+
7279
/**
7380
* Deletes all suggester data for the {@code project}.
7481
* @param project name of the project to delete

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,10 @@ public void waitForRebuild(long timeout, TimeUnit unit) throws InterruptedExcept
403403
suggester.waitForRebuild(timeout, unit);
404404
}
405405

406+
public void waitForInit(long timeout, TimeUnit unit) throws InterruptedException {
407+
suggester.waitForInit(timeout, unit);
408+
}
409+
406410
/** {@inheritDoc} */
407411
@Override
408412
public void close() {

opengrok-web/src/test/java/org/opengrok/web/api/v1/controller/SuggesterControllerTest.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.junit.Test;
3333
import org.junit.runners.MethodSorters;
3434
import org.opengrok.indexer.util.TestCasePrinterRule;
35-
import org.opengrok.suggest.Suggester;
3635
import org.opengrok.indexer.configuration.RuntimeEnvironment;
3736
import org.opengrok.indexer.configuration.SuggesterConfig;
3837
import org.opengrok.indexer.index.Indexer;
@@ -46,18 +45,15 @@
4645
import javax.ws.rs.core.Application;
4746
import javax.ws.rs.core.GenericType;
4847
import javax.ws.rs.core.Response;
49-
import java.lang.reflect.Field;
5048
import java.util.AbstractMap.SimpleEntry;
5149
import java.util.Arrays;
5250
import java.util.Collections;
5351
import java.util.List;
54-
import java.util.Map;
5552
import java.util.Map.Entry;
5653
import java.util.Set;
5754
import java.util.concurrent.TimeUnit;
5855
import java.util.stream.Collectors;
5956

60-
import static org.awaitility.Awaitility.await;
6157
import static org.hamcrest.Matchers.containsInAnyOrder;
6258
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
6359
import static org.junit.Assert.assertEquals;
@@ -129,24 +125,12 @@ public static void tearDownClass() {
129125
}
130126

131127
@Before
132-
public void before() {
133-
await().atMost(15, TimeUnit.SECONDS).until(() ->
134-
getSuggesterProjectDataSize() == env.getProjectList().size());
128+
public void before() throws InterruptedException {
129+
SuggesterServiceImpl.getInstance().waitForInit(15, TimeUnit.SECONDS);
135130

136131
env.setSuggesterConfig(new SuggesterConfig());
137132
}
138133

139-
private static int getSuggesterProjectDataSize() throws Exception {
140-
Field f = SuggesterServiceImpl.class.getDeclaredField("suggester");
141-
f.setAccessible(true);
142-
Suggester suggester = (Suggester) f.get(SuggesterServiceImpl.getInstance());
143-
144-
Field f2 = Suggester.class.getDeclaredField("projectData");
145-
f2.setAccessible(true);
146-
147-
return ((Map) f2.get(suggester)).size();
148-
}
149-
150134
@Test
151135
public void testGetSuggesterConfig() {
152136
SuggesterConfig config = target(SuggesterController.PATH)

suggester/src/main/java/org/opengrok/suggest/Suggester.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.Set;
5050
import java.util.concurrent.Callable;
5151
import java.util.concurrent.ConcurrentHashMap;
52+
import java.util.concurrent.CountDownLatch;
5253
import java.util.concurrent.ExecutorService;
5354
import java.util.concurrent.Executors;
5455
import java.util.concurrent.Future;
@@ -94,6 +95,8 @@ public final class Suggester implements Closeable {
9495
private final Lock rebuildLock = new ReentrantLock();
9596
private final Condition rebuildDone = rebuildLock.newCondition();
9697

98+
private final CountDownLatch initDone = new CountDownLatch(1);
99+
97100
// do NOT use fork join thread pool (work stealing thread pool) because it does not send interrupts upon cancellation
98101
private final ExecutorService executorService = Executors.newFixedThreadPool(
99102
Runtime.getRuntime().availableProcessors(),
@@ -166,9 +169,14 @@ public void init(final Collection<NamedIndexDir> luceneIndexes) {
166169
}
167170

168171
shutdownAndAwaitTermination(executor, start, "Suggester successfully initialized");
172+
initDone.countDown();
169173
}
170174
}
171175

176+
public void waitForInit(long timeout, TimeUnit unit) throws InterruptedException {
177+
initDone.await(timeout, unit);
178+
}
179+
172180
private void submitInitIfIndexExists(final ExecutorService executorService, final NamedIndexDir indexDir) {
173181
try {
174182
if (indexExists(indexDir.path)) {

0 commit comments

Comments
 (0)