[581443] Provide a faster CDOTransaction.commitAndClose() method

https://bugs.eclipse.org/bugs/show_bug.cgi?id=581443
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml
index 4d60068..7076e52 100644
--- a/features/org.eclipse.emf.cdo-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo-feature/feature.xml
@@ -13,7 +13,7 @@
 <feature
       id="org.eclipse.emf.cdo"
       label="%featureName"
-      version="4.21.0.qualifier"
+      version="4.22.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo-feature/pom.xml b/features/org.eclipse.emf.cdo-feature/pom.xml
index fc2e94f..09fee1d 100644
--- a/features/org.eclipse.emf.cdo-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo</artifactId>
-  <version>4.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.tests-feature/feature.xml b/features/org.eclipse.emf.cdo.tests-feature/feature.xml
index a5aa888..acd0911 100644
--- a/features/org.eclipse.emf.cdo.tests-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.tests-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.tests"
       label="%featureName"
-      version="4.6.2.qualifier"
+      version="4.6.3.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo.tests-feature/pom.xml b/features/org.eclipse.emf.cdo.tests-feature/pom.xml
index 0cd67ad..e9d2c4f 100644
--- a/features/org.eclipse.emf.cdo.tests-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.tests-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.tests</artifactId>
-  <version>4.6.2-SNAPSHOT</version>
+  <version>4.6.3-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
index abb1d05..f801b61 100644
--- a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.cdo; singleton:=true
-Bundle-Version: 4.20.0.qualifier
+Bundle-Version: 4.21.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -10,28 +10,28 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)";resolution:=optional,
  org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo;version="4.20.0",
- org.eclipse.emf.cdo.eresource;version="4.20.0",
- org.eclipse.emf.cdo.eresource.impl;version="4.20.0",
- org.eclipse.emf.cdo.eresource.util;version="4.20.0",
- org.eclipse.emf.cdo.eresource.validation;version="4.20.0",
- org.eclipse.emf.cdo.etypes;version="4.20.0",
- org.eclipse.emf.cdo.etypes.impl;version="4.20.0",
- org.eclipse.emf.cdo.etypes.util;version="4.20.0",
- org.eclipse.emf.cdo.session;version="4.20.0",
- org.eclipse.emf.cdo.session.remote;version="4.20.0",
- org.eclipse.emf.cdo.transaction;version="4.20.0",
- org.eclipse.emf.cdo.util;version="4.20.0",
- org.eclipse.emf.cdo.view;version="4.20.0",
- org.eclipse.emf.internal.cdo;version="4.20.0",
- org.eclipse.emf.internal.cdo.analyzer;version="4.20.0";
+Export-Package: org.eclipse.emf.cdo;version="4.21.0",
+ org.eclipse.emf.cdo.eresource;version="4.21.0",
+ org.eclipse.emf.cdo.eresource.impl;version="4.21.0",
+ org.eclipse.emf.cdo.eresource.util;version="4.21.0",
+ org.eclipse.emf.cdo.eresource.validation;version="4.21.0",
+ org.eclipse.emf.cdo.etypes;version="4.21.0",
+ org.eclipse.emf.cdo.etypes.impl;version="4.21.0",
+ org.eclipse.emf.cdo.etypes.util;version="4.21.0",
+ org.eclipse.emf.cdo.session;version="4.21.0",
+ org.eclipse.emf.cdo.session.remote;version="4.21.0",
+ org.eclipse.emf.cdo.transaction;version="4.21.0",
+ org.eclipse.emf.cdo.util;version="4.21.0",
+ org.eclipse.emf.cdo.view;version="4.21.0",
+ org.eclipse.emf.internal.cdo;version="4.21.0",
+ org.eclipse.emf.internal.cdo.analyzer;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.bundle;version="4.20.0";x-friends:="org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.messages;version="4.20.0";x-internal:=true,
- org.eclipse.emf.internal.cdo.object;version="4.20.0";
+ org.eclipse.emf.internal.cdo.bundle;version="4.21.0";x-friends:="org.eclipse.emf.cdo.ui",
+ org.eclipse.emf.internal.cdo.messages;version="4.21.0";x-internal:=true,
+ org.eclipse.emf.internal.cdo.object;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -40,12 +40,12 @@
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.edit",
- org.eclipse.emf.internal.cdo.query;version="4.20.0";
+ org.eclipse.emf.internal.cdo.query;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.session;version="4.20.0";
+ org.eclipse.emf.internal.cdo.session;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -55,23 +55,23 @@
    org.eclipse.emf.cdo.security.ui,
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.internal.cdo.session.remote;version="4.20.0";
+ org.eclipse.emf.internal.cdo.session.remote;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.transaction;version="4.20.0";
+ org.eclipse.emf.internal.cdo.transaction;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.internal.cdo.util;version="4.20.0";
+ org.eclipse.emf.internal.cdo.util;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.view;version="4.20.0";
+ org.eclipse.emf.internal.cdo.view;version="4.21.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -79,6 +79,6 @@
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.spi.cdo;version="4.20.0"
+ org.eclipse.emf.spi.cdo;version="4.21.0"
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.emf.cdo
diff --git a/plugins/org.eclipse.emf.cdo/pom.xml b/plugins/org.eclipse.emf.cdo/pom.xml
index db6740a..05dd658 100644
--- a/plugins/org.eclipse.emf.cdo/pom.xml
+++ b/plugins/org.eclipse.emf.cdo/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.emf.cdo</artifactId>
-  <version>4.20.0-SNAPSHOT</version>
+  <version>4.21.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
index d28fcfd..99c213e 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
@@ -329,6 +329,12 @@
   }
 
   @Override
