aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/es/EsQueueDto.java19
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/es/RecoveryIndexer.java13
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java7
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java14
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java79
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java8
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/es/RecoveryIndexerTest.java44
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java8
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/rule/ws/TagsActionTest.java2
13 files changed, 103 insertions, 100 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/es/EsQueueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/es/EsQueueDto.java
index 26f310d34ca..63751bf5de5 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/es/EsQueueDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/es/EsQueueDto.java
@@ -93,25 +93,6 @@ public final class EsQueueDto {
return sb.toString();
}
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof EsQueueDto)) {
- return false;
- }
-
- EsQueueDto that = (EsQueueDto) o;
-
- return uuid.equals(that.uuid);
- }
-
- @Override
- public int hashCode() {
- return uuid.hashCode();
- }
-
public static EsQueueDto create(Type docType, String docUuid) {
return new EsQueueDto().setDocType(docType).setDocId(docUuid);
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/RecoveryIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/es/RecoveryIndexer.java
index 985143d03b1..709f652e88c 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/es/RecoveryIndexer.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/es/RecoveryIndexer.java
@@ -29,7 +29,7 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.math.RandomUtils;
import org.sonar.api.Startable;
-import org.sonar.api.config.Settings;
+import org.sonar.api.config.Configuration;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -63,7 +63,7 @@ public class RecoveryIndexer implements Startable {
.setNameFormat("RecoveryIndexer-%d")
.build());
private final System2 system2;
- private final Settings settings;
+ private final Configuration config;
private final DbClient dbClient;
private final UserIndexer userIndexer;
private final RuleIndexer ruleIndexer;
@@ -71,10 +71,10 @@ public class RecoveryIndexer implements Startable {
private final long minAgeInMs;
private final long loopLimit;
- public RecoveryIndexer(System2 system2, Settings settings, DbClient dbClient,
+ public RecoveryIndexer(System2 system2, Configuration config, DbClient dbClient,
UserIndexer userIndexer, RuleIndexer ruleIndexer, ActiveRuleIndexer activeRuleIndexer) {
this.system2 = system2;
- this.settings = settings;
+ this.config = config;
this.dbClient = dbClient;
this.userIndexer = userIndexer;
this.ruleIndexer = ruleIndexer;
@@ -161,10 +161,7 @@ public class RecoveryIndexer implements Startable {
}
private long getSetting(String key, long defaultValue) {
- long val = settings.getLong(key);
- if (val <= 0) {
- val = defaultValue;
- }
+ long val = config.getLong(key).orElse(defaultValue);
LOGGER.debug(LOG_PREFIX + "{}={}", key, val);
return val;
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java b/server/sonar-server/src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java
index b9d1d27ff14..cc29e14a9f1 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/es/ResiliencyIndexingListener.java
@@ -19,8 +19,8 @@
*/
package org.sonar.server.es;
+import com.google.common.collect.Multimap;
import java.util.Collection;
-import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import org.sonar.core.util.stream.MoreCollectors;
@@ -28,8 +28,6 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.es.EsQueueDto;
-import static java.util.stream.Collectors.toMap;
-
/**
* Clean-up the db table es_queue when documents
* are successfully indexed so that the recovery
@@ -50,11 +48,12 @@ public class ResiliencyIndexingListener implements IndexingListener {
@Override
public void onSuccess(Collection<String> docIds) {
if (!docIds.isEmpty()) {
- Map<String, EsQueueDto> itemsById = items.stream().collect(toMap(EsQueueDto::getDocId, Function.identity()));
+ Multimap<String, EsQueueDto> itemsById = items.stream().collect(MoreCollectors.index(EsQueueDto::getDocId, Function.identity()));
Collection<EsQueueDto> itemsToDelete = docIds
.stream()
.map(itemsById::get)
+ .flatMap(Collection::stream)
.filter(Objects::nonNull)
.collect(MoreCollectors.toArrayList(docIds.size()));
dbClient.esQueueDao().delete(dbSession, itemsToDelete);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java
index 70e11dee084..cf2bd389b2c 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java
@@ -81,8 +81,7 @@ public class RuleUpdater {
apply(update, rule, userSession);
update(dbSession, rule);
updateParameters(dbSession, organization, update, rule);
- ruleIndexer.commitAndIndex(dbSession, rule.getKey());
- ruleIndexer.commitAndIndex(dbSession, organization, rule.getKey());
+ ruleIndexer.commitAndIndex(dbSession, rule.getKey(), organization);
return true;
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java
index 226e3cda99f..e0317b989c8 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java
@@ -26,7 +26,6 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.sonar.api.rule.RuleKey;
import org.sonar.db.rule.RuleExtensionForIndexingDto;
import org.sonar.db.rule.RuleForIndexingDto;
-import org.sonar.db.rule.RuleMetadataDto;
import org.sonar.server.es.BaseDoc;
public class RuleExtensionDoc extends BaseDoc {
@@ -41,7 +40,7 @@ public class RuleExtensionDoc extends BaseDoc {
@Override
public String getId() {
- return getRuleKey() + "|" + getScope().getScope();
+ return idOf(getRuleKey(), getScope());
}
@Override
@@ -81,13 +80,6 @@ public class RuleExtensionDoc extends BaseDoc {
return this;
}
- public static RuleExtensionDoc of(RuleKey key, RuleExtensionScope scope, RuleMetadataDto ruleExtension) {
- return new RuleExtensionDoc()
- .setRuleKey(key)
- .setScope(scope)
- .setTags(ruleExtension.getTags());
- }
-
public static RuleExtensionDoc of(RuleForIndexingDto rule) {
return new RuleExtensionDoc()
.setRuleKey(rule.getRuleKey())
@@ -102,6 +94,10 @@ public class RuleExtensionDoc extends BaseDoc {
.setTags(rule.getTagsAsSet());
}
+ public static String idOf(RuleKey ruleKey, RuleExtensionScope scope) {
+ return ruleKey + "|" + scope.getScope();
+ }
+
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java
index 7c5db551866..eaf63b2f452 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java
@@ -45,9 +45,10 @@ import org.sonar.server.es.ResilientIndexer;
import org.sonar.server.es.StartupIndexer;
import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
-import static org.sonar.core.util.stream.MoreCollectors.toHashSet;
+import static org.sonar.core.util.stream.MoreCollectors.toArrayList;
import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE;
import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE_EXTENSION;
@@ -95,49 +96,41 @@ public class RuleIndexer implements StartupIndexer, ResilientIndexer {
commitAndIndex(dbSession, singletonList(ruleKey));
}
- public void commitAndIndex(DbSession dbSession, Collection<RuleKey> ruleDtos) {
- List<EsQueueDto> items = ruleDtos.stream()
- .map(key -> EsQueueDto.create(EsQueueDto.Type.RULE, key.toString()))
+ public void commitAndIndex(DbSession dbSession, Collection<RuleKey> ruleKeys) {
+ List<EsQueueDto> items = ruleKeys.stream()
+ .map(RuleIndexer::createQueueDtoForRule)
.collect(MoreCollectors.toArrayList());
dbClient.esQueueDao().insert(dbSession, items);
dbSession.commit();
- postCommit(dbSession, ruleDtos, items);
+ postCommit(dbSession, items);
}
- public void commitAndIndex(DbSession dbSession, OrganizationDto organizationDto, RuleKey ruleKey) {
- List<EsQueueDto> items = singletonList(EsQueueDto.create(EsQueueDto.Type.RULE_EXTENSION, ruleKey + "|" + organizationDto.getUuid()));
-
+ /**
+ * Commit a change on a rule and its extension on the given organization
+ */
+ public void commitAndIndex(DbSession dbSession, RuleKey ruleKey, OrganizationDto organization) {
+ List<EsQueueDto> items = asList(createQueueDtoForRule(ruleKey), createQueueDtoForRuleExtension(ruleKey, organization));
dbClient.esQueueDao().insert(dbSession, items);
dbSession.commit();
- postCommit(dbSession, ruleKey, organizationDto, items);
+ postCommit(dbSession, items);
}
/**
- * Entry point for Byteman tests. See directory tests/resilience.
- * The parameter "ruleKeys" is used only by the Byteman script.
+ * This method is used by the Byteman script of integration tests.
*/
- private void postCommit(DbSession dbSession, Collection<RuleKey> ruleKeys, Collection<EsQueueDto> items) {
- index(dbSession, items);
- }
-
- private void postCommit(DbSession dbSession, RuleKey ruleKeys, OrganizationDto organizationDto, Collection<EsQueueDto> items) {
+ private void postCommit(DbSession dbSession, List<EsQueueDto> items) {
index(dbSession, items);
}
@Override
public IndexingResult index(DbSession dbSession, Collection<EsQueueDto> items) {
- if (items.isEmpty()) {
- return new IndexingResult();
- }
-
IndexingResult result = new IndexingResult();
-
- ListMultimap<EsQueueDto.Type, EsQueueDto> itemsByType = groupItemsByType(items);
-
- result.add(doIndexRules(dbSession, itemsByType.get(EsQueueDto.Type.RULE)));
- result.add(doIndexRuleExtensions(dbSession, itemsByType.get(EsQueueDto.Type.RULE_EXTENSION)));
-
+ if (!items.isEmpty()) {
+ ListMultimap<EsQueueDto.Type, EsQueueDto> itemsByType = groupItemsByType(items);
+ result.add(doIndexRules(dbSession, itemsByType.get(EsQueueDto.Type.RULE)));
+ result.add(doIndexRuleExtensions(dbSession, itemsByType.get(EsQueueDto.Type.RULE_EXTENSION)));
+ }
return result;
}
@@ -145,28 +138,28 @@ public class RuleIndexer implements StartupIndexer, ResilientIndexer {
BulkIndexer bulkIndexer = createBulkIndexer(Size.REGULAR, new ResiliencyIndexingListener(dbClient, dbSession, items));
bulkIndexer.start();
- Set<RuleKey> rules = items
+ List<RuleKey> ruleKeys = items
.stream()
.filter(i -> {
requireNonNull(i.getDocId(), () -> "BUG - " + i + " has not been persisted before indexing");
return i.getDocType() == EsQueueDto.Type.RULE;
})
.map(i -> RuleKey.parse(i.getDocId()))
- .collect(toHashSet(items.size()));
+ .collect(toArrayList(items.size()));
- dbClient.ruleDao().scrollIndexingRulesByKeys(dbSession, rules,
+ dbClient.ruleDao().scrollIndexingRulesByKeys(dbSession, ruleKeys,
// only index requests, no deletion requests.
// Deactivated users are not deleted but updated.
r -> {
- rules.remove(r.getRuleKey());
bulkIndexer.add(newRuleDocIndexRequest(r));
bulkIndexer.add(newRuleExtensionDocIndexRequest(r));
+ ruleKeys.remove(r.getRuleKey());
});
// the remaining items reference rows that don't exist in db. They must
// be deleted from index.
- rules.forEach(r -> bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE, r.toString()));
- rules.forEach(r -> bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE_EXTENSION, r.toString()));
+ ruleKeys.forEach(r -> bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE, r.toString(), r.toString()));
+ ruleKeys.forEach(r -> bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE_EXTENSION, RuleExtensionDoc.idOf(r, RuleExtensionScope.system()), r.toString()));
return bulkIndexer.stop();
}
@@ -175,26 +168,30 @@ public class RuleIndexer implements StartupIndexer, ResilientIndexer {
BulkIndexer bulkIndexer = createBulkIndexer(Size.REGULAR, new ResiliencyIndexingListener(dbClient, dbSession, items));
bulkIndexer.start();
- Set<RuleExtensionId> docIds = items
+ List<RuleExtensionId> docIds = items
.stream()
.filter(i -> {
requireNonNull(i.getDocId(), () -> "BUG - " + i + " has not been persisted before indexing");
return i.getDocType() == EsQueueDto.Type.RULE_EXTENSION;
})
.map(RuleIndexer::explodeRuleExtensionDocId)
- .collect(toHashSet(items.size()));
+ .collect(toArrayList(items.size()));
dbClient.ruleDao().scrollIndexingRuleExtensionsByIds(dbSession, docIds,
// only index requests, no deletion requests.
// Deactivated users are not deleted but updated.
r -> {
- docIds.remove(new RuleExtensionId(r.getOrganizationUuid(), r.getPluginName(), r.getPluginRuleKey()));
+ RuleExtensionId docId = new RuleExtensionId(r.getOrganizationUuid(), r.getPluginName(), r.getPluginRuleKey());
+ docIds.remove(docId);
bulkIndexer.add(newRuleExtensionDocIndexRequest(r));
});
// the remaining items reference rows that don't exist in db. They must
// be deleted from index.
- docIds.forEach(r -> bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE_EXTENSION, r.getId()));
+ docIds.forEach(docId -> {
+ RuleKey ruleKey = RuleKey.of(docId.getRepositoryName(), docId.getRuleKey());
+ bulkIndexer.addDeletion(RuleIndexDefinition.INDEX_TYPE_RULE_EXTENSION, docId.getId(), ruleKey.toString());
+ });
return bulkIndexer.stop();
}
@@ -239,4 +236,14 @@ public class RuleIndexer implements StartupIndexer, ResilientIndexer {
checkArgument(esQueueDto.getDocType() == EsQueueDto.Type.RULE_EXTENSION);
return new RuleExtensionId(esQueueDto.getDocId());
}
+
+ private static EsQueueDto createQueueDtoForRule(RuleKey ruleKey) {
+ return EsQueueDto.create(EsQueueDto.Type.RULE, ruleKey.toString(), null, ruleKey.toString());
+ }
+
+ private static EsQueueDto createQueueDtoForRuleExtension(RuleKey ruleKey, OrganizationDto organization) {
+ String docId = RuleExtensionDoc.idOf(ruleKey, RuleExtensionScope.organization(organization));
+ return EsQueueDto.create(EsQueueDto.Type.RULE_EXTENSION, docId, null, ruleKey.toString());
+ }
+
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java
index 239a9bbcb60..eaede45f8aa 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java
@@ -38,14 +38,14 @@ import org.sonar.server.es.BulkIndexer.Size;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.IndexType;
import org.sonar.server.es.IndexingListener;
+import org.sonar.server.es.IndexingResult;
import org.sonar.server.es.ResiliencyIndexingListener;
import org.sonar.server.es.ResilientIndexer;
-import org.sonar.server.es.IndexingResult;
import org.sonar.server.es.StartupIndexer;
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
-import static org.sonar.core.util.stream.MoreCollectors.toHashSet;
+import static org.sonar.core.util.stream.MoreCollectors.toArrayList;
import static org.sonar.server.user.index.UserIndexDefinition.INDEX_TYPE_USER;
public class UserIndexer implements StartupIndexer, ResilientIndexer {
@@ -113,14 +113,14 @@ public class UserIndexer implements StartupIndexer, ResilientIndexer {
if (items.isEmpty()) {
return new IndexingResult();
}
- Set<String> logins = items
+ List<String> logins = items
.stream()
.filter(i -> {
requireNonNull(i.getDocId(), () -> "BUG - " + i + " has not been persisted before indexing");
return i.getDocType() == EsQueueDto.Type.USER;
})
.map(EsQueueDto::getDocId)
- .collect(toHashSet(items.size()));
+ .collect(toArrayList(items.size()));
ListMultimap<String, String> organizationUuidsByLogin = ArrayListMultimap.create();
dbClient.organizationMemberDao().selectForUserIndexing(dbSession, logins, organizationUuidsByLogin::put);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/RecoveryIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/es/RecoveryIndexerTest.java
index 0c8fa0f5f10..b3f42589d13 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/es/RecoveryIndexerTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/es/RecoveryIndexerTest.java
@@ -33,7 +33,6 @@ import org.junit.Test;
import org.junit.rules.DisableOnDebug;
import org.junit.rules.TestRule;
import org.junit.rules.Timeout;
-import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.internal.TestSystem2;
import org.sonar.api.utils.log.LogTester;
@@ -49,6 +48,7 @@ import org.sonar.server.rule.index.RuleIndexer;
import org.sonar.server.user.index.UserIndexDefinition;
import org.sonar.server.user.index.UserIndexer;
+import static java.util.Arrays.asList;
import static java.util.stream.IntStream.rangeClosed;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doAnswer;
@@ -72,7 +72,7 @@ public class RecoveryIndexerTest {
@Rule
public final LogTester logTester = new LogTester().setLevel(TRACE);
@Rule
- public TestRule safeguard = new DisableOnDebug(new Timeout(60, TimeUnit.SECONDS));
+ public TestRule safeguard = new DisableOnDebug(Timeout.builder().withTimeout(60, TimeUnit.SECONDS).withLookingForStuckThread(true).build());
private UserIndexer mockedUserIndexer = mock(UserIndexer.class);
private RuleIndexer mockedRuleIndexer = mock(RuleIndexer.class);
@@ -101,10 +101,10 @@ public class RecoveryIndexerTest {
@Test
public void start_triggers_recovery_run_at_fixed_rate() throws Exception {
- Settings settings = new MapSettings()
+ MapSettings settings = new MapSettings()
.setProperty("sonar.search.recovery.initialDelayInMs", "0")
.setProperty("sonar.search.recovery.delayInMs", "1");
- underTest = spy(new RecoveryIndexer(system2, settings, db.getDbClient(), mockedUserIndexer, mockedRuleIndexer, mockedActiveRuleIndexer));
+ underTest = spy(new RecoveryIndexer(system2, settings.asConfig(), db.getDbClient(), mockedUserIndexer, mockedRuleIndexer, mockedActiveRuleIndexer));
AtomicInteger calls = new AtomicInteger(0);
doAnswer(invocation -> {
calls.incrementAndGet();
@@ -242,7 +242,7 @@ public class RecoveryIndexerTest {
// 10 docs to process, by groups of 3.
// The first group successfully recovers only 1 docs --> above 30% of failures --> stop run
PartiallyFailingUserIndexer failingAboveRatioUserIndexer = new PartiallyFailingUserIndexer(1);
- Settings settings = new MapSettings()
+ MapSettings settings = new MapSettings()
.setProperty("sonar.search.recovery.loopLimit", "3");
underTest = newRecoveryIndexer(failingAboveRatioUserIndexer, mockedRuleIndexer, settings);
underTest.recover();
@@ -262,7 +262,7 @@ public class RecoveryIndexerTest {
// 10 docs to process, by groups of 5.
// Each group successfully recovers 4 docs --> below 30% of failures --> continue run
PartiallyFailingUserIndexer failingAboveRatioUserIndexer = new PartiallyFailingUserIndexer(4, 4, 2);
- Settings settings = new MapSettings()
+ MapSettings settings = new MapSettings()
.setProperty("sonar.search.recovery.loopLimit", "5");
underTest = newRecoveryIndexer(failingAboveRatioUserIndexer, mockedRuleIndexer, settings);
underTest.recover();
@@ -287,6 +287,29 @@ public class RecoveryIndexerTest {
assertThatQueueHasSize(1);
}
+ @Test
+ public void recover_multiple_times_the_same_document() {
+ UserDto user = db.users().insertUser();
+ EsQueueDto item1 = EsQueueDto.create(EsQueueDto.Type.USER, user.getLogin());
+ EsQueueDto item2 = EsQueueDto.create(EsQueueDto.Type.USER, user.getLogin());
+ EsQueueDto item3 = EsQueueDto.create(EsQueueDto.Type.USER, user.getLogin());
+ db.getDbClient().esQueueDao().insert(db.getSession(), asList(item1, item2, item3));
+ db.commit();
+
+ ProxyUserIndexer userIndexer = new ProxyUserIndexer();
+ advanceInTime();
+ underTest = newRecoveryIndexer(userIndexer, mockedRuleIndexer);
+ underTest.recover();
+
+ assertThatQueueHasSize(0);
+ assertThat(userIndexer.called)
+ .extracting(EsQueueDto::getUuid)
+ .containsExactlyInAnyOrder(item1.getUuid(), item2.getUuid(), item3.getUuid());
+
+ assertThatLogsContain(TRACE, "Elasticsearch recovery - processing 3 USER");
+ assertThatLogsContain(INFO, "Elasticsearch recovery - 3 documents processed [0 failures]");
+ }
+
private class ProxyUserIndexer extends UserIndexer {
private final List<EsQueueDto> called = new ArrayList<>();
@@ -363,7 +386,8 @@ public class RecoveryIndexerTest {
List<EsQueueDto> filteredItems = items.stream().filter(
i -> !i.getUuid().equals(failing.getUuid())).collect(toArrayList());
IndexingResult result = super.index(dbSession, filteredItems);
- if (items.contains(failing)) {
+ if (result.getTotal() == items.size() - 1) {
+ // the failing item was in the items list
result.incrementRequests();
}
@@ -425,15 +449,15 @@ public class RecoveryIndexerTest {
}
private RecoveryIndexer newRecoveryIndexer(UserIndexer userIndexer, RuleIndexer ruleIndexer) {
- Settings settings = new MapSettings()
+ MapSettings settings = new MapSettings()
.setProperty("sonar.search.recovery.initialDelayInMs", "0")
.setProperty("sonar.search.recovery.delayInMs", "1")
.setProperty("sonar.search.recovery.minAgeInMs", "1");
return newRecoveryIndexer(userIndexer, ruleIndexer, settings);
}
- private RecoveryIndexer newRecoveryIndexer(UserIndexer userIndexer, RuleIndexer ruleIndexer, Settings settings) {
- return new RecoveryIndexer(system2, settings, db.getDbClient(), userIndexer, ruleIndexer, mockedActiveRuleIndexer);
+ private RecoveryIndexer newRecoveryIndexer(UserIndexer userIndexer, RuleIndexer ruleIndexer, MapSettings settings) {
+ return new RecoveryIndexer(system2, settings.asConfig(), db.getDbClient(), userIndexer, ruleIndexer, mockedActiveRuleIndexer);
}
private EsQueueDto createUnindexedUser() {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java
index b32d3e58cd1..356bfbf4ad8 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java
@@ -96,12 +96,12 @@ public class TagsActionTest {
RuleDefinitionDto r = dbTester.rules().insert(setSystemTags("tag1"));
ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey());
dbTester.rules().insertOrUpdateMetadata(r, organization, setTags("tag2"));
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, r.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey(), organization);
RuleDefinitionDto r2 = dbTester.rules().insert(setSystemTags("tag3"));
ruleIndexer.commitAndIndex(dbTester.getSession(), r2.getKey());
dbTester.rules().insertOrUpdateMetadata(r2, organization, setTags("tag4", "tag5"));
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, r2.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), r2.getKey(), organization);
String result = tester.newRequest()
.setParam("organization", organization.getKey())
@@ -118,7 +118,7 @@ public class TagsActionTest {
RuleDefinitionDto r = dbTester.rules().insert(setSystemTags("tag6"));
ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey());
dbTester.rules().insertOrUpdateMetadata(r, organization, setTags("tag7"));
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, r.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey(), organization);
String result = tester.newRequest()
.setParam("organization", organization.getKey())
@@ -180,7 +180,7 @@ public class TagsActionTest {
RuleDefinitionDto r = dbTester.rules().insert(setSystemTags("cwe"));
ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey());
dbTester.rules().insertOrUpdateMetadata(r, organization, setTags("security"));
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, r.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey(), organization);
String result = tester.newRequest()
.setParam("organization", organization.getKey())
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java
index 95a47a88e51..aaf4de5a8f5 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java
@@ -102,7 +102,7 @@ public class RuleIndexerTest {
underTest.commitAndIndex(dbTester.getSession(), rule.getKey());
OrganizationDto organization = dbTester.organizations().insert();
dbTester.rules().insertOrUpdateMetadata(rule, organization, m -> m.setTags(ImmutableSet.of("bla")));
- underTest.commitAndIndex(dbTester.getSession(), organization, rule.getKey());
+ underTest.commitAndIndex(dbTester.getSession(), rule.getKey(), organization);
RuleExtensionDoc doc = new RuleExtensionDoc()
.setRuleKey(rule.getKey())
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
index e7dd9c99e82..ba57d07a228 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionTest.java
@@ -738,7 +738,7 @@ public class SearchActionTest {
@SafeVarargs
private final RuleMetadataDto insertMetadata(OrganizationDto organization, RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) {
RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(rule, organization, populaters);
- ruleIndexer.commitAndIndex(db.getSession(), organization, rule.getKey());
+ ruleIndexer.commitAndIndex(db.getSession(), rule.getKey(), organization);
return metadata;
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
index df4b13920f0..7859a14ac68 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
@@ -236,7 +236,7 @@ public class ShowActionTest {
@SafeVarargs
private final RuleMetadataDto insertMetadata(OrganizationDto organization, RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) {
RuleMetadataDto metadata = dbTester.rules().insertOrUpdateMetadata(rule, organization, populaters);
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, rule.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), rule.getKey(), organization);
return metadata;
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/TagsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/TagsActionTest.java
index a75116f809b..d8e56b62b29 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/TagsActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/TagsActionTest.java
@@ -110,7 +110,7 @@ public class TagsActionTest {
RuleDefinitionDto r = dbTester.rules().insert(setSystemTags());
ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey());
dbTester.rules().insertOrUpdateMetadata(r, organization, setTags("tag"));
- ruleIndexer.commitAndIndex(dbTester.getSession(), organization, r.getKey());
+ ruleIndexer.commitAndIndex(dbTester.getSession(), r.getKey(), organization);
String result = tester.newRequest().setParam("organization", organization.getKey()).execute().getInput();
assertJson(result).isSimilarTo("{\"tags\":[\"tag\"]}");