Merge changes I55de272c,I526de6bc,I295fa136

* changes:
  Refactor MergeOpRepoManager by consolidating getRepo and openRepo
  Fix stale OpenRepo in MergeOpRepoManager
  Remove stale OpenRepo dependency from PreviewSubmit
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
index 0c81a35..cfc5937 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
@@ -136,9 +136,10 @@
     gApi.changes().id(id2).current().review(ReviewInput.approve());
     gApi.changes().id(id3).current().review(ReviewInput.approve());
 
-    BinaryResult request = gApi.changes().id(id1).current().submitPreview();
-    Map<Branch.NameKey, RevTree> preview = fetchFromBundles(request);
-
+    Map<Branch.NameKey, RevTree> preview;
+    try (BinaryResult request = gApi.changes().id(id1).current().submitPreview()) {
+      preview = fetchFromBundles(request);
+    }
     gApi.changes().id(id1).current().submit();
     ObjectId subRepoId =
         subRepo
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index d1750fa..81f136d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -150,10 +150,12 @@
   public void submitToEmptyRepo() throws Exception {
     RevCommit initialHead = getRemoteHead();
     PushOneCommit.Result change = createChange();
-    BinaryResult request = submitPreview(change.getChangeId());
+    Map<Branch.NameKey, RevTree> actual;
+    try (BinaryResult request = submitPreview(change.getChangeId())) {
+      actual = fetchFromBundles(request);
+    }
     RevCommit headAfterSubmitPreview = getRemoteHead();
     assertThat(headAfterSubmitPreview).isEqualTo(initialHead);
-    Map<Branch.NameKey, RevTree> actual = fetchFromBundles(request);
     assertThat(actual).hasSize(1);
 
     submit(change.getChangeId());
@@ -165,14 +167,15 @@
   public void submitSingleChange() throws Exception {
     RevCommit initialHead = getRemoteHead();
     PushOneCommit.Result change = createChange();
-    BinaryResult request = submitPreview(change.getChangeId());
+    Map<Branch.NameKey, RevTree> actual;
+    try (BinaryResult request = submitPreview(change.getChangeId())) {
+      actual = fetchFromBundles(request);
+    }
     RevCommit headAfterSubmit = getRemoteHead();
     assertThat(headAfterSubmit).isEqualTo(initialHead);
     assertRefUpdatedEvents();
     assertChangeMergedEvents();
 
-    Map<Branch.NameKey, RevTree> actual = fetchFromBundles(request);
-
     if ((getSubmitType() == SubmitType.CHERRY_PICK)
         || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
       // The change is updated as well:
@@ -199,21 +202,16 @@
     PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
     // change 2 is not approved, but we ignore labels
     approve(change3.getChangeId());
-    BinaryResult request = null;
-    String msg = null;
-    try {
-      request = submitPreview(change4.getChangeId());
-    } catch (Exception e) {
-      msg = e.getMessage();
-    }
 
-    if (getSubmitType() == SubmitType.CHERRY_PICK) {
+    try (BinaryResult request = submitPreview(change4.getChangeId())) {
+      assertThat(getSubmitType()).isEqualTo(SubmitType.CHERRY_PICK);
       Map<Branch.NameKey, RevTree> s = fetchFromBundles(request);
       submit(change4.getChangeId());
       assertRevTrees(project, s);
-    } else if (getSubmitType() == SubmitType.FAST_FORWARD_ONLY) {
-      assertThat(msg)
-          .isEqualTo(
+    } catch (RestApiException e) {
+      switch (getSubmitType()) {
+        case FAST_FORWARD_ONLY:
+          assertThat(e.getMessage()).isEqualTo(
               "Failed to submit 3 changes due to the following problems:\n"
                   + "Change "
                   + change2.getChange().getId()
@@ -228,26 +226,19 @@
                   + ": Project policy "
                   + "requires all submissions to be a fast-forward. Please "
                   + "rebase the change locally and upload again for review.");
-      RevCommit headAfterSubmit = getRemoteHead();
-      assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit);
-      assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-      assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
-    } else if ((getSubmitType() == SubmitType.REBASE_IF_NECESSARY)
-        || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
-      String change2hash = change2.getChange().currentPatchSet().getRevision().get();
-      assertThat(msg)
-          .isEqualTo(
+          break;
+        case REBASE_IF_NECESSARY:
+        case REBASE_ALWAYS:
+          String change2hash = change2.getChange().currentPatchSet().getRevision().get();
+          assertThat(e.getMessage()).isEqualTo(
               "Cannot rebase "
                   + change2hash
                   + ": The change could "
                   + "not be rebased due to a conflict during merge.");
-      RevCommit headAfterSubmit = getRemoteHead();
-      assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit);
-      assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-      assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
-    } else {
-      assertThat(msg)
-          .isEqualTo(
+          break;
+        case MERGE_ALWAYS:
+        case MERGE_IF_NECESSARY:
+          assertThat(e.getMessage()).isEqualTo(
               "Failed to submit 3 changes due to the following problems:\n"
                   + "Change "
                   + change2.getChange().getId()
@@ -264,6 +255,12 @@
                   + ": Change could not be "
                   + "merged due to a path conflict. Please rebase the change "
                   + "locally and upload the rebased commit for review.");
+          break;
+        default:
+          fail("Should not reach here.");
+          break;
+      }
+
       RevCommit headAfterSubmit = getRemoteHead();
       assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit);
       assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
@@ -279,12 +276,13 @@
     PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
     // change 2 is not approved, but we ignore labels
     approve(change3.getChangeId());
-    BinaryResult request = submitPreview(change4.getChangeId());
-
+    Map<Branch.NameKey, RevTree> actual;
+    try (BinaryResult request = submitPreview(change4.getChangeId())) {
+      actual = fetchFromBundles(request);
+    }
     Map<String, Map<String, Integer>> expected = new HashMap<>();
-    expected.put(project.get(), new HashMap<String, Integer>());
+    expected.put(project.get(), new HashMap<>());
     expected.get(project.get()).put("refs/heads/master", 3);
-    Map<Branch.NameKey, RevTree> actual = fetchFromBundles(request);
 
     assertThat(actual).containsKey(new Branch.NameKey(project, "refs/heads/master"));
     if (getSubmitType() == SubmitType.CHERRY_PICK) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
index 75e7356..96b982d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
@@ -171,9 +171,10 @@
     approve(change3.getChangeId());
 
     // get a preview before submitting:
-    BinaryResult request = submitPreview(change1b.getChangeId());
-    Map<Branch.NameKey, RevTree> preview = fetchFromBundles(request);
-
+    Map<Branch.NameKey, RevTree> preview;
+    try (BinaryResult request = submitPreview(change1b.getChangeId())) {
+      preview = fetchFromBundles(request);
+    }
     submit(change1b.getChangeId());
 
     RevCommit tip1 = getRemoteLog(p1, "master").get(0);
@@ -270,11 +271,11 @@
               + "and upload the rebased commit for review.";
 
       // Get a preview before submitting:
-      try {
+      try (BinaryResult r = submitPreview(change1b.getChangeId())) {
         // We cannot just use the ExpectedException infrastructure as provided
         // by AbstractDaemonTest, as then we'd stop early and not test the
         // actual submit.
-        submitPreview(change1b.getChangeId());
+
         fail("expected failure");
       } catch (RestApiException e) {
         assertThat(e.getMessage()).isEqualTo(msg);
@@ -545,11 +546,12 @@
     approve(change1.getChangeId());
 
     // get a preview before submitting:
-    BinaryResult request = submitPreview(change1.getChangeId(), "tgz");
-
-    assertThat(request.getContentType()).isEqualTo("application/x-gzip");
-    File tempfile = File.createTempFile("test", null);
-    request.writeTo(new FileOutputStream(tempfile));
+    File tempfile;
+    try (BinaryResult request = submitPreview(change1.getChangeId(), "tgz")) {
+      assertThat(request.getContentType()).isEqualTo("application/x-gzip");
+      tempfile = File.createTempFile("test", null);
+      request.writeTo(new FileOutputStream(tempfile));
+    }
 
     InputStream is = new GZIPInputStream(new FileInputStream(tempfile));
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
index fe821e6..8fb1d95 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -231,8 +231,12 @@
 
   @Override
   public BinaryResult submitPreview(String format) throws RestApiException {
-    submitPreview.setFormat(format);
-    return submitPreview.apply(revision);
+    try {
+      submitPreview.setFormat(format);
+      return submitPreview.apply(revision);
+    } catch (OrmException e) {
+      throw new RestApiException("Cannot get submit preview", e);
+    }
   }
 
   @Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java
index 67c0a6a..3fc9789 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java
@@ -33,6 +33,7 @@
 import com.google.gerrit.server.git.MergeOpRepoManager;
 import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
 import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -40,7 +41,6 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Collection;
-import java.util.Set;
 import org.apache.commons.compress.archivers.ArchiveOutputStream;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.NullProgressMonitor;
@@ -77,7 +77,7 @@
   }
 
   @Override
-  public BinaryResult apply(RevisionResource rsrc) throws RestApiException {
+  public BinaryResult apply(RevisionResource rsrc) throws OrmException, RestApiException {
     if (Strings.isNullOrEmpty(format)) {
       throw new BadRequestException("format is not specified");
     }
@@ -100,63 +100,77 @@
     if (!control.getUser().isIdentifiedUser()) {
       throw new MethodNotAllowedException("Anonymous users cannot submit");
     }
-    try (BinaryResult b = getBundles(rsrc, f)) {
-      b.disableGzip()
-          .setContentType(f.getMimeType())
-          .setAttachmentName("submit-preview-" + change.getChangeId() + "." + format);
-      return b;
-    } catch (OrmException | IOException e) {
-      throw new RestApiException("Error generating submit preview");
-    }
+
+    return getBundles(rsrc, f);
   }
 
-  private BinaryResult getBundles(RevisionResource rsrc, final ArchiveFormat f)
+  private BinaryResult getBundles(RevisionResource rsrc, ArchiveFormat f)
       throws OrmException, RestApiException {
     ReviewDb db = dbProvider.get();
     ChangeControl control = rsrc.getControl();
     IdentifiedUser caller = control.getUser().asIdentifiedUser();
     Change change = rsrc.getChange();
 
-    BinaryResult bin;
-    try (MergeOp op = mergeOpProvider.get()) {
+    final MergeOp op = mergeOpProvider.get();
+    try {
       op.merge(db, change, caller, false, new SubmitInput(), true);
-      final MergeOpRepoManager orm = op.getMergeOpRepoManager();
-      final Set<Project.NameKey> projects = op.getAllProjects();
-
-      bin =
-          new BinaryResult() {
-            @Override
-            public void writeTo(OutputStream out) throws IOException {
-              try (ArchiveOutputStream aos = f.createArchiveOutputStream(out)) {
-                for (Project.NameKey p : projects) {
-                  OpenRepo or = orm.getRepo(p);
-                  BundleWriter bw = new BundleWriter(or.getRepo());
-                  bw.setObjectCountCallback(null);
-                  bw.setPackConfig(null);
-                  Collection<ReceiveCommand> refs = or.getUpdate().getRefUpdates();
-                  for (ReceiveCommand r : refs) {
-                    bw.include(r.getRefName(), r.getNewId());
-                    ObjectId oldId = r.getOldId();
-                    if (!oldId.equals(ObjectId.zeroId())) {
-                      bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId));
-                    }
-                  }
-                  // This naming scheme cannot produce directory/file conflicts
-                  // as no projects contains ".git/":
-                  String path = p.get() + ".git";
-
-                  LimitedByteArrayOutputStream bos =
-                      new LimitedByteArrayOutputStream(maxBundleSize, 1024);
-                  bw.writeBundle(NullProgressMonitor.INSTANCE, bos);
-                  f.putEntry(aos, path, bos.toByteArray());
-                }
-              } catch (LimitExceededException e) {
-                throw new NotImplementedException(
-                    "The bundle is too big to generate at the server");
-              }
-            }
-          };
+      BinaryResult bin = new SubmitPreviewResult(op, f, maxBundleSize);
+      bin.disableGzip().setContentType(f.getMimeType())
+          .setAttachmentName("submit-preview-" + change.getChangeId() + "." + format);
+      return bin;
+    } catch (OrmException | RestApiException | RuntimeException e) {
+      op.close();
+      throw e;
     }
-    return bin;
+  }
+
+  private static class SubmitPreviewResult extends BinaryResult {
+
+    private final MergeOp mergeOp;
+    private final ArchiveFormat archiveFormat;
+    private final int maxBundleSize;
+
+    private SubmitPreviewResult(MergeOp mergeOp, ArchiveFormat archiveFormat, int maxBundleSize) {
+      this.mergeOp = mergeOp;
+      this.archiveFormat = archiveFormat;
+      this.maxBundleSize = maxBundleSize;
+    }
+
+    @Override
+    public void writeTo(OutputStream out) throws IOException {
+      try (ArchiveOutputStream aos = archiveFormat
+          .createArchiveOutputStream(out)) {
+        MergeOpRepoManager orm = mergeOp.getMergeOpRepoManager();
+        for (Project.NameKey p : mergeOp.getAllProjects()) {
+          OpenRepo or = orm.getRepo(p);
+          BundleWriter bw = new BundleWriter(or.getRepo());
+          bw.setObjectCountCallback(null);
+          bw.setPackConfig(null);
+          Collection<ReceiveCommand> refs = or.getUpdate().getRefUpdates();
+          for (ReceiveCommand r : refs) {
+            bw.include(r.getRefName(), r.getNewId());
+            ObjectId oldId = r.getOldId();
+            if (!oldId.equals(ObjectId.zeroId())) {
+              bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId));
+            }
+          }
+          LimitedByteArrayOutputStream bos = new LimitedByteArrayOutputStream(maxBundleSize, 1024);
+          bw.writeBundle(NullProgressMonitor.INSTANCE, bos);
+          // This naming scheme cannot produce directory/file conflicts
+          // as no projects contains ".git/":
+          String path = p.get() + ".git";
+          archiveFormat.putEntry(aos, path, bos.toByteArray());
+        }
+      } catch (LimitExceededException e) {
+        throw new NotImplementedException("The bundle is too big to generate at the server");
+      } catch (NoSuchProjectException e) {
+        throw new IOException(e);
+      }
+    }
+
+    @Override
+    public void close() throws IOException {
+      mergeOp.close();
+    }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java
index 1c74984..e680ea7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java
@@ -64,9 +64,8 @@
     this.submissionId = orm.getSubmissionId();
     Project.NameKey project = branch.getParentKey();
     logDebug("Loading .gitmodules of {} for project {}", branch, project);
-    OpenRepo or = null;
     try {
-      or = orm.openRepo(project);
+      OpenRepo or = orm.getRepo(project);
       ObjectId id = or.repo.resolve(branch.get());
       if (id == null) {
         throw new IOException("Cannot open branch " + branch.get());
@@ -90,10 +89,6 @@
       subscriptions = new SubmoduleSectionParser(bbc, canonicalWebUrl, branch).parseAllSections();
     } catch (NoSuchProjectException e) {
       throw new IOException(e);
-    } finally {
-      if (or != null) {
-        or.close();
-      }
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index deea815..452ccee 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -37,6 +37,7 @@
 import com.google.gerrit.extensions.client.SubmitType;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Branch;
@@ -463,7 +464,9 @@
           new SubmitStrategyListener(submitInput, strategies, commitStatus),
           submissionId,
           dryrun);
-    } catch (SubmoduleException e) {
+    } catch (NoSuchProjectException e) {
+      throw new ResourceNotFoundException(e.getMessage());
+    } catch (IOException | SubmoduleException e) {
       throw new IntegrationException(e);
     } catch (UpdateException e) {
       // BatchUpdate may have inadvertently wrapped an IntegrationException
@@ -493,7 +496,7 @@
 
   private List<SubmitStrategy> getSubmitStrategies(
       Map<Branch.NameKey, BranchBatch> toSubmit, SubmoduleOp submoduleOp, boolean dryrun)
-      throws IntegrationException {
+      throws IntegrationException, NoSuchProjectException, IOException {
     List<SubmitStrategy> strategies = new ArrayList<>();
     Set<Branch.NameKey> allBranches = submoduleOp.getBranchesInOrder();
     Set<CodeReviewCommit> allCommits =
@@ -731,10 +734,10 @@
 
   private OpenRepo openRepo(Project.NameKey project) throws IntegrationException {
     try {
-      return orm.openRepo(project);
-    } catch (NoSuchProjectException noProject) {
-      logWarn("Project " + noProject.project() + " no longer exists, abandoning open changes");
-      abandonAllOpenChangeForDeletedProject(noProject.project());
+      return orm.getRepo(project);
+    } catch (NoSuchProjectException e) {
+      logWarn("Project " + project + " no longer exists, abandoning open changes.");
+      abandonAllOpenChangeForDeletedProject(project);
     } catch (IOException e) {
       throw new IntegrationException("Error opening project " + project, e);
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java
index 97ac265..3b0af68 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java
@@ -113,15 +113,7 @@
       return update;
     }
 
-    /**
-     * Make sure the update has already executed before reset it. TODO:czhen Have a flag in
-     * BatchUpdate to mark if it has been executed
-     */
-    void resetUpdate() {
-      update = null;
-    }
-
-    void close() {
+    private void close() {
       if (update != null) {
         update.close();
       }
@@ -191,13 +183,7 @@
     return submissionId;
   }
 
-  public OpenRepo getRepo(Project.NameKey project) {
-    OpenRepo or = openRepos.get(project);
-    checkState(or != null, "repo not yet opened: %s", project);
-    return or;
-  }
-
-  public OpenRepo openRepo(Project.NameKey project) throws NoSuchProjectException, IOException {
+  public OpenRepo getRepo(Project.NameKey project) throws NoSuchProjectException, IOException {
     if (openRepos.containsKey(project)) {
       return openRepos.get(project);
     }
@@ -211,11 +197,12 @@
       openRepos.put(project, or);
       return or;
     } catch (RepositoryNotFoundException e) {
-      throw new NoSuchProjectException(project);
+      throw new NoSuchProjectException(project, e);
     }
   }
 
-  public List<BatchUpdate> batchUpdates(Collection<Project.NameKey> projects) {
+  public List<BatchUpdate> batchUpdates(Collection<Project.NameKey> projects)
+      throws NoSuchProjectException, IOException {
     List<BatchUpdate> updates = new ArrayList<>(projects.size());
     for (Project.NameKey project : projects) {
       updates.add(getRepo(project).getUpdate());
@@ -228,5 +215,6 @@
     for (OpenRepo repo : openRepos.values()) {
       repo.close();
     }
+    openRepos.clear();
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
index 79de8a5..9dc13d0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
@@ -288,7 +288,7 @@
       closeOrm = true;
     }
     try {
-      OpenRepo or = orm.openRepo(project);
+      OpenRepo or = orm.getRepo(project);
       checkState(or.rw.hasRevSort(RevSort.TOPO));
       return or;
     } catch (NoSuchProjectException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index cdb2c3b..d3e3b37 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -259,7 +259,7 @@
       }
       OpenRepo or;
       try {
-        or = orm.openRepo(s.getProject());
+        or = orm.getRepo(s.getProject());
       } catch (NoSuchProjectException e) {
         // A project listed a non existent project to be allowed
         // to subscribe to it. Allow this for now, i.e. no exception is
@@ -293,7 +293,7 @@
       for (Branch.NameKey targetBranch : branches) {
         Project.NameKey targetProject = targetBranch.getParentKey();
         try {
-          OpenRepo or = orm.openRepo(targetProject);
+          OpenRepo or = orm.getRepo(targetProject);
           ObjectId id = or.repo.resolve(targetBranch.get());
           if (id == null) {
             logDebug("The branch " + targetBranch + " doesn't exist.");
@@ -329,7 +329,7 @@
         if (branchesByProject.containsKey(project)) {
           superProjects.add(project);
           // get a new BatchUpdate for the super project
-          OpenRepo or = orm.openRepo(project);
+          OpenRepo or = orm.getRepo(project);
           for (Branch.NameKey branch : branchesByProject.get(project)) {
             addOp(or.getUpdate(), branch);
           }
@@ -347,7 +347,7 @@
       throws IOException, SubmoduleException {
     OpenRepo or;
     try {
-      or = orm.openRepo(subscriber.getParentKey());
+      or = orm.getRepo(subscriber.getParentKey());
     } catch (NoSuchProjectException | IOException e) {
       throw new SubmoduleException("Cannot access superproject", e);
     }
@@ -406,7 +406,7 @@
       throws IOException, SubmoduleException {
     OpenRepo or;
     try {
-      or = orm.openRepo(subscriber.getParentKey());
+      or = orm.getRepo(subscriber.getParentKey());
     } catch (NoSuchProjectException | IOException e) {
       throw new SubmoduleException("Cannot access superproject", e);
     }
@@ -447,7 +447,7 @@
       throws SubmoduleException, IOException {
     OpenRepo subOr;
     try {
-      subOr = orm.openRepo(s.getSubmodule().getParentKey());
+      subOr = orm.getRepo(s.getSubmodule().getParentKey());
     } catch (NoSuchProjectException | IOException e) {
       throw new SubmoduleException("Cannot access submodule", e);
     }