From 5d2a334237cb4496091eaf3b8259ff3899db32c9 Mon Sep 17 00:00:00 2001 From: irengrig Date: Thu, 29 Jul 2010 16:18:00 +0400 Subject: [PATCH] IDEA-56714 IDEA 9.0.3 EAP builds (including 413) generate extensive amount of simultaneous SVN sessions/connections and don't close them --- .../src/org/jetbrains/idea/svn/SvnUtil.java | 8 ++++- .../svn/actions/CompareWithBranchAction.java | 13 +++++-- .../svn/config/SvnConfigureProxiesDialog.java | 9 ++++- .../idea/svn/dialogs/BranchMerger.java | 9 ++++- .../svn/dialogs/RepositoryBrowserDialog.java | 10 ++++-- .../svn/dialogs/SelectLocationDialog.java | 8 +++-- .../history/SvnCommittedChangesProvider.java | 35 +++++++++++++++---- .../svn/update/SvnIntegrateEnvironment.java | 10 ++++-- 8 files changed, 84 insertions(+), 18 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java index 5d2c0ae24082..4dc1cd824f24 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java @@ -616,11 +616,17 @@ public class SvnUtil { } public static boolean doesRepositorySupportMergeinfo(final SvnVcs vcs, final SVNURL url) { + SVNRepository repository = null; try { - return vcs.createRepository(url).hasCapability(SVNCapability.MERGE_INFO); + repository = vcs.createRepository(url); + return repository.hasCapability(SVNCapability.MERGE_INFO); } catch (SVNException e) { return false; + } finally { + if (repository != null) { + repository.closeSession(); + } } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java index f95e4eb46ef5..8a54444ffc19 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/actions/CompareWithBranchAction.java @@ -133,6 +133,8 @@ public class CompareWithBranchAction extends AnAction implements DumbAware { SVNWCAccess wcAccess = vcs.createWCAccess(); + SVNRepository repository = null; + SVNRepository repository2 = null; try { SVNAdminAreaInfo info = wcAccess.openAnchor(new File(myVirtualFile.getPath()), false, SVNWCAccess.INFINITE_DEPTH); File anchorPath = info.getAnchor().getRoot(); @@ -150,18 +152,25 @@ public class CompareWithBranchAction extends AnAction implements DumbAware { } SVNURL anchorURL = anchorEntry.getSVNURL(); - SVNRepository repository = vcs.createRepository(anchorURL.toString()); + repository = vcs.createRepository(anchorURL.toString()); SVNReporter reporter = new SVNReporter(info, info.getAnchor().getFile(info.getTargetName()), false, true, SVNDepth.INFINITY, false, false, true, SVNDebugLog.getDefaultLog()); long rev = repository.getLatestRevision(); + repository2 = vcs.createRepository((target == null) ? url.toString() : url.removePathTail().toString()); SvnDiffEditor diffEditor = new SvnDiffEditor((target == null) ? myVirtualFile : myVirtualFile.getParent(), - vcs.createRepository((target == null) ? url.toString() : url.removePathTail().toString()), rev, true); + repository2, rev, true); repository.diff(url, rev, rev, target, true, true, false, reporter, SVNCancellableEditor.newInstance(diffEditor, new SvnProgressCanceller(), null)); changes.addAll(diffEditor.getChangesMap().values()); } finally { wcAccess.close(); + if (repository != null) { + repository.closeSession(); + } + if (repository2 != null) { + repository2.closeSession(); + } } } catch(SVNCancelException ex) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java index 04f5fd461595..c41d23cd59c5 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/config/SvnConfigureProxiesDialog.java @@ -27,6 +27,7 @@ import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnServerFileManager; import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.io.SVNRepository; import javax.swing.*; import java.awt.*; @@ -137,10 +138,16 @@ public class SvnConfigureProxiesDialog extends DialogWrapper implements Validati if (pi != null) { pi.setText("Connecting to " + url); } + SVNRepository repository = null; try { - SvnVcs.getInstance(myProject).createRepository(url).testConnection(); + repository = SvnVcs.getInstance(myProject).createRepository(url); + repository.testConnection(); } catch (SVNException exc) { excRef.set(exc); + } finally { + if (repository != null) { + repository.closeSession(); + } } } }, "Test connection", true, myProject); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java index e842e3ea602a..bd6f96a3b02b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/BranchMerger.java @@ -23,6 +23,7 @@ import org.jetbrains.idea.svn.update.UpdateEventHandler; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNDiffClient; import org.tmatesoft.svn.core.wc.SVNDiffOptions; import org.tmatesoft.svn.core.wc.SVNRevision; @@ -55,11 +56,17 @@ public class BranchMerger implements IMerger { myBranchName = branchName; mySourceCopyRevision = sourceCopyRevision; myAtStart = true; + SVNRepository repository = null; try { - mySourceLatestRevision = myVcs.createRepository(mySourceUrl).getLatestRevision(); + repository = myVcs.createRepository(mySourceUrl); + mySourceLatestRevision = repository.getLatestRevision(); } catch (SVNException e) { mySourceLatestRevision = SVNRevision.HEAD.getNumber(); + } finally { + if (repository != null) { + repository.closeSession(); + } } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java index 643064ad4fa8..0e7d36a4b242 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryBrowserDialog.java @@ -1099,10 +1099,13 @@ public class RepositoryBrowserDialog extends DialogWrapper { SVNRepository sourceRepository = myVCS.createRepository(sourceURL.toString()); sourceRepository.setCanceller(new SvnProgressCanceller()); SvnDiffEditor diffEditor; - final long rev = sourceRepository.getLatestRevision(); + final long rev; + SVNRepository targetRepository = null; try { + rev = sourceRepository.getLatestRevision(); // generate Map of path->Change - diffEditor = new SvnDiffEditor(sourceRepository, myVCS.createRepository(targetURL.toString()), -1, false); + targetRepository = myVCS.createRepository(targetURL.toString()); + diffEditor = new SvnDiffEditor(sourceRepository, targetRepository, -1, false); final ISVNEditor cancellableEditor = SVNCancellableEditor.newInstance(diffEditor, new SvnProgressCanceller(), null); sourceRepository.diff(targetURL, rev, rev, null, true, true, false, new ISVNReporterBaton() { public void report(ISVNReporter reporter) throws SVNException { @@ -1113,6 +1116,9 @@ public class RepositoryBrowserDialog extends DialogWrapper { } finally { sourceRepository.closeSession(); + if (targetRepository != null) { + targetRepository.closeSession(); + } } final String sourceTitle = SVNPathUtil.tail(sourceURL.toString()); final String targetTitle = SVNPathUtil.tail(targetURL.toString()); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java index 076135792f03..01186c0b1f3e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SelectLocationDialog.java @@ -120,12 +120,16 @@ public class SelectLocationDialog extends DialogWrapper { ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { public void run() { + SVNRepository repos = null; try { - SVNRepository repos = SvnVcs.getInstance(project).createRepository(urlString); + repos = SvnVcs.getInstance(project).createRepository(urlString); result.set(repos.getRepositoryRoot(true)); - repos.closeSession(); } catch (SVNException e) { excRef.set(e); + } finally { + if (repos != null) { + repos.closeSession(); + } } } }, "Detecting repository root", true, project); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java index 9ff2b64db560..45e7114caedb 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnCommittedChangesProvider.java @@ -184,13 +184,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); - repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } final ChangeBrowserSettings.Filter filter = settings.createFilter(); @@ -219,13 +223,18 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } getCommittedChangesImpl(settings, svnLocation.getURL(), new String[]{""}, maxCount, new Consumer() { @@ -249,13 +258,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi } final String repositoryRoot; + SVNRepository repository = null; try { - final SVNRepository repository = myVcs.createRepository(svnLocation.getURL()); + repository = myVcs.createRepository(svnLocation.getURL()); repositoryRoot = repository.getRepositoryRoot(true).toString(); - repository.closeSession(); } catch (SVNException e) { throw new VcsException(e); + } finally { + if (repository != null) { + repository.closeSession(); + } } final MergeTrackerProxy proxy = new MergeTrackerProxy(new Consumer>() { @@ -356,7 +369,17 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi revisionBefore = SVNRevision.create(changeTo.longValue()); } else { - revisionBefore = SVNRevision.create(myVcs.createRepository(url).getLatestRevision()); + SVNRepository repository = null; + final long revision; + try { + repository = myVcs.createRepository(url); + revision = repository.getLatestRevision(); + } finally { + if (repository != null) { + repository.closeSession(); + } + } + revisionBefore = SVNRevision.create(revision); } final SVNRevision revisionAfter; if (dateFrom != null) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java index af66563a46c5..11d5c124c53b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/update/SvnIntegrateEnvironment.java @@ -20,10 +20,10 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.update.UpdatedFiles; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnBundle; import org.jetbrains.idea.svn.SvnConfiguration; import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.annotations.Nullable; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.io.SVNRepository; @@ -131,14 +131,18 @@ public class SvnIntegrateEnvironment extends AbstractSvnUpdateIntegrateEnvironme } else { + SVNRepository repos = null; try { - SVNRepository repos = myVcs.createRepository(svnURL2.toString()); + repos = myVcs.createRepository(svnURL2.toString()); final long latestRev = repos.getLatestRevision(); - repos.closeSession(); return String.valueOf(latestRev); } catch (SVNException e) { return null; + } finally { + if (repos != null) { + repos.closeSession(); + } } } }