Don't leak Repository and RevWalk instances during notedb parsing

Change-Id: Ia8d99f0387206295678234a549dc22a062e5655b
This commit is contained in:
Dave Borowitz
2014-07-31 11:06:39 -07:00
parent 9d5201620f
commit 05b4b4b78d
2 changed files with 23 additions and 12 deletions

View File

@@ -44,8 +44,8 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSet.Id;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.PatchSetApproval.LabelId;
@@ -152,7 +152,7 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
}
}
private static class Parser {
private static class Parser implements AutoCloseable {
private final Change.Id changeId;
private final ObjectId tip;
private final RevWalk walk;
@@ -184,6 +184,11 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
commentsForBase = ArrayListMultimap.create();
}
@Override
public void close() {
repo.close();
}
private void parseAll() throws ConfigInvalidException, IOException, ParseException {
walk.markStart(walk.parseCommit(tip));
for (RevCommit commit : walk) {
@@ -626,9 +631,7 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
return;
}
RevWalk walk = new RevWalk(reader);
try {
Change change = getChange();
Parser parser = new Parser(change, rev, walk, repoManager);
try (Parser parser = new Parser(change, rev, walk, repoManager)) {
parser.parseAll();
if (parser.status != null) {

View File

@@ -68,7 +68,7 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
}
}
private static class Parser {
private static class Parser implements AutoCloseable {
private final Change.Id changeId;
private final ObjectId tip;
private final RevWalk walk;
@@ -92,6 +92,11 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
draftPsComments = ArrayListMultimap.create();
}
@Override
public void close() {
repo.close();
}
private void parseDraftComments() throws IOException, ConfigInvalidException {
walk.markStart(walk.parseCommit(tip));
noteMap = CommentsInNotesUtil.parseCommentsFromNotes(repo,
@@ -167,13 +172,16 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
}
RevWalk walk = new RevWalk(reader);
Parser parser = new Parser(getChangeId(), walk, rev, repoManager,
draftsProject, author);
parser.parseDraftComments();
try (Parser parser = new Parser(getChangeId(), walk, rev, repoManager,
draftsProject, author)) {
parser.parseDraftComments();
buildCommentTable(draftBaseComments, parser.draftBaseComments);
buildCommentTable(draftPsComments, parser.draftPsComments);
noteMap = parser.noteMap;
buildCommentTable(draftBaseComments, parser.draftBaseComments);
buildCommentTable(draftPsComments, parser.draftPsComments);
noteMap = parser.noteMap;
} finally {
walk.release();
}
}
@Override