Browse Source

SONAR-8092 do not rely on updated-timestamp for indexing anymore

tags/6.4-RC1
Daniel Schwarz 7 years ago
parent
commit
5e5e3912f7
42 changed files with 159 additions and 328 deletions
  1. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/es/EsClient.java
  2. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/issue/IssueStorage.java
  3. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueStorage.java
  4. 11
    24
      server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexer.java
  5. 3
    10
      server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResultSetIterator.java
  6. 5
    12
      server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java
  7. 23
    30
      server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java
  8. 6
    18
      server/sonar-server/src/main/java/org/sonar/server/source/index/FileSourcesUpdaterHelper.java
  9. 9
    16
      server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndexer.java
  10. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/test/index/TestResultSetIterator.java
  11. 8
    11
      server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java
  12. 2
    8
      server/sonar-server/src/main/java/org/sonar/server/user/index/UserResultSetIterator.java
  13. 10
    31
      server/sonar-server/src/main/java/org/sonar/server/view/index/ViewIndexer.java
  14. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java
  15. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java
  16. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/IssueUpdaterTest.java
  17. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java
  18. 2
    2
      server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java
  19. 5
    5
      server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexerTest.java
  20. 5
    28
      server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueResultSetIteratorTest.java
  21. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/ws/AddCommentActionTest.java
  22. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java
  23. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java
  24. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java
  25. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java
  26. 2
    3
      server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java
  27. 7
    7
      server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java
  28. 15
    24
      server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java
  29. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java
  30. 0
    16
      server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java
  31. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/test/index/TestIndexerTest.java
  32. 5
    28
      server/sonar-server/src/test/java/org/sonar/server/test/index/TestResultSetIteratorTest.java
  33. 2
    3
      server/sonar-server/src/test/java/org/sonar/server/test/ws/ListActionTest.java
  34. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterTest.java
  35. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/index/UserIndexerTest.java
  36. 1
    14
      server/sonar-server/src/test/java/org/sonar/server/user/index/UserResultSetIteratorTest.java
  37. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/ws/ChangePasswordActionTest.java
  38. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java
  39. 2
    2
      server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java
  40. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java
  41. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java
  42. 7
    7
      server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java

+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/es/EsClient.java View File

