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 // contained in the instance of the group index which is available here and in tests. There are
// two reasons: // two reasons:
// 1) No group index is available in SchemaCreatorImpl when using an in-memory database. // 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 // (This could be fixed by using the IndexManagerOnInit in InMemoryTestingDatabaseModule similar
// uses it.) // to how BaseInit uses it.)
// 2) During the on-init part of the server start, we use another instance of the index than // 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 // later on. As test indexes are non-permanent, closing an instance and opening another one
// removes all indexed data. // 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.lifecycle.LifecycleModule;
import com.google.gerrit.metrics.DisabledMetricMaker; import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker; 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.GerritServerConfig;
import com.google.gerrit.server.config.SitePath; import com.google.gerrit.server.config.SitePath;
import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.config.TrackingFooters; import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.config.TrackingFootersProvider; import com.google.gerrit.server.config.TrackingFootersProvider;
import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.schema.NotesMigrationSchemaFactory; import com.google.gerrit.server.schema.DatabaseModule;
import com.google.gerrit.server.schema.ReviewDbFactory;
import com.google.gerrit.server.schema.ReviewDbSchemaModule; 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.gerrit.testing.InMemoryRepositoryManager;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.OrmRuntimeException; import com.google.gwtorm.server.OrmRuntimeException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Key;
import com.google.inject.ProvisionException; import com.google.inject.ProvisionException;
import com.google.inject.TypeLiteral;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;
class InMemoryTestingDatabaseModule extends LifecycleModule { class InMemoryTestingDatabaseModule extends LifecycleModule {
@@ -74,13 +70,8 @@ class InMemoryTestingDatabaseModule extends LifecycleModule {
bind(MetricMaker.class).to(DisabledMetricMaker.class); bind(MetricMaker.class).to(DisabledMetricMaker.class);
TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory = install(new DatabaseModule());
new TypeLiteral<SchemaFactory<ReviewDb>>() {}; listener().to(CreateSchema.class);
bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
bind(InMemoryDatabase.class).in(SINGLETON);
listener().to(CreateDatabase.class);
bind(SitePaths.class); bind(SitePaths.class);
bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON); bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
@@ -90,19 +81,19 @@ class InMemoryTestingDatabaseModule extends LifecycleModule {
install(new SshdModule()); install(new SshdModule());
} }
static class CreateDatabase implements LifecycleListener { static class CreateSchema implements LifecycleListener {
private final InMemoryDatabase mem; private final SchemaCreator schemaCreator;
@Inject @Inject
CreateDatabase(InMemoryDatabase mem) { CreateSchema(SchemaCreator schemaCreator) {
this.mem = mem; this.schemaCreator = schemaCreator;
} }
@Override @Override
public void start() { public void start() {
try { try {
mem.create(); schemaCreator.ensureCreated();
} catch (OrmException e) { } catch (OrmException | IOException | ConfigInvalidException e) {
throw new OrmRuntimeException(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.index.project.ProjectSchemaDefinitions;
import com.google.gerrit.metrics.DisabledMetricMaker; import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker; import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.FanOutExecutor; import com.google.gerrit.server.FanOutExecutor;
import com.google.gerrit.server.GerritPersonIdent; import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.GerritPersonIdentProvider; 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.plugins.ServerInformationImpl;
import com.google.gerrit.server.project.DefaultProjectNameLockManager; import com.google.gerrit.server.project.DefaultProjectNameLockManager;
import com.google.gerrit.server.restapi.RestApiModule; 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.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.SchemaCreator;
import com.google.gerrit.server.schema.SchemaCreatorImpl; import com.google.gerrit.server.schema.SchemaCreatorImpl;
import com.google.gerrit.server.securestore.DefaultSecureStore; import com.google.gerrit.server.securestore.DefaultSecureStore;
import com.google.gerrit.server.securestore.SecureStore; import com.google.gerrit.server.securestore.SecureStore;
import com.google.gerrit.server.ssh.NoSshKeyCache; import com.google.gerrit.server.ssh.NoSshKeyCache;
import com.google.gerrit.server.submit.LocalMergeSuperSetComputation; import com.google.gerrit.server.submit.LocalMergeSuperSetComputation;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module; import com.google.inject.Module;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Provides; import com.google.inject.Provides;
import com.google.inject.ProvisionException; import com.google.inject.ProvisionException;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.servlet.RequestScoped; import com.google.inject.servlet.RequestScoped;
import com.google.inject.util.Providers; import com.google.inject.util.Providers;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@@ -192,11 +187,7 @@ public class InMemoryModule extends FactoryModule {
.toInstance(MoreExecutors.newDirectExecutorService()); .toInstance(MoreExecutors.newDirectExecutorService());
bind(SecureStore.class).to(DefaultSecureStore.class); bind(SecureStore.class).to(DefaultSecureStore.class);
TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory = install(new DatabaseModule());
new TypeLiteral<SchemaFactory<ReviewDb>>() {};
bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
install(new InMemorySchemaModule()); install(new InMemorySchemaModule());
install(NoSshKeyCache.module()); install(NoSshKeyCache.module());
install(new GerritInstanceNameModule()); install(new GerritInstanceNameModule());
@@ -306,16 +297,6 @@ public class InMemoryModule extends FactoryModule {
return queues.createQueue(2, "FanOut"); 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() { private Module luceneIndexModule() {
return indexModule("com.google.gerrit.lucene.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.Change;
import com.google.gerrit.reviewdb.client.LabelId; import com.google.gerrit.reviewdb.client.LabelId;
import com.google.gerrit.reviewdb.client.PatchSetApproval; 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.CurrentUser;
import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountManager; 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.ThreadLocalRequestContext;
import com.google.gerrit.server.util.time.TimeUtil; import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.testing.GerritBaseTests; import com.google.gerrit.testing.GerritBaseTests;
import com.google.gerrit.testing.InMemoryDatabase;
import com.google.gerrit.testing.InMemoryModule; import com.google.gerrit.testing.InMemoryModule;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -66,7 +64,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
@Inject private AllProjectsName allProjects; @Inject private AllProjectsName allProjects;
@Inject private GitRepositoryManager repoManager; @Inject private GitRepositoryManager repoManager;
@Inject private IdentifiedUser.GenericFactory userFactory; @Inject private IdentifiedUser.GenericFactory userFactory;
@Inject private InMemoryDatabase schemaFactory;
@Inject private LabelNormalizer norm; @Inject private LabelNormalizer norm;
@Inject private MetaDataUpdate.User metaDataUpdateFactory; @Inject private MetaDataUpdate.User metaDataUpdateFactory;
@Inject private ProjectCache projectCache; @Inject private ProjectCache projectCache;
@@ -77,7 +74,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
@Inject private GerritApi gApi; @Inject private GerritApi gApi;
private LifecycleManager lifecycle; private LifecycleManager lifecycle;
private ReviewDb db;
private Account.Id userId; private Account.Id userId;
private IdentifiedUser user; private IdentifiedUser user;
private Change change; private Change change;
@@ -137,9 +133,6 @@ public class LabelNormalizerTest extends GerritBaseTests {
lifecycle.stop(); lifecycle.stop();
} }
requestContext.setContext(null); requestContext.setContext(null);
if (db != null) {
db.close();
}
} }
@Test @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.git.GitRepositoryManager;
import com.google.gerrit.server.project.ProjectConfig; import com.google.gerrit.server.project.ProjectConfig;
import com.google.gerrit.testing.GerritBaseTests; import com.google.gerrit.testing.GerritBaseTests;
import com.google.gerrit.testing.InMemoryDatabase;
import com.google.gerrit.testing.InMemoryModule; import com.google.gerrit.testing.InMemoryModule;
import com.google.inject.Inject; import com.google.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
@@ -42,17 +41,17 @@ public class SchemaCreatorImplTest extends GerritBaseTests {
@Inject private GitRepositoryManager repoManager; @Inject private GitRepositoryManager repoManager;
@Inject private InMemoryDatabase inMemoryDatabase; @Inject private SchemaCreator schemaCreator;
@Inject private ProjectConfig.Factory projectConfigFactory; @Inject private ProjectConfig.Factory projectConfigFactory;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
new InMemoryModule().inject(this); new InMemoryModule().inject(this);
schemaCreator.create();
} }
private LabelTypes getLabelTypes() throws Exception { private LabelTypes getLabelTypes() throws Exception {
inMemoryDatabase.create();
ProjectConfig c = projectConfigFactory.create(allProjects); ProjectConfig c = projectConfigFactory.create(allProjects);
try (Repository repo = repoManager.openRepository(allProjects)) { try (Repository repo = repoManager.openRepository(allProjects)) {
c.load(repo); c.load(repo);