diff --git a/Documentation/prolog-cookbook.txt b/Documentation/prolog-cookbook.txt index 386e2d6722..4e3c428d3c 100644 --- a/Documentation/prolog-cookbook.txt +++ b/Documentation/prolog-cookbook.txt @@ -901,7 +901,10 @@ add_category_min_score(In, Category, Min, P) :- findall(X, gerrit:commit_label(label(Category,X),R),Z), sum_list(Z, Sum), Sum >= Min, !, - P = [label(Category,ok(R)) | In]. + gerrit:commit_label(label(Category, V), U), + V >= 1, + !, + P = [label(Category,ok(U)) | In]. add_category_min_score(In, Category,Min,P) :- P = [label(Category,need(Min)) | In]. diff --git a/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java b/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java index 5a9c6ac343..76fdfea6d2 100644 --- a/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java +++ b/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java @@ -14,28 +14,15 @@ package com.google.gerrit.elasticsearch; -import static com.google.common.base.Preconditions.checkArgument; - -import com.google.gerrit.index.IndexConfig; -import com.google.gerrit.index.Schema; import com.google.gerrit.index.project.ProjectIndex; -import com.google.gerrit.lifecycle.LifecycleModule; -import com.google.gerrit.server.config.GerritServerConfig; -import com.google.gerrit.server.index.IndexModule; -import com.google.gerrit.server.index.OnlineUpgrader; -import com.google.gerrit.server.index.SingleVersionModule; +import com.google.gerrit.server.index.AbstractIndexModule; import com.google.gerrit.server.index.VersionManager; import com.google.gerrit.server.index.account.AccountIndex; import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.group.GroupIndex; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; -import com.google.inject.Singleton; -import com.google.inject.assistedinject.FactoryModuleBuilder; import java.util.Map; -import org.eclipse.jgit.lib.Config; -public class ElasticIndexModule extends AbstractModule { +public class ElasticIndexModule extends AbstractIndexModule { public static ElasticIndexModule singleVersionWithExplicitVersions( Map versions, int threads, boolean slave) { return new ElasticIndexModule(versions, threads, false, slave); @@ -49,74 +36,33 @@ public class ElasticIndexModule extends AbstractModule { return new ElasticIndexModule(null, 0, false, slave); } - private final Map singleVersions; - private final int threads; - private final boolean onlineUpgrade; - private final boolean slave; - private ElasticIndexModule( Map singleVersions, int threads, boolean onlineUpgrade, boolean slave) { - if (singleVersions != null) { - checkArgument(!onlineUpgrade, "online upgrade is incompatible with single version map"); - } - this.singleVersions = singleVersions; - this.threads = threads; - this.onlineUpgrade = onlineUpgrade; - this.slave = slave; + super(singleVersions, threads, onlineUpgrade, slave); } @Override - protected void configure() { - if (slave) { - bind(AccountIndex.Factory.class).toInstance(ElasticIndexModule::createDummyIndexFactory); - bind(ChangeIndex.Factory.class).toInstance(ElasticIndexModule::createDummyIndexFactory); - bind(ProjectIndex.Factory.class).toInstance(ElasticIndexModule::createDummyIndexFactory); - } else { - install( - new FactoryModuleBuilder() - .implement(AccountIndex.class, ElasticAccountIndex.class) - .build(AccountIndex.Factory.class)); - install( - new FactoryModuleBuilder() - .implement(ChangeIndex.class, ElasticChangeIndex.class) - .build(ChangeIndex.Factory.class)); - install( - new FactoryModuleBuilder() - .implement(ProjectIndex.class, ElasticProjectIndex.class) - .build(ProjectIndex.Factory.class)); - } - install( - new FactoryModuleBuilder() - .implement(GroupIndex.class, ElasticGroupIndex.class) - .build(GroupIndex.Factory.class)); - - install(new IndexModule(threads, slave)); - if (singleVersions == null) { - install(new MultiVersionModule()); - } else { - install(new SingleVersionModule(singleVersions)); - } + protected Class getAccountIndex() { + return ElasticAccountIndex.class; } - @SuppressWarnings("unused") - private static T createDummyIndexFactory(Schema schema) { - throw new UnsupportedOperationException(); + @Override + protected Class getChangeIndex() { + return ElasticChangeIndex.class; } - @Provides - @Singleton - IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { - return IndexConfig.fromConfig(cfg).separateChangeSubIndexes(true).build(); + @Override + protected Class getGroupIndex() { + return ElasticGroupIndex.class; } - private class MultiVersionModule extends LifecycleModule { - @Override - public void configure() { - bind(VersionManager.class).to(ElasticVersionManager.class); - listener().to(ElasticVersionManager.class); - if (onlineUpgrade) { - listener().to(OnlineUpgrader.class); - } - } + @Override + protected Class getProjectIndex() { + return ElasticProjectIndex.class; + } + + @Override + protected Class getVersionManager() { + return ElasticVersionManager.class; } } diff --git a/java/com/google/gerrit/lucene/LuceneIndexModule.java b/java/com/google/gerrit/lucene/LuceneIndexModule.java index 5c6cb2784f..121b96b490 100644 --- a/java/com/google/gerrit/lucene/LuceneIndexModule.java +++ b/java/com/google/gerrit/lucene/LuceneIndexModule.java @@ -14,30 +14,20 @@ package com.google.gerrit.lucene; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.common.collect.ImmutableMap; import com.google.gerrit.index.IndexConfig; -import com.google.gerrit.index.Schema; import com.google.gerrit.index.project.ProjectIndex; -import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.server.config.GerritServerConfig; -import com.google.gerrit.server.index.IndexModule; -import com.google.gerrit.server.index.OnlineUpgrader; -import com.google.gerrit.server.index.SingleVersionModule; +import com.google.gerrit.server.index.AbstractIndexModule; import com.google.gerrit.server.index.VersionManager; import com.google.gerrit.server.index.account.AccountIndex; import com.google.gerrit.server.index.change.ChangeIndex; import com.google.gerrit.server.index.group.GroupIndex; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; -import com.google.inject.Singleton; -import com.google.inject.assistedinject.FactoryModuleBuilder; import java.util.Map; import org.apache.lucene.search.BooleanQuery; import org.eclipse.jgit.lib.Config; -public class LuceneIndexModule extends AbstractModule { +public class LuceneIndexModule extends AbstractIndexModule { public static LuceneIndexModule singleVersionAllLatest(int threads, boolean slave) { return new LuceneIndexModule(ImmutableMap.of(), threads, false, slave); } @@ -59,76 +49,40 @@ public class LuceneIndexModule extends AbstractModule { return cfg.getBoolean("index", "lucene", "testInmemory", false); } - private final Map singleVersions; - private final int threads; - private final boolean onlineUpgrade; - private final boolean slave; - private LuceneIndexModule( Map singleVersions, int threads, boolean onlineUpgrade, boolean slave) { - if (singleVersions != null) { - checkArgument(!onlineUpgrade, "online upgrade is incompatible with single version map"); - } - this.singleVersions = singleVersions; - this.threads = threads; - this.onlineUpgrade = onlineUpgrade; - this.slave = slave; + super(singleVersions, threads, onlineUpgrade, slave); } @Override - protected void configure() { - if (slave) { - bind(AccountIndex.Factory.class).toInstance(LuceneIndexModule::createDummyIndexFactory); - bind(ChangeIndex.Factory.class).toInstance(LuceneIndexModule::createDummyIndexFactory); - bind(ProjectIndex.Factory.class).toInstance(LuceneIndexModule::createDummyIndexFactory); - } else { - install( - new FactoryModuleBuilder() - .implement(AccountIndex.class, LuceneAccountIndex.class) - .build(AccountIndex.Factory.class)); - install( - new FactoryModuleBuilder() - .implement(ChangeIndex.class, LuceneChangeIndex.class) - .build(ChangeIndex.Factory.class)); - install( - new FactoryModuleBuilder() - .implement(ProjectIndex.class, LuceneProjectIndex.class) - .build(ProjectIndex.Factory.class)); - } - install( - new FactoryModuleBuilder() - .implement(GroupIndex.class, LuceneGroupIndex.class) - .build(GroupIndex.Factory.class)); - - install(new IndexModule(threads, slave)); - if (singleVersions == null) { - install(new MultiVersionModule()); - } else { - install(new SingleVersionModule(singleVersions)); - } + protected Class getAccountIndex() { + return LuceneAccountIndex.class; } - @SuppressWarnings("unused") - private static T createDummyIndexFactory(Schema schema) { - throw new UnsupportedOperationException(); + @Override + protected Class getChangeIndex() { + return LuceneChangeIndex.class; } - @Provides - @Singleton - IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { + @Override + protected Class getGroupIndex() { + return LuceneGroupIndex.class; + } + + @Override + protected Class getProjectIndex() { + return LuceneProjectIndex.class; + } + + @Override + protected Class getVersionManager() { + return LuceneVersionManager.class; + } + + @Override + protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { BooleanQuery.setMaxClauseCount( cfg.getInt("index", "maxTerms", BooleanQuery.getMaxClauseCount())); - return IndexConfig.fromConfig(cfg).separateChangeSubIndexes(true).build(); - } - - private class MultiVersionModule extends LifecycleModule { - @Override - public void configure() { - bind(VersionManager.class).to(LuceneVersionManager.class); - listener().to(LuceneVersionManager.class); - if (onlineUpgrade) { - listener().to(OnlineUpgrader.class); - } - } + return super.getIndexConfig(cfg); } } diff --git a/java/com/google/gerrit/server/account/AccountManager.java b/java/com/google/gerrit/server/account/AccountManager.java index df6ea6ba2c..009623a69c 100644 --- a/java/com/google/gerrit/server/account/AccountManager.java +++ b/java/com/google/gerrit/server/account/AccountManager.java @@ -151,7 +151,7 @@ public class AccountManager { } } // New account, automatically create and return. - log.info("External ID not found. Attempting to create new account."); + log.debug("External ID not found. Attempting to create new account."); return create(who); } @@ -159,9 +159,9 @@ public class AccountManager { Optional accountState = byIdCache.get(extId.accountId()); if (!accountState.isPresent()) { log.error( - String.format( - "Authentication with external ID %s failed. Account %s doesn't exist.", - extId.key().get(), extId.accountId().get())); + "Authentication with external ID {} failed. Account {} doesn't exist.", + extId.key().get(), + extId.accountId().get()); throw new AccountException("Authentication error, account not found"); } @@ -285,9 +285,11 @@ public class AccountManager { private AuthResult create(AuthRequest who) throws OrmException, AccountException, IOException, ConfigInvalidException { Account.Id newId = new Account.Id(sequences.nextAccountId()); + log.debug("Assigning new Id {} to account", newId); ExternalId extId = ExternalId.createWithEmail(who.getExternalIdKey(), newId, who.getEmailAddress()); + log.debug("Created external Id: {}", extId); checkEmailNotUsed(extId); ExternalId userNameExtId = who.getUserName().isPresent() ? createUsername(newId, who.getUserName().get()) : null; @@ -412,7 +414,7 @@ public class AccountManager { public AuthResult link(Account.Id to, AuthRequest who) throws AccountException, OrmException, IOException, ConfigInvalidException { Optional optionalExtId = externalIds.get(who.getExternalIdKey()); - log.info("Link another authentication identity to an existing account"); + log.debug("Link another authentication identity to an existing account"); if (optionalExtId.isPresent()) { ExternalId extId = optionalExtId.get(); if (!extId.accountId().equals(to)) { @@ -421,7 +423,7 @@ public class AccountManager { } update(who, extId); } else { - log.info("Linking new external ID to the existing account"); + log.debug("Linking new external ID to the existing account"); ExternalId newExtId = ExternalId.createWithEmail(who.getExternalIdKey(), to, who.getEmailAddress()); checkEmailNotUsed(newExtId); diff --git a/java/com/google/gerrit/server/index/AbstractIndexModule.java b/java/com/google/gerrit/server/index/AbstractIndexModule.java new file mode 100644 index 0000000000..12aedfd15a --- /dev/null +++ b/java/com/google/gerrit/server/index/AbstractIndexModule.java @@ -0,0 +1,121 @@ +// Copyright (C) 2018 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.index; + +import static com.google.common.base.Preconditions.checkArgument; + +import com.google.gerrit.index.IndexConfig; +import com.google.gerrit.index.Schema; +import com.google.gerrit.index.project.ProjectIndex; +import com.google.gerrit.lifecycle.LifecycleModule; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.index.account.AccountIndex; +import com.google.gerrit.server.index.change.ChangeIndex; +import com.google.gerrit.server.index.group.GroupIndex; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import java.util.Map; +import org.eclipse.jgit.lib.Config; + +public abstract class AbstractIndexModule extends AbstractModule { + + private final int threads; + private final Map singleVersions; + private final boolean onlineUpgrade; + private final boolean slave; + + protected AbstractIndexModule( + Map singleVersions, int threads, boolean onlineUpgrade, boolean slave) { + if (singleVersions != null) { + checkArgument(!onlineUpgrade, "online upgrade is incompatible with single version map"); + } + this.singleVersions = singleVersions; + this.threads = threads; + this.onlineUpgrade = onlineUpgrade; + this.slave = slave; + } + + @Override + protected void configure() { + if (slave) { + bind(AccountIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory); + bind(ChangeIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory); + bind(ProjectIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory); + } else { + install( + new FactoryModuleBuilder() + .implement(AccountIndex.class, getAccountIndex()) + .build(AccountIndex.Factory.class)); + install( + new FactoryModuleBuilder() + .implement(ChangeIndex.class, getChangeIndex()) + .build(ChangeIndex.Factory.class)); + install( + new FactoryModuleBuilder() + .implement(ProjectIndex.class, getProjectIndex()) + .build(ProjectIndex.Factory.class)); + } + install( + new FactoryModuleBuilder() + .implement(GroupIndex.class, getGroupIndex()) + .build(GroupIndex.Factory.class)); + + install(new IndexModule(threads, slave)); + if (singleVersions == null) { + install(new MultiVersionModule()); + } else { + install(new SingleVersionModule(singleVersions)); + } + } + + @SuppressWarnings("unused") + private static T createDummyIndexFactory(Schema schema) { + throw new UnsupportedOperationException(); + } + + protected abstract Class getAccountIndex(); + + protected abstract Class getChangeIndex(); + + protected abstract Class getGroupIndex(); + + protected abstract Class getProjectIndex(); + + protected abstract Class getVersionManager(); + + @Provides + @Singleton + IndexConfig provideIndexConfig(@GerritServerConfig Config cfg) { + return getIndexConfig(cfg); + } + + protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { + return IndexConfig.fromConfig(cfg).separateChangeSubIndexes(true).build(); + } + + private class MultiVersionModule extends LifecycleModule { + @Override + public void configure() { + Class versionManagerClass = getVersionManager(); + bind(VersionManager.class).to(versionManagerClass); + listener().to(versionManagerClass); + if (onlineUpgrade) { + listener().to(OnlineUpgrader.class); + } + } + } +}