Remove InMemoryDatabase

At this point, the only functionality provided by this class was a
method to call SchemaCreator#create. Callers can use that directly
instead.

The real ReviewDbSchemaFactory is a simple enough stub now that it's
fine to install DatabaseModule directly in tests.

Change-Id: Iaa19a04bfe1fc83885c1fd58f84ca6986317e35b
This commit is contained in:
Dave Borowitz
2018-12-15 15:04:25 -08:00
parent 829b368c49
commit 4a8630e59b
6 changed files with 17 additions and 151 deletions

View File

@@ -430,8 +430,8 @@ public abstract class AbstractDaemonTest {
// contained in the instance of the group index which is available here and in tests. There are
// two reasons:
// 1) No group index is available in SchemaCreatorImpl when using an in-memory database.
// (This could be fixed by using the IndexManagerOnInit in InMemoryDatabase similar as BaseInit
// uses it.)
// (This could be fixed by using the IndexManagerOnInit in InMemoryTestingDatabaseModule similar
// to how BaseInit uses it.)
// 2) During the on-init part of the server start, we use another instance of the index than
// later on. As test indexes are non-permanent, closing an instance and opening another one
// removes all indexed data.

View File

@@ -21,28 +21,24 @@ import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePath;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.config.TrackingFootersProvider;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
import com.google.gerrit.server.schema.ReviewDbFactory;
import com.google.gerrit.server.schema.DatabaseModule;
import com.google.gerrit.server.schema.ReviewDbSchemaModule;
import com.google.gerrit.testing.InMemoryDatabase;
import com.google.gerrit.server.schema.SchemaCreator;
import com.google.gerrit.testing.InMemoryRepositoryManager;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.OrmRuntimeException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
import com.google.inject.Key;
import com.google.inject.ProvisionException;
import com.google.inject.TypeLiteral;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
class InMemoryTestingDatabaseModule extends LifecycleModule {
@@ -74,13 +70,8 @@ class InMemoryTestingDatabaseModule extends LifecycleModule {
bind(MetricMaker.class).to(DisabledMetricMaker.class);
TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
new TypeLiteral<SchemaFactory<ReviewDb>>() {};
bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
bind(InMemoryDatabase.class).in(SINGLETON);
listener().to(CreateDatabase.class);
install(new DatabaseModule());
listener().to(CreateSchema.class);
bind(SitePaths.class);
bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
@@ -90,19 +81,19 @@ class InMemoryTestingDatabaseModule extends LifecycleModule {
install(new SshdModule());
}
static class CreateDatabase implements LifecycleListener {
private final InMemoryDatabase mem;
static class CreateSchema implements LifecycleListener {
private final SchemaCreator schemaCreator;
@Inject
CreateDatabase(InMemoryDatabase mem) {
this.mem = mem;
CreateSchema(SchemaCreator schemaCreator) {
this.schemaCreator = schemaCreator;
}
@Override
public void start() {
try {
mem.create();
} catch (OrmException e) {
schemaCreator.ensureCreated();
} catch (OrmException | IOException | ConfigInvalidException e) {
throw new OrmRuntimeException(e);
}
}

View File

@@ -1,98 +0,0 @@
// Copyright (C) 2009 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.testing;
import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.schema.SchemaCreator;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import java.io.IOException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
/** Husk of an in-memory ReviewDb implementation. */
// TODO(dborowitz): Inline callers to get their own darn schemaCreator.
public class InMemoryDatabase implements SchemaFactory<ReviewDb> {
private final GitRepositoryManager repoManager;
private final AllProjectsName allProjectsName;
private final SchemaCreator schemaCreator;
private final SchemaFactory<ReviewDb> schemaFactory;
@Inject
InMemoryDatabase(Injector injector) {
Injector childInjector =
injector.createChildInjector(
new AbstractModule() {
@Override
protected void configure() {
switch (IndexModule.getIndexType(injector)) {
case LUCENE:
install(new LuceneIndexModuleOnInit());
break;
case ELASTICSEARCH:
install(new ElasticIndexModuleOnInit());
break;
default:
throw new IllegalStateException("unsupported index.type");
}
}
});
this.repoManager = childInjector.getInstance(GitRepositoryManager.class);
this.allProjectsName = childInjector.getInstance(AllProjectsName.class);
this.schemaCreator = childInjector.getInstance(SchemaCreator.class);
this.schemaFactory =
childInjector.getInstance(Key.get(new TypeLiteral<SchemaFactory<ReviewDb>>() {}));
}
InMemoryDatabase(
GitRepositoryManager repoManager,
AllProjectsName allProjectsName,
SchemaCreator schemaCreator,
SchemaFactory<ReviewDb> schemaFactory) {
this.repoManager = repoManager;
this.allProjectsName = allProjectsName;
this.schemaCreator = schemaCreator;
this.schemaFactory = schemaFactory;
}
@Override
public ReviewDb open() throws OrmException {
return schemaFactory.open();
}
/** Ensure the database schema has been created and initialized. */
public InMemoryDatabase create() throws OrmException {
try {
try {
repoManager.openRepository(allProjectsName).close();
} catch (RepositoryNotFoundException e) {
schemaCreator.create();
}
} catch (IOException | ConfigInvalidException e) {
throw new OrmException("Cannot create in-memory database", e);
}
return this;
}
}

View File

@@ -28,7 +28,6 @@ import com.google.gerrit.index.SchemaDefinitions;
import com.google.gerrit.index.project.ProjectSchemaDefinitions;
import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.FanOutExecutor;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.GerritPersonIdentProvider;
@@ -78,26 +77,22 @@ import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
import com.google.gerrit.server.plugins.ServerInformationImpl;
import com.google.gerrit.server.project.DefaultProjectNameLockManager;
import com.google.gerrit.server.restapi.RestApiModule;
import com.google.gerrit.server.schema.DatabaseModule;
import com.google.gerrit.server.schema.InMemoryAccountPatchReviewStore;
import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
import com.google.gerrit.server.schema.ReviewDbFactory;
import com.google.gerrit.server.schema.SchemaCreator;
import com.google.gerrit.server.schema.SchemaCreatorImpl;
import com.google.gerrit.server.securestore.DefaultSecureStore;
import com.google.gerrit.server.securestore.SecureStore;
import com.google.gerrit.server.ssh.NoSshKeyCache;
import com.google.gerrit.server.submit.LocalMergeSuperSetComputation;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.ProvisionException;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.servlet.RequestScoped;
import com.google.inject.util.Providers;
import java.lang.reflect.InvocationTargetException;
@@ -192,11 +187,7 @@ public class InMemoryModule extends FactoryModule {
.toInstance(MoreExecutors.newDirectExecutorService());
bind(SecureStore.class).to(DefaultSecureStore.class);
TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
new TypeLiteral<SchemaFactory<ReviewDb>>() {};
bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
install(new DatabaseModule());
install(new InMemorySchemaModule());
install(NoSshKeyCache.module());
install(new GerritInstanceNameModule());
@@ -306,16 +297,6 @@ public class InMemoryModule extends FactoryModule {
return queues.createQueue(2, "FanOut");
}
@Provides
@Singleton
InMemoryDatabase getInMemoryDatabase(
GitRepositoryManager repoManager,
AllProjectsName allProjectsName,
SchemaCreator schemaCreator,
SchemaFactory<ReviewDb> schemaFactory) {
return new InMemoryDatabase(repoManager, allProjectsName, schemaCreator, schemaFactory);
}
private Module luceneIndexModule() {
return indexModule("com.google.gerrit.lucene.LuceneIndexModule");
}

View File

@@ -32,7 +32,6 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.LabelId;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountManager;
@@ -49,7 +48,6 @@ import com.google.gerrit.server.util.RequestContext;
import com.google.gerrit.server.util.ThreadLocalRequestContext;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.testing.GerritBaseTests;
import com.google.gerrit.testing.InMemoryDatabase;
import com.google.gerrit.testing.InMemoryModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
@@ -66,7 +64,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
@Inject private AllProjectsName allProjects;
@Inject private GitRepositoryManager repoManager;
@Inject private IdentifiedUser.GenericFactory userFactory;
@Inject private InMemoryDatabase schemaFactory;
@Inject private LabelNormalizer norm;
@Inject private MetaDataUpdate.User metaDataUpdateFactory;
@Inject private ProjectCache projectCache;
@@ -77,7 +74,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
@Inject private GerritApi gApi;
private LifecycleManager lifecycle;
private ReviewDb db;
private Account.Id userId;
private IdentifiedUser user;
private Change change;
@@ -137,9 +133,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
lifecycle.stop();
}
requestContext.setContext(null);
if (db != null) {
db.close();
}
}
@Test

View File

@@ -26,7 +26,6 @@ import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.project.ProjectConfig;
import com.google.gerrit.testing.GerritBaseTests;
import com.google.gerrit.testing.InMemoryDatabase;
import com.google.gerrit.testing.InMemoryModule;
import com.google.inject.Inject;
import java.util.ArrayList;
@@ -42,17 +41,17 @@ public class SchemaCreatorImplTest extends GerritBaseTests {
@Inject private GitRepositoryManager repoManager;
@Inject private InMemoryDatabase inMemoryDatabase;
@Inject private SchemaCreator schemaCreator;
@Inject private ProjectConfig.Factory projectConfigFactory;
@Before
public void setUp() throws Exception {
new InMemoryModule().inject(this);
schemaCreator.create();
}
private LabelTypes getLabelTypes() throws Exception {
inMemoryDatabase.create();
ProjectConfig c = projectConfigFactory.create(allProjects);
try (Repository repo = repoManager.openRepository(allProjects)) {
c.load(repo);