+  public CDOCommitInfo commitAndClose(IProgressMonitor monitor, boolean keepOpenAfterCommitProblem) throws CommitException
+  {
+    return delegate.commitAndClose(monitor, keepOpenAfterCommitProblem);
+  }
+
+  @Override
   public void rollback()
   {
     throw new UnsupportedOperationException("Rollback not supported for push transactions");
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
index 040bbce..dd09469 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
@@ -310,6 +310,11 @@
    */
   public CDOCommitInfo commit(Runnable runnable, int attempts, IProgressMonitor monitor) throws ConcurrentAccessException, CommitException;
 
+  /**
+   * @since 4.21
+   */
+  public CDOCommitInfo commitAndClose(IProgressMonitor monitor, boolean keepOpenAfterCommitProblem) throws CommitException;
+
   @Override
   public Options options();
 
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index d2a7f0a..eb21e32 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -1699,6 +1699,50 @@
   @Override
   public CDOCommitInfo commit(IProgressMonitor monitor) throws CommitException
   {
+    CDOCommitInfo info = commitAfterResolveConflicts(monitor);
+    if (info != null)
+    {
+      waitForCommitInfo(info.getTimeStamp());
+    }
+
+    return info;
+  }
+
+  @Override
+  public CDOCommitInfo commitAndClose(IProgressMonitor monitor, boolean keepOpenAfterCommitProblem) throws CommitException
+  {
+    CDOCommitInfo info;
+
+    try
+    {
+      info = commitAfterResolveConflicts(monitor);
+    }
+    catch (Error | RuntimeException | CommitException ex)
+    {
+      if (!keepOpenAfterCommitProblem)
+      {
+        try
+        {
+          close();
+        }
+        catch (Exception ex1)
+        {
+          if (isActive())
+          {
+            OM.LOG.error(ex1);
+          }
+        }
+      }
+
+      throw ex;
+    }
+
+    close();
+    return info;
+  }
+
+  private CDOCommitInfo commitAfterResolveConflicts(IProgressMonitor monitor) throws CommitException
+  {
     CDOConflictResolver[] conflictResolvers = options().getConflictResolvers();
     if (conflictResolvers.length != 0)
     {
@@ -1724,13 +1768,7 @@
       }
     }
 
-    CDOCommitInfo info = commitSynced(monitor);
-    if (info != null)
-    {
-      waitForCommitInfo(info.getTimeStamp());
-    }
-
-    return info;
+    return commitSynced(monitor);
   }
 
   private void waitForCommitInfo(long timeStamp)