@@ -205,11 +205,11 @@ public class EsClient implements Closeable {
/**
* Checks whether there is any document in any mentioned type.
*/
public boolean isEmpty(IndexTypeId... indexType) {
public boolean isEmpty(IndexTypeId indexType) {
return count(indexType) <= 0;
}

private long count(IndexTypeId... indexType) {
private long count(IndexTypeId indexType) {
return prepareSearch(indexType).setSize(0).get().getHits().getTotalHits();
}


+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/issue/IssueStorage.java View File

@@ -85,10 +85,10 @@ public abstract class IssueStorage {
long now = system2.now();
List<DefaultIssue> toBeUpdated = batchInsertAndReturnIssuesToUpdate(session, issues, now);
update(toBeUpdated, now);
doAfterSave();
doAfterSave(issues);
}

protected void doAfterSave() {
protected void doAfterSave(Iterable<DefaultIssue> issues) {
// overridden on server-side to index ES
}


+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueStorage.java View File

@@ -60,8 +60,8 @@ public class ServerIssueStorage extends IssueStorage {
}

@Override
protected void doAfterSave() {
indexer.index();
protected void doAfterSave(Iterable<DefaultIssue> issues) {
indexer.index(issues);
}

protected ComponentDto component(DbSession session, DefaultIssue issue) {

+ 11
- 24
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexer.java View File

@@ -28,10 +28,8 @@ import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.server.es.BaseIndexer;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.EsUtils;
@@ -44,20 +42,20 @@ import org.sonar.server.permission.index.NeedAuthorizationIndexer;
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.sonar.server.issue.index.IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID;
import static org.sonar.server.issue.index.IssueIndexDefinition.FIELD_ISSUE_TECHNICAL_UPDATED_AT;
import static org.sonar.server.issue.index.IssueIndexDefinition.INDEX_TYPE_ISSUE;

public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer {
public class IssueIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer {

private static final String DELETE_ERROR_MESSAGE = "Fail to delete some issues of project [%s]";
private static final int MAX_BATCH_SIZE = 1000;
private static final AuthorizationScope AUTHORIZATION_SCOPE = new AuthorizationScope(INDEX_TYPE_ISSUE, project -> Qualifiers.PROJECT.equals(project.getQualifier()));

private final DbClient dbClient;
private final EsClient esClient;

public IssueIndexer(System2 system2, DbClient dbClient, EsClient esClient) {
super(system2, esClient, 300, INDEX_TYPE_ISSUE, FIELD_ISSUE_TECHNICAL_UPDATED_AT);
public IssueIndexer(DbClient dbClient, EsClient esClient) {
this.dbClient = dbClient;
this.esClient = esClient;
}

@Override
@@ -65,11 +63,6 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut
return AUTHORIZATION_SCOPE;
}

@Override
protected long doIndex(long lastUpdatedAt) {
return doIndex(createBulkIndexer(false), lastUpdatedAt, null);
}

@Override
public Set<IndexTypeId> getIndexTypes() {
return ImmutableSet.of(INDEX_TYPE_ISSUE);
@@ -77,11 +70,11 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut

@Override
public void indexOnStartup() {
index();
doIndex(createBulkIndexer(true), (String) null);
}

public void indexAll() {
doIndex(createBulkIndexer(true), 0L, null);
doIndex(createBulkIndexer(false), (String) null);
}

@Override
@@ -93,7 +86,7 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut
// nothing to do, project key is not used in this index
break;
case NEW_ANALYSIS:
super.index(lastUpdatedAt -> doIndex(createBulkIndexer(false), lastUpdatedAt, projectUuid));
doIndex(createBulkIndexer(false), projectUuid);
break;
default:
// defensive case
@@ -108,27 +101,21 @@ public class IssueIndexer extends BaseIndexer implements ProjectIndexer, NeedAut
doIndex(createBulkIndexer(false), issues);
}

private long doIndex(BulkIndexer bulk, long lastUpdatedAt, @Nullable String projectUuid) {
private void doIndex(BulkIndexer bulk, @Nullable String projectUuid) {
try (DbSession dbSession = dbClient.openSession(false)) {
IssueResultSetIterator rowIt = IssueResultSetIterator.create(dbClient, dbSession, lastUpdatedAt, projectUuid);
long maxDate = doIndex(bulk, rowIt);
IssueResultSetIterator rowIt = IssueResultSetIterator.create(dbClient, dbSession, projectUuid);
doIndex(bulk, rowIt);
rowIt.close();
return maxDate;
}
}

private static long doIndex(BulkIndexer bulk, Iterator<IssueDoc> issues) {
private static void doIndex(BulkIndexer bulk, Iterator<IssueDoc> issues) {
bulk.start();
long maxDate = 0L;
while (issues.hasNext()) {
IssueDoc issue = issues.next();
bulk.add(newIndexRequest(issue));

// it's more efficient to sort programmatically than in SQL on some databases (MySQL for instance)
maxDate = Math.max(maxDate, issue.getTechnicalUpdateDate().getTime());
}
bulk.stop();
return maxDate;
}

@Override

+ 3
- 10
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResultSetIterator.java View File

@@ -88,8 +88,6 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> {
"inner join projects p on p.uuid=i.component_uuid " +
"inner join projects root on root.uuid=i.project_uuid";

private static final String SQL_AFTER_DATE = SQL_ALL + " where i.updated_at>?";

private static final String PROJECT_FILTER = " AND root.uuid=?";

private static final Splitter TAGS_SPLITTER = Splitter.on(',').trimResults().omitEmptyStrings();
@@ -100,18 +98,13 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> {
super(stmt);
}

static IssueResultSetIterator create(DbClient dbClient, DbSession session, long afterDate, @Nullable String projectUuid) {
static IssueResultSetIterator create(DbClient dbClient, DbSession session, @Nullable String projectUuid) {
try {
String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL;
String sql = SQL_ALL;
sql += projectUuid == null ? "" : PROJECT_FILTER;
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql);
int index = 1;
if (afterDate > 0L) {
stmt.setLong(index, afterDate);
index++;
}
if (projectUuid != null) {
stmt.setString(index, projectUuid);
stmt.setString(1, projectUuid);
}
return new IssueResultSetIterator(stmt);
} catch (SQLException e) {

+ 5
- 12
server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java View File

@@ -26,12 +26,10 @@ import java.util.Set;
import javax.annotation.Nullable;
import org.elasticsearch.action.index.IndexRequest;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.measure.ProjectMeasuresIndexerIterator;
import org.sonar.db.measure.ProjectMeasuresIndexerIterator.ProjectMeasures;
import org.sonar.server.es.BaseIndexer;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.IndexTypeId;
@@ -40,18 +38,18 @@ import org.sonar.server.es.StartupIndexer;
import org.sonar.server.permission.index.AuthorizationScope;
import org.sonar.server.permission.index.NeedAuthorizationIndexer;

import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.FIELD_ANALYSED_AT;
import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_TYPE_PROJECT_MEASURES;

public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer {
public class ProjectMeasuresIndexer implements ProjectIndexer, NeedAuthorizationIndexer, StartupIndexer {

private static final AuthorizationScope AUTHORIZATION_SCOPE = new AuthorizationScope(INDEX_TYPE_PROJECT_MEASURES, project -> Qualifiers.PROJECT.equals(project.getQualifier()));

private final DbClient dbClient;
private final EsClient esClient;

public ProjectMeasuresIndexer(System2 system2, DbClient dbClient, EsClient esClient) {
super(system2, esClient, 300, INDEX_TYPE_PROJECT_MEASURES, FIELD_ANALYSED_AT);
public ProjectMeasuresIndexer(DbClient dbClient, EsClient esClient) {
this.dbClient = dbClient;
this.esClient = esClient;
}

@Override
@@ -61,7 +59,7 @@ public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexe

@Override
public void indexOnStartup() {
index();
doIndex(createBulkIndexer(false), (String) null);
}

@Override
@@ -69,11 +67,6 @@ public class ProjectMeasuresIndexer extends BaseIndexer implements ProjectIndexe
return AUTHORIZATION_SCOPE;
}

@Override
protected long doIndex(long lastUpdatedAt) {
return doIndex(createBulkIndexer(false), lastUpdatedAt, null);
}

@Override
public void indexProject(String projectUuid, Cause cause) {
switch (cause) {

+ 23
- 30
server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java View File

@@ -27,6 +27,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
@@ -34,7 +35,6 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.picocontainer.Startable;
import org.sonar.api.utils.DateUtils;
import org.sonar.core.util.stream.Collectors;
@@ -45,9 +45,11 @@ import org.sonar.server.es.EsClient;
import org.sonar.server.es.EsUtils;
import org.sonar.server.es.IndexTypeId;
import org.sonar.server.es.ProjectIndexer;
import org.sonar.server.es.StartupIndexer;

import static com.google.common.base.Preconditions.checkArgument;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.sonar.core.util.stream.Collectors.toSet;

/**
* Manages the synchronization of indexes with authorization settings defined in database:
@@ -56,7 +58,7 @@ import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
* <li>delete project orphans from index</li>
* </ul>
*/
public class PermissionIndexer implements ProjectIndexer, Startable {
public class PermissionIndexer implements ProjectIndexer, Startable, StartupIndexer {

@VisibleForTesting
static final int MAX_BATCH_SIZE = 1000;
@@ -82,32 +84,28 @@ public class PermissionIndexer implements ProjectIndexer, Startable {
this.authorizationScopes = authorizationScopes;
}

public void initializeOnStartup() {
LOG.info("Index authorization");
indexAllIfEmpty();
@Override
public Set<IndexTypeId> getIndexTypes() {
return authorizationScopes.stream()
.map(AuthorizationScope::getIndexType)
.collect(toSet(authorizationScopes.size()));
}

public void indexAllIfEmpty() {
boolean isEmpty = false;
for (AuthorizationScope scope : authorizationScopes) {
isEmpty |= isAuthorizationTypeEmpty(scope.getIndexType());
}

if (isEmpty) {
Future<?> submit = executor.submit(() -> {
authorizationScopes.stream()
.map(AuthorizationScope::getIndexType)
.forEach(this::truncateAuthorizationType);

try (DbSession dbSession = dbClient.openSession(false)) {
index(new PermissionIndexerDao().selectAll(dbClient, dbSession));
}
});
try {
Uninterruptibles.getUninterruptibly(submit);
} catch (ExecutionException e) {
Throwables.propagate(e);
@Override
public void indexOnStartup() {
Future<?> submit = executor.submit(() -> {
authorizationScopes.stream()
.map(AuthorizationScope::getIndexType)
.forEach(this::truncateAuthorizationType);

try (DbSession dbSession = dbClient.openSession(false)) {
index(new PermissionIndexerDao().selectAll(dbClient, dbSession));
}
});
try {
Uninterruptibles.getUninterruptibly(submit);
} catch (ExecutionException e) {
Throwables.propagate(e);
}
}

@@ -143,11 +141,6 @@ public class PermissionIndexer implements ProjectIndexer, Startable {
.get());
}

private boolean isAuthorizationTypeEmpty(IndexTypeId indexType) {
SearchResponse response = esClient.prepareSearch(indexType).setSize(0).get();
return response.getHits().getTotalHits() == 0;
}

private void truncateAuthorizationType(IndexTypeId indexType) {
BulkIndexer.delete(esClient, indexType.getIndex(), esClient.prepareSearch(indexType).setQuery(matchAllQuery()));
}

+ 6
- 18
server/sonar-server/src/main/java/org/sonar/server/source/index/FileSourcesUpdaterHelper.java View File

@@ -20,7 +20,6 @@
package org.sonar.server.source.index;

import com.google.common.base.Joiner;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -33,7 +32,6 @@ import org.sonar.db.DbSession;
public class FileSourcesUpdaterHelper {

private static final String SQL_ALL = "SELECT %s FROM file_sources WHERE data_type='%s' ";
private static final String AFTER_DATE_FILTER = " AND updated_at>?";
private static final String PROJECT_FILTER = " AND project_uuid=?";

private static final String[] FIELDS = {
@@ -48,31 +46,21 @@ public class FileSourcesUpdaterHelper {
// only static stuff
}

public static PreparedStatement preparedStatementToSelectFileSources(DbClient dbClient, DbSession session, String dataType, long afterDate, @Nullable String projectUuid)
public static PreparedStatement preparedStatementToSelectFileSources(DbClient dbClient, DbSession session, String dataType, @Nullable String projectUuid)
throws SQLException {
String sql = createSQL(dataType, afterDate, projectUuid);
String sql = createSQL(dataType, projectUuid);
// rows are big, so they are scrolled once at a time (one row in memory at a time)
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSingleRowSelectStatement(session, sql);
int index = 1;
if (afterDate > 0L) {
stmt.setLong(index, afterDate);
index++;
}
if (projectUuid != null) {
stmt.setString(index, projectUuid);
stmt.setString(1, projectUuid);
}
return stmt;
}

private static String createSQL(String dataType, long afterDate, @Nullable String projectUuid) {
private static String createSQL(String dataType, @Nullable String projectUuid) {
StringBuilder sql = new StringBuilder(String.format(SQL_ALL, FIELDS_ONE_LINE, dataType));
if (afterDate > 0L || projectUuid != null) {
if (afterDate > 0L) {
sql.append(AFTER_DATE_FILTER);
}
if (projectUuid != null) {
sql.append(PROJECT_FILTER);
}
if (projectUuid != null) {
sql.append(PROJECT_FILTER);
}
return sql.toString();
}

+ 9
- 16
server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndexer.java View File

@@ -25,10 +25,8 @@ import java.util.Set;
import javax.annotation.Nullable;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.server.es.BaseIndexer;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.IndexTypeId;
@@ -37,20 +35,20 @@ import org.sonar.server.es.StartupIndexer;
import org.sonar.server.source.index.FileSourcesUpdaterHelper;

import static org.sonar.server.test.index.TestIndexDefinition.FIELD_FILE_UUID;
import static org.sonar.server.test.index.TestIndexDefinition.FIELD_UPDATED_AT;
import static org.sonar.server.test.index.TestIndexDefinition.INDEX_TYPE_TEST;

/**
* Add to Elasticsearch index {@link TestIndexDefinition} the rows of
* db table FILE_SOURCES of type TEST that are not indexed yet
*/
public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupIndexer {
public class TestIndexer implements ProjectIndexer, StartupIndexer {

private final DbClient dbClient;
private final EsClient esClient;

public TestIndexer(System2 system2, DbClient dbClient, EsClient esClient) {
super(system2, esClient, 0L, INDEX_TYPE_TEST, FIELD_UPDATED_AT);
public TestIndexer(DbClient dbClient, EsClient esClient) {
this.dbClient = dbClient;
this.esClient = esClient;
}

@Override
@@ -63,7 +61,7 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI
break;
case NEW_ANALYSIS:
deleteProject(projectUuid);
super.index(lastUpdatedAt -> doIndex(lastUpdatedAt, projectUuid));
doIndex(projectUuid, cause);
break;
default:
// defensive case
@@ -78,7 +76,7 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI

@Override
public void indexOnStartup() {
index();
doIndex(null, Cause.NEW_ANALYSIS);
}

public long index(Iterator<FileSourcesUpdaterHelper.Row> dbRows) {
@@ -86,18 +84,13 @@ public class TestIndexer extends BaseIndexer implements ProjectIndexer, StartupI
return doIndex(bulk, dbRows);
}

@Override
protected long doIndex(long lastUpdatedAt) {
return doIndex(lastUpdatedAt, null);
}

private long doIndex(long lastUpdatedAt, @Nullable String projectUuid) {
private long doIndex(@Nullable String projectUuid, Cause cause) {
final BulkIndexer bulk = new BulkIndexer(esClient, INDEX_TYPE_TEST.getIndex());
bulk.setLarge(lastUpdatedAt == 0L);
bulk.setLarge(cause == Cause.NEW_ANALYSIS);

DbSession dbSession = dbClient.openSession(false);
try {
TestResultSetIterator rowIt = TestResultSetIterator.create(dbClient, dbSession, lastUpdatedAt, projectUuid);
TestResultSetIterator rowIt = TestResultSetIterator.create(dbClient, dbSession, projectUuid);
long maxUpdatedAt = doIndex(bulk, rowIt);
rowIt.close();
return maxUpdatedAt;

+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/test/index/TestResultSetIterator.java View File

@@ -66,9 +66,9 @@ public class TestResultSetIterator extends ResultSetIterator<Row> {
super(stmt);
}

public static TestResultSetIterator create(DbClient dbClient, DbSession session, long afterDate, @Nullable String projectUuid) {
public static TestResultSetIterator create(DbClient dbClient, DbSession session, @Nullable String projectUuid) {
try {
return new TestResultSetIterator(FileSourcesUpdaterHelper.preparedStatementToSelectFileSources(dbClient, session, FileSourceDto.Type.TEST, afterDate, projectUuid));
return new TestResultSetIterator(FileSourcesUpdaterHelper.preparedStatementToSelectFileSources(dbClient, session, FileSourceDto.Type.TEST, projectUuid));
} catch (SQLException e) {
throw new IllegalStateException("Fail to prepare SQL request to select all tests", e);
}

+ 8
- 11
server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java View File

@@ -23,10 +23,8 @@ import com.google.common.collect.ImmutableSet;
import java.util.Iterator;
import java.util.Set;
import org.elasticsearch.action.index.IndexRequest;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.server.es.BaseIndexer;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.IndexTypeId;
@@ -34,13 +32,14 @@ import org.sonar.server.es.StartupIndexer;

import static org.sonar.server.user.index.UserIndexDefinition.INDEX_TYPE_USER;

public class UserIndexer extends BaseIndexer implements StartupIndexer {
public class UserIndexer implements StartupIndexer {

private final DbClient dbClient;
private final EsClient esClient;

public UserIndexer(System2 system2, DbClient dbClient, EsClient esClient) {
super(system2, esClient, 300, UserIndexDefinition.INDEX_TYPE_USER, UserIndexDefinition.FIELD_UPDATED_AT);
public UserIndexer(DbClient dbClient, EsClient esClient) {
this.dbClient = dbClient;
this.esClient = esClient;
}

@Override
@@ -53,17 +52,15 @@ public class UserIndexer extends BaseIndexer implements StartupIndexer {
index();
}

@Override
protected long doIndex(long lastUpdatedAt) {
public void index() {
final BulkIndexer bulk = new BulkIndexer(esClient, UserIndexDefinition.INDEX_TYPE_USER.getIndex());
bulk.setLarge(lastUpdatedAt == 0L);
bulk.setLarge(true);

DbSession dbSession = dbClient.openSession(false);
try {
UserResultSetIterator rowIt = UserResultSetIterator.create(dbClient, dbSession, lastUpdatedAt);
long maxUpdatedAt = doIndex(bulk, rowIt);
UserResultSetIterator rowIt = UserResultSetIterator.create(dbClient, dbSession);
doIndex(bulk, rowIt);
rowIt.close();
return maxUpdatedAt;
} finally {
dbSession.close();
}

+ 2
- 8
server/sonar-server/src/main/java/org/sonar/server/user/index/UserResultSetIterator.java View File

@@ -47,19 +47,13 @@ class UserResultSetIterator extends ResultSetIterator<UserDoc> {

private static final String SQL_ALL = "select " + StringUtils.join(FIELDS, ",") + " from users u ";

private static final String SQL_AFTER_DATE = SQL_ALL + " where u.updated_at>?";

private UserResultSetIterator(PreparedStatement stmt) throws SQLException {
super(stmt);
}

static UserResultSetIterator create(DbClient dbClient, DbSession session, long afterDate) {
static UserResultSetIterator create(DbClient dbClient, DbSession session) {
try {
String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL;
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql);
if (afterDate > 0L) {
stmt.setLong(1, afterDate);
}
PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, SQL_ALL);
return new UserResultSetIterator(stmt);
} catch (SQLException e) {
throw new IllegalStateException("Fail to prepare SQL request to select all users", e);

+ 10
- 31
server/sonar-server/src/main/java/org/sonar/server/view/index/ViewIndexer.java View File

@@ -24,12 +24,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.elasticsearch.action.index.IndexRequest;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.UuidWithProjectUuidDto;
import org.sonar.server.es.BaseIndexer;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
import org.sonar.server.es.IndexTypeId;
@@ -38,13 +36,14 @@ import org.sonar.server.es.StartupIndexer;
import static com.google.common.collect.Maps.newHashMap;
import static org.sonar.server.view.index.ViewIndexDefinition.INDEX_TYPE_VIEW;

public class ViewIndexer extends BaseIndexer implements StartupIndexer {
public class ViewIndexer implements StartupIndexer {

private final DbClient dbClient;
private final EsClient esClient;

public ViewIndexer(System2 system2, DbClient dbClient, EsClient esClient) {
super(system2, esClient, 300, ViewIndexDefinition.INDEX_TYPE_VIEW, "updatedAt");
public ViewIndexer(DbClient dbClient, EsClient esClient) {
this.dbClient = dbClient;
this.esClient = esClient;
}

@Override
@@ -53,34 +52,14 @@ public class ViewIndexer extends BaseIndexer implements StartupIndexer {
}

@Override
public void indexOnStartup() {
index();
}

/**
* Index all views if the index is empty (Only used on startup).
* It's currently not possible to index only data from db that are not existing in the index because we have no way to last when the structure of a view is changed :
* - Either the definition has changed -> No updated at column in the projects table,
* - Either the view is defined by a regex -> A new analysed project automatically steps into the view.
* <p/>
* The views lookup cache will not be cleared
*/
@Override
protected long doIndex(long lastUpdatedAt) {
long count = esClient.prepareCount(ViewIndexDefinition.INDEX_TYPE_VIEW.getIndex()).setTypes(ViewIndexDefinition.INDEX_TYPE_VIEW.getType()).get().getCount();
if (count == 0) {
DbSession dbSession = dbClient.openSession(false);
try {
Map<String, String> viewAndProjectViewUuidMap = newHashMap();
for (UuidWithProjectUuidDto uuidWithProjectUuidDto : dbClient.componentDao().selectAllViewsAndSubViews(dbSession)) {
viewAndProjectViewUuidMap.put(uuidWithProjectUuidDto.getUuid(), uuidWithProjectUuidDto.getProjectUuid());
}
index(dbSession, viewAndProjectViewUuidMap, false);
} finally {
dbSession.close();
public void indexOnStartup(Set<IndexType> emptyIndexTypes) {
try (DbSession dbSession = dbClient.openSession(false)) {
Map<String, String> viewAndProjectViewUuidMap = newHashMap();
for (UuidWithProjectUuidDto uuidWithProjectUuidDto : dbClient.componentDao().selectAllViewsAndSubViews(dbSession)) {
viewAndProjectViewUuidMap.put(uuidWithProjectUuidDto.getUuid(), uuidWithProjectUuidDto.getProjectUuid());
}
index(dbSession, viewAndProjectViewUuidMap, false);
}
return 0L;
}

/**

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java View File

@@ -76,7 +76,7 @@ public class IssuesActionTest {
@Rule
public UserSessionRule userSessionRule = UserSessionRule.standalone();

private IssueIndexer issueIndexer = new IssueIndexer(system2, db.getDbClient(), es.client());
private IssueIndexer issueIndexer = new IssueIndexer(db.getDbClient(), es.client());
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, issueIndexer);
private ServerFileSystem fs = mock(ServerFileSystem.class);
private WsTester tester;

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java View File

@@ -113,7 +113,7 @@ public class SearchProjectsActionTest {
private DbClient dbClient = db.getDbClient();
private DbSession dbSession = db.getSession();

private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, new ProjectMeasuresIndexer(System2.INSTANCE, dbClient, es.client()));
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, new ProjectMeasuresIndexer(dbClient, es.client()));
private ProjectMeasuresIndex index = new ProjectMeasuresIndex(es.client(), new AuthorizationTypeSupport(userSession));
private ProjectMeasuresQueryValidator queryValidator = new ProjectMeasuresQueryValidator(dbClient);


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/IssueUpdaterTest.java View File

@@ -76,7 +76,7 @@ public class IssueUpdaterTest {
private ArgumentCaptor<IssueChangeNotification> notificationArgumentCaptor = ArgumentCaptor.forClass(IssueChangeNotification.class);

private IssueUpdater underTest = new IssueUpdater(dbClient,
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())),
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())),
notificationManager);

@Test

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java View File

@@ -66,7 +66,7 @@ public class IssueIndexDebtTest {

private System2 system2 = System2.INSTANCE;
private IssueIndex index;
private IssueIndexer issueIndexer = new IssueIndexer(system2, null, tester.client());
private IssueIndexer issueIndexer = new IssueIndexer(null, tester.client());
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer);

@Before

+ 2
- 2
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java View File

@@ -85,8 +85,8 @@ public class IssueIndexTest {
public ExpectedException expectedException = ExpectedException.none();

private IssueIndex underTest;
private IssueIndexer issueIndexer = new IssueIndexer(system2, null, tester.client());
private ViewIndexer viewIndexer = new ViewIndexer(system2, null, tester.client());
private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null));
private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client());
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer);

@Before

+ 5
- 5
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexerTest.java View File

@@ -52,12 +52,12 @@ public class IssueIndexerTest {
@Rule
public DbTester dbTester = DbTester.create(system2);

private IssueIndexer underTest = new IssueIndexer(system2, dbTester.getDbClient(), esTester.client());
private IssueIndexer underTest = new IssueIndexer(dbTester.getDbClient(), esTester.client());

@Test
public void index_on_startup() {
IssueIndexer indexer = spy(underTest);
doNothing().when(indexer).index();
doNothing().when(indexer).indexOnStartup();
indexer.indexOnStartup();
verify(indexer).indexOnStartup();
}
@@ -73,7 +73,7 @@ public class IssueIndexerTest {
public void index_all_issues() {
dbTester.prepareDbUnit(getClass(), "index.xml");

underTest.index();
underTest.indexOnStartup();

List<IssueDoc> docs = esTester.getDocuments(IssueIndexDefinition.INDEX_TYPE_ISSUE, IssueDoc.class);
assertThat(docs).hasSize(1);
@@ -125,7 +125,7 @@ public class IssueIndexerTest {
public void deleteProject_deletes_issues_of_a_specific_project() {
dbTester.prepareDbUnit(getClass(), "index.xml");

underTest.index();
underTest.indexOnStartup();

assertThat(esTester.countDocuments("issues", "issue")).isEqualTo(1);

@@ -187,7 +187,7 @@ public class IssueIndexerTest {
issueDoc.setKey("key");
issueDoc.setTechnicalUpdateDate(new Date());
issueDoc.setProjectUuid("non-exitsing-parent");
new IssueIndexer(system2, dbTester.getDbClient(), esTester.client())
new IssueIndexer(dbTester.getDbClient(), esTester.client())
.index(Arrays.asList(issueDoc).iterator());

assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX_TYPE_ISSUE)).isEqualTo(1L);

+ 5
- 28
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueResultSetIteratorTest.java View File

@@ -39,7 +39,7 @@ public class IssueResultSetIteratorTest {
@Test
public void iterator_over_one_issue() {
dbTester.prepareDbUnit(getClass(), "one_issue.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

@@ -72,7 +72,7 @@ public class IssueResultSetIteratorTest {
@Test
public void iterator_over_issues() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

@@ -134,27 +134,17 @@ public class IssueResultSetIteratorTest {
@Test
public void iterator_over_issue_from_project() {
dbTester.prepareDbUnit(getClass(), "many_projects.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, "THE_PROJECT_1");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), "THE_PROJECT_1");
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

assertThat(issuesByKey).hasSize(2);
}

@Test
public void iterator_over_issue_from_project_and_date() {
dbTester.prepareDbUnit(getClass(), "many_projects.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_600_000_000_000L, "THE_PROJECT_1");
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

assertThat(issuesByKey).hasSize(1);
}

@Test
public void extract_directory_path() {
dbTester.prepareDbUnit(getClass(), "extract_directory_path.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

@@ -176,7 +166,7 @@ public class IssueResultSetIteratorTest {
@Test
public void extract_file_path() {
dbTester.prepareDbUnit(getClass(), "extract_file_path.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);
Map<String, IssueDoc> issuesByKey = issuesByKey(it);
it.close();

@@ -195,19 +185,6 @@ public class IssueResultSetIteratorTest {
assertThat(issuesByKey.get("FGH").filePath()).isNull();
}

@Test
public void select_after_date() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
IssueResultSetIterator it = IssueResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_420_000_000_000L, null);

assertThat(it.hasNext()).isTrue();
IssueDoc issue = it.next();
assertThat(issue.key()).isEqualTo("DEF");

assertThat(it.hasNext()).isFalse();
it.close();
}

private static Map<String, IssueDoc> issuesByKey(IssueResultSetIterator it) {
return Maps.uniqueIndex(it, new Function<IssueDoc, String>() {
@Override

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/ws/AddCommentActionTest.java View File

@@ -86,7 +86,7 @@ public class AddCommentActionTest {
private IssueDbTester issueDbTester = new IssueDbTester(dbTester);

private IssueUpdater issueUpdater = new IssueUpdater(dbClient,
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class));
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class));
private OperationResponseWriter responseWriter = mock(OperationResponseWriter.class);

private WsActionTester tester = new WsActionTester(

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java View File

@@ -105,7 +105,7 @@ public class BulkChangeActionTest {

private IssueFieldsSetter issueFieldsSetter = new IssueFieldsSetter();
private IssueWorkflow issueWorkflow = new IssueWorkflow(new FunctionExecutor(issueFieldsSetter), issueFieldsSetter);
private IssueStorage issueStorage = new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, es.client()));
private IssueStorage issueStorage = new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, es.client()));
private NotificationManager notificationManager = mock(NotificationManager.class);
private List<Action> actions = new ArrayList<>();


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java View File

@@ -97,7 +97,7 @@ public class DoTransitionActionTest {
private TransitionService transitionService = new TransitionService(userSession, workflow);
private OperationResponseWriter responseWriter = mock(OperationResponseWriter.class);
private IssueUpdater issueUpdater = new IssueUpdater(dbClient,
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class));
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class));

private WsAction underTest = new DoTransitionAction(dbClient, userSession, new IssueFinder(dbClient, userSession), issueUpdater, transitionService, responseWriter);
private WsActionTester tester = new WsActionTester(underTest);

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java View File

@@ -90,7 +90,7 @@ public class SetSeverityActionTest {

private WsActionTester tester = new WsActionTester(new SetSeverityAction(userSession, dbClient, new IssueFinder(dbClient, userSession), new IssueFieldsSetter(),
new IssueUpdater(dbClient,
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)),
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)),
responseWriter));

@Test

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java View File

@@ -90,7 +90,7 @@ public class SetTypeActionTest {

private WsActionTester tester = new WsActionTester(new SetTypeAction(userSession, dbClient, new IssueFinder(dbClient, userSession), new IssueFieldsSetter(),
new IssueUpdater(dbClient,
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(system2, dbClient, esTester.client())), mock(NotificationManager.class)),
new ServerIssueStorage(system2, new DefaultRuleFinder(dbClient), dbClient, new IssueIndexer(dbClient, esTester.client())), mock(NotificationManager.class)),
responseWriter));

@Test

+ 2
- 3
server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java View File

@@ -29,12 +29,12 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.MapSettings;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.System2;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.organization.OrganizationTesting;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.component.ws.FilterParser.Operator;
import org.sonar.server.es.EsTester;
import org.sonar.server.es.Facets;
import org.sonar.server.es.SearchIdResult;
@@ -57,7 +57,6 @@ import static org.sonar.api.measures.Metric.Level.WARN;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
import static org.sonar.db.user.GroupTesting.newGroupDto;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.component.ws.FilterParser.Operator;
import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_TYPE_PROJECT_MEASURES;

public class ProjectMeasuresIndexTest {
@@ -85,7 +84,7 @@ public class ProjectMeasuresIndexTest {
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();

private ProjectMeasuresIndexer projectMeasureIndexer = new ProjectMeasuresIndexer(System2.INSTANCE, null, es.client());
private ProjectMeasuresIndexer projectMeasureIndexer = new ProjectMeasuresIndexer(null, es.client());
private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, projectMeasureIndexer);
private ProjectMeasuresIndex underTest = new ProjectMeasuresIndex(es.client(), new AuthorizationTypeSupport(userSession));


+ 7
- 7
server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java View File

@@ -54,19 +54,19 @@ public class ProjectMeasuresIndexerTest {
public DbTester dbTester = DbTester.create(system2);

private ComponentDbTester componentDbTester = new ComponentDbTester(dbTester);
private ProjectMeasuresIndexer underTest = new ProjectMeasuresIndexer(system2, dbTester.getDbClient(), esTester.client());
private ProjectMeasuresIndexer underTest = new ProjectMeasuresIndexer(dbTester.getDbClient(), esTester.client());

@Test
public void index_on_startup() {
ProjectMeasuresIndexer indexer = spy(underTest);
doNothing().when(indexer).index();
doNothing().when(indexer).indexOnStartup();
indexer.indexOnStartup();
verify(indexer).indexOnStartup();
}

@Test
public void index_nothing() {
underTest.index();
underTest.indexOnStartup();

assertThat(esTester.countDocuments(INDEX_TYPE_PROJECT_MEASURES)).isZero();
}
@@ -78,7 +78,7 @@ public class ProjectMeasuresIndexerTest {
componentDbTester.insertProjectAndSnapshot(newProjectDto(organizationDto));
componentDbTester.insertProjectAndSnapshot(newProjectDto(organizationDto));

underTest.index();
underTest.indexOnStartup();

assertThat(esTester.countDocuments(INDEX_TYPE_PROJECT_MEASURES)).isEqualTo(3);
}
@@ -90,7 +90,7 @@ public class ProjectMeasuresIndexerTest {
public void index_provisioned_projects() {
ComponentDto project = componentDbTester.insertProject();

underTest.index();
underTest.indexOnStartup();

assertThat(esTester.getIds(INDEX_TYPE_PROJECT_MEASURES)).containsOnly(project.uuid());
}
@@ -159,7 +159,7 @@ public class ProjectMeasuresIndexerTest {
componentDbTester.insertProjectAndSnapshot(project2);
ComponentDto project3 = newProjectDto(organizationDto);
componentDbTester.insertProjectAndSnapshot(project3);
underTest.index();
underTest.indexOnStartup();

underTest.deleteProject(project1.uuid());

@@ -170,7 +170,7 @@ public class ProjectMeasuresIndexerTest {
public void does_nothing_when_deleting_unknown_project() throws Exception {
ComponentDto project = newProjectDto(dbTester.organizations().insert());
componentDbTester.insertProjectAndSnapshot(project);
underTest.index();
underTest.indexOnStartup();

underTest.deleteProject("UNKNOWN");


+ 15
- 24
server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java View File

@@ -40,7 +40,6 @@ import org.sonar.server.tester.UserSessionRule;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.api.web.UserRole.ADMIN;
import static org.sonar.api.web.UserRole.USER;
import static org.sonar.server.permission.index.FooIndexDefinition.FOO_INDEX;

public class PermissionIndexerTest {

@@ -76,22 +75,14 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_does_nothing_if_no_data() {
underTest.indexAllIfEmpty();

assertThat(esTester.countDocuments(FOO_INDEX, "authorization")).isZero();
assertThat(fooIndex.hasAccessToProject("a_project")).isFalse();
}

@Test
public void indexAllIfEmpty_grants_access_to_user() {
public void initializeOnStartup_grants_access_to_user() {
ComponentDto project = createAndIndexProject();
UserDto user1 = userDbTester.insertUser();
UserDto user2 = userDbTester.insertUser();
userDbTester.insertProjectPermissionOnUser(user1, USER, project);
userDbTester.insertProjectPermissionOnUser(user2, ADMIN, project);

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

// anonymous
verifyAnyoneNotAuthorized(project);
@@ -104,7 +95,7 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_grants_access_to_group() {
public void initializeOnStartup_grants_access_to_group() {
ComponentDto project = createAndIndexProject();
UserDto user1 = userDbTester.insertUser();
UserDto user2 = userDbTester.insertUser();
@@ -114,7 +105,7 @@ public class PermissionIndexerTest {
userDbTester.insertProjectPermissionOnGroup(group1, USER, project);
userDbTester.insertProjectPermissionOnGroup(group2, ADMIN, project);

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

// anonymous
verifyAnyoneNotAuthorized(project);
@@ -130,7 +121,7 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_grants_access_to_user_and_group() {
public void initializeOnStartup_grants_access_to_user_and_group() {
ComponentDto project = createAndIndexProject();
UserDto user1 = userDbTester.insertUser();
UserDto user2 = userDbTester.insertUser();
@@ -139,7 +130,7 @@ public class PermissionIndexerTest {
userDbTester.insertProjectPermissionOnUser(user1, USER, project);
userDbTester.insertProjectPermissionOnGroup(group, USER, project);

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

// anonymous
verifyAnyoneNotAuthorized(project);
@@ -155,12 +146,12 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_does_not_grant_access_to_anybody() {
public void initializeOnStartup_does_not_grant_access_to_anybody() {
ComponentDto project = createAndIndexProject();
UserDto user = userDbTester.insertUser();
GroupDto group = userDbTester.insertGroup();

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

verifyAnyoneNotAuthorized(project);
verifyNotAuthorized(project, user);
@@ -168,13 +159,13 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_grants_access_to_anyone() {
public void initializeOnStartup_grants_access_to_anyone() {
ComponentDto project = createAndIndexProject();
UserDto user = userDbTester.insertUser();
GroupDto group = userDbTester.insertGroup();
userDbTester.insertProjectPermissionOnAnyone(USER, project);

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

verifyAnyoneAuthorized(project);
verifyAuthorized(project, user);
@@ -182,7 +173,7 @@ public class PermissionIndexerTest {
}

@Test
public void indexAllIfEmpty_grants_access_on_many_projects() {
public void initializeOnStartup_grants_access_on_many_projects() {
UserDto user1 = userDbTester.insertUser();
UserDto user2 = userDbTester.insertUser();
ComponentDto project = null;
@@ -191,7 +182,7 @@ public class PermissionIndexerTest {
userDbTester.insertProjectPermissionOnUser(user1, USER, project);
}

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

verifyAnyoneNotAuthorized(project);
verifyAuthorized(project, user1);
@@ -204,7 +195,7 @@ public class PermissionIndexerTest {
ComponentDto project2 = createAndIndexProject();
userDbTester.insertProjectPermissionOnAnyone(USER, project1);
userDbTester.insertProjectPermissionOnAnyone(USER, project2);
underTest.indexAllIfEmpty();
underTest.indexOnStartup();
assertThat(esTester.countDocuments(INDEX_TYPE_FOO_AUTH)).isEqualTo(2);

underTest.deleteProject(project1.uuid());
@@ -228,7 +219,7 @@ public class PermissionIndexerTest {
ComponentDto project = createAndIndexProject();
UserDto user1 = userDbTester.insertUser();

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

verifyAnyoneNotAuthorized(project);
verifyNotAuthorized(project, user1);
@@ -242,7 +233,7 @@ public class PermissionIndexerTest {
userDbTester.insertProjectPermissionOnAnyone(USER, projectOnOrg1);
userDbTester.insertProjectPermissionOnUser(user, USER, projectOnOrg2);

underTest.indexAllIfEmpty();
underTest.indexOnStartup();

verifyAnyoneAuthorized(projectOnOrg1);
verifyAnyoneNotAuthorized(projectOnOrg2);

+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java View File

@@ -58,13 +58,13 @@ import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester;
import org.sonar.test.JsonAssert;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.QualityProfiles.CreateWsResponse;
import org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.sonar.server.language.LanguageTesting.newLanguages;
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse;
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse.QualityProfile;
import static org.sonar.server.language.LanguageTesting.newLanguages;
import static org.sonarqube.ws.QualityProfiles.CreateWsResponse.parseFrom;

public class CreateActionTest {

+ 0
- 16
server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleResultSetIteratorTest.java View File

@@ -105,22 +105,6 @@ public class RuleResultSetIteratorTest {
assertThat(rule.updatedAt()).isEqualTo(1600000000000L);
}

@Test
public void select_after_date() {
dbClient.ruleDao().insert(dbSession, templateRule);
dbClient.ruleDao().insert(dbSession, customRule);
dbSession.commit();

RuleResultSetIterator it = RuleResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1_900_000_000_000L);

assertThat(it.hasNext()).isTrue();
RuleDoc issue = it.next();
assertThat(issue.key()).isEqualTo(RuleKey.of("xoo", "S002"));

assertThat(it.hasNext()).isFalse();
it.close();
}

@Test
public void iterator_over_rules() {
dbClient.ruleDao().insert(dbSession, templateRule);

+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/test/index/TestIndexerTest.java View File

@@ -67,12 +67,12 @@ public class TestIndexerTest {
@Rule
public DbTester db = DbTester.create(system2);

private TestIndexer underTest = new TestIndexer(system2, db.getDbClient(), es.client());
private TestIndexer underTest = new TestIndexer(db.getDbClient(), es.client());

@Test
public void index_on_startup() {
TestIndexer indexer = spy(underTest);
doNothing().when(indexer).index();
doNothing().when(indexer).indexOnStartup();
indexer.indexOnStartup();
verify(indexer).indexOnStartup();
}
@@ -82,7 +82,7 @@ public class TestIndexerTest {
db.prepareDbUnit(getClass(), "db.xml");
TestTesting.updateDataColumn(db.getSession(), "FILE_UUID", TestTesting.newRandomTests(3));

underTest.index();
underTest.indexOnStartup();

assertThat(countDocuments()).isEqualTo(3);
}

+ 5
- 28
server/sonar-server/src/test/java/org/sonar/server/test/index/TestResultSetIteratorTest.java View File

@@ -90,7 +90,7 @@ public class TestResultSetIteratorTest {
public void traverse_db() throws Exception {
dbTester.prepareDbUnit(getClass(), "shared.xml");
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(3));
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);

FileSourcesUpdaterHelper.Row row = underTest.next();
assertThat(row.getProjectUuid()).isEqualTo("P1");
@@ -123,7 +123,7 @@ public class TestResultSetIteratorTest {
.setName("N1")
.build());
TestTesting.updateDataColumn(dbTester.getSession(), "F1", tests);
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);

FileSourcesUpdaterHelper.Row row = underTest.next();

@@ -148,20 +148,12 @@ public class TestResultSetIteratorTest {
FIELD_COVERED_FILES);
}

@Test
public void filter_by_date() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 2000000000000L, null);

assertThat(underTest.hasNext()).isFalse();
}

@Test
public void filter_by_project() throws Exception {
dbTester.prepareDbUnit(getClass(), "filter_by_project.xml");
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(1));

underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, "P1");
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), "P1");

FileSourcesUpdaterHelper.Row row = underTest.next();
assertThat(row.getProjectUuid()).isEqualTo("P1");
@@ -171,28 +163,13 @@ public class TestResultSetIteratorTest {
assertThat(underTest.hasNext()).isFalse();
}

@Test
public void filter_by_project_and_date() throws Exception {
dbTester.prepareDbUnit(getClass(), "filter_by_project_and_date.xml");
TestTesting.updateDataColumn(dbTester.getSession(), "F1", newFakeTests(1));

underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1400000000000L, "P1");

FileSourcesUpdaterHelper.Row row = underTest.next();
assertThat(row.getProjectUuid()).isEqualTo("P1");
assertThat(row.getFileUuid()).isEqualTo("F1");

// File F2 is not returned
assertThat(underTest.hasNext()).isFalse();
}

@Test
public void read_does_not_fail_if_corrupted_data() throws Exception {
dbTester.prepareDbUnit(getClass(), "shared.xml");

TestTesting.updateDataColumn(dbTester.getSession(), "F1", "THIS_IS_NOT_PROTOBUF".getBytes());

underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);
FileSourcesUpdaterHelper.Row row = underTest.next();
assertThat(row.getFileUuid()).isEqualTo("F1");
assertThat(row.getUpdateRequests()).isEmpty();
@@ -206,7 +183,7 @@ public class TestResultSetIteratorTest {
dbTester.prepareDbUnit(getClass(), "shared.xml");
TestTesting.updateDataColumn(dbTester.getSession(), "F1", (byte[])null);

underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L, null);
underTest = TestResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), null);

FileSourcesUpdaterHelper.Row row = underTest.next();
assertThat(row.getFileUuid()).isEqualTo("F1");

+ 2
- 3
server/sonar-server/src/test/java/org/sonar/server/test/ws/ListActionTest.java View File

@@ -26,7 +26,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.config.MapSettings;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -76,7 +75,7 @@ public class ListActionTest {
private DbClient dbClient = db.getDbClient();

private TestIndex testIndex = new TestIndex(es.client());
private TestIndexer testIndexer = new TestIndexer(System2.INSTANCE, db.getDbClient(), es.client());
private TestIndexer testIndexer = new TestIndexer(db.getDbClient(), es.client());

private ComponentDto project;
private ComponentDto mainFile;
@@ -286,7 +285,7 @@ public class ListActionTest {
.setFileUuid(testFile.uuid())
.setTestData(asList(tests)));
db.commit();
testIndexer.index();
testIndexer.indexOnStartup();
}

private static ListResponse call(TestRequest request) {

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterTest.java View File

@@ -86,7 +86,7 @@ public class UserUpdaterTest {
private ArgumentCaptor<NewUserHandler.Context> newUserHandler = ArgumentCaptor.forClass(NewUserHandler.Context.class);
private Settings settings = new MapSettings();
private DbSession session = db.getSession();
private UserIndexer userIndexer = new UserIndexer(system2, dbClient, es.client());
private UserIndexer userIndexer = new UserIndexer(dbClient, es.client());
private OrganizationCreation organizationCreation = mock(OrganizationCreation.class);
private UserUpdater underTest = new UserUpdater(newUserNotifier, settings, dbClient, userIndexer, system2, TestDefaultOrganizationProvider.from(db), organizationCreation);


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/index/UserIndexerTest.java View File

@@ -77,6 +77,6 @@ public class UserIndexerTest {
}

private UserIndexer createIndexer() {
return new UserIndexer(system2, dbTester.getDbClient(), esTester.client());
return new UserIndexer(dbTester.getDbClient(), esTester.client());
}
}

+ 1
- 14
server/sonar-server/src/test/java/org/sonar/server/user/index/UserResultSetIteratorTest.java View File

@@ -37,7 +37,7 @@ public class UserResultSetIteratorTest {
@Test
public void iterator_over_users() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 0L);
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession());
Map<String, UserDoc> usersByLogin = Maps.uniqueIndex(it, new Function<UserDoc, String>() {
@Override
public String apply(UserDoc user) {
@@ -72,17 +72,4 @@ public class UserResultSetIteratorTest {
assertThat(user3.createdAt()).isEqualTo(1500000000000L);
assertThat(user3.updatedAt()).isEqualTo(1550000000000L);
}

@Test
public void select_after_date() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
UserResultSetIterator it = UserResultSetIterator.create(dbTester.getDbClient(), dbTester.getSession(), 1520000000000L);

assertThat(it.hasNext()).isTrue();
UserDoc user = it.next();
assertThat(user.login()).isEqualTo("user3");

assertThat(it.hasNext()).isFalse();
it.close();
}
}

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/ws/ChangePasswordActionTest.java View File

@@ -57,7 +57,7 @@ public class ChangePasswordActionTest {
public UserSessionRule userSessionRule = UserSessionRule.standalone().logIn();

private UserUpdater userUpdater = new UserUpdater(mock(NewUserNotifier.class), new MapSettings(), db.getDbClient(),
new UserIndexer(System2.INSTANCE, db.getDbClient(), esTester.client()),
new UserIndexer(db.getDbClient(), esTester.client()),
System2.INSTANCE,
TestDefaultOrganizationProvider.from(db),
mock(OrganizationCreation.class));

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java View File

@@ -75,7 +75,7 @@ public class CreateActionTest {
public ExpectedException expectedException = ExpectedException.none();

private UserIndex index = new UserIndex(esTester.client());
private UserIndexer userIndexer = new UserIndexer(system2, db.getDbClient(), esTester.client());
private UserIndexer userIndexer = new UserIndexer(db.getDbClient(), esTester.client());
private GroupDto defaultGroupInDefaultOrg;
private OrganizationCreation organizationCreation = mock(OrganizationCreation.class);


+ 2
- 2
server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java View File

@@ -81,9 +81,9 @@ public class DeactivateActionTest {

@Before
public void setUp() {
userIndexer = new UserIndexer(system2, dbClient, esTester.client());
userIndexer = new UserIndexer(dbClient, esTester.client());
index = new UserIndex(esTester.client());
userIndexer = new UserIndexer(system2, dbClient, esTester.client());
userIndexer = new UserIndexer(dbClient, esTester.client());
ws = new WsActionTester(new DeactivateAction(
dbClient, userIndexer, userSession, new UserJsonWriter(userSession), defaultOrganizationProvider));
}

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java View File

@@ -66,7 +66,7 @@ public class SearchActionTest {
private DbClient dbClient = db.getDbClient();
private DbSession dbSession = db.getSession();
private UserIndex index = new UserIndex(esTester.client());
private UserIndexer userIndexer = new UserIndexer(system2, dbClient, esTester.client());
private UserIndexer userIndexer = new UserIndexer(dbClient, esTester.client());
private WsTester ws = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession))));

@Test

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java View File

@@ -74,7 +74,7 @@ public class UpdateActionTest {
dbClient.groupDao().insert(session, newGroupDto().setName("sonar-users"));
session.commit();

userIndexer = new UserIndexer(system2, dbClient, esTester.client());
userIndexer = new UserIndexer(dbClient, esTester.client());
tester = new WsTester(new UsersWs(new UpdateAction(
new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, defaultOrganizationProvider, ORGANIZATION_CREATION_NOT_USED_FOR_UPDATE),
userSessionRule,

+ 7
- 7
server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java View File

@@ -71,21 +71,21 @@ public class ViewIndexerTest {

private DbClient dbClient = dbTester.getDbClient();
private DbSession dbSession = dbTester.getSession();
private IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client());
private IssueIndexer issueIndexer = new IssueIndexer(dbClient, esTester.client());
private PermissionIndexer permissionIndexer = new PermissionIndexer(dbClient, esTester.client(), issueIndexer);
private ViewIndexer underTest = new ViewIndexer(system2, dbClient, esTester.client());
private ViewIndexer underTest = new ViewIndexer(dbClient, esTester.client());

@Test
public void index_on_startup() {
ViewIndexer indexer = spy(underTest);
doNothing().when(indexer).index();
doNothing().when(indexer).indexOnStartup();
indexer.indexOnStartup();
verify(indexer).indexOnStartup();
}

@Test
public void index_nothing() {
underTest.index();
underTest.indexOnStartup();
assertThat(esTester.countDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW)).isEqualTo(0L);
}

@@ -93,7 +93,7 @@ public class ViewIndexerTest {
public void index() {
dbTester.prepareDbUnit(getClass(), "index.xml");

underTest.index();
underTest.indexOnStartup();

List<ViewDoc> docs = esTester.getDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW, ViewDoc.class);
assertThat(docs).hasSize(4);
@@ -113,7 +113,7 @@ public class ViewIndexerTest {
esTester.putDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW,
new ViewDoc().setUuid("ABCD").setProjects(newArrayList("BCDE")));

underTest.index();
underTest.indexOnStartup();

// ... But they shouldn't be indexed
assertThat(esTester.countDocuments(ViewIndexDefinition.INDEX_TYPE_VIEW)).isEqualTo(1L);
@@ -149,7 +149,7 @@ public class ViewIndexerTest {
@Test
public void clear_views_lookup_cache_on_index_view_uuid() {
IssueIndex issueIndex = new IssueIndex(esTester.client(), System2.INSTANCE, userSessionRule, new AuthorizationTypeSupport(userSessionRule));
IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client());
IssueIndexer issueIndexer = new IssueIndexer(dbClient, esTester.client());

String viewUuid = "ABCD";


Loading…
Cancel
Save