You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2019/07/09 17:28:31 UTC

svn commit: r1862829 - in /uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima: UimaContext.java analysis_engine/asb/impl/FlowContainer.java cas/impl/CASImpl.java impl/Util.java

Author: schor
Date: Tue Jul  9 17:28:30 2019
New Revision: 1862829

URL: http://svn.apache.org/viewvc?rev=1862829&view=rev
Log:
[UIMA-6057] merge from v2, also put back in the class loader switch when getting an empty CAS, in case some JCas ops are done using it. 

Modified:
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java   (contents, props changed)
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java   (contents, props changed)
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java   (contents, props changed)

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java Tue Jul  9 17:28:30 2019
@@ -527,6 +527,7 @@ public interface UimaContext {
    * @param <T> the type of the CAS interface (CAS or JCas)
    * 
    * @return an empty CAS. This will be an implementation of <code>aCasInterface</code>.
+   *      The CAS will be unlocked (can be reset) but will have switched Class Loaders if needed.
    */
   public <T extends AbstractCas> T getEmptyCas(Class<T> aCasInterface);
   

Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul  9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/UimaContext.java:1690273-1862818

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java Tue Jul  9 17:28:30 2019
@@ -109,6 +109,8 @@ public class FlowContainer {
       mFlow.aborted();
     } finally {
       mCAS.restoreClassLoaderUnlockCas();
+      // https://issues.apache.org/jira/browse/UIMA-6057
+      mCAS.restoreClassLoaderUnlockCas();  // this one unlocks the aborted CAS itself
     }
   }
   
@@ -118,6 +120,8 @@ public class FlowContainer {
       return mFlow.continueOnFailure(failedAeKey, failure);
     } finally {
       mCAS.restoreClassLoaderUnlockCas();
+      // https://issues.apache.org/jira/browse/UIMA-6057
+      mCAS.restoreClassLoaderUnlockCas();  // this one unlocks the failed CAS itself
     }
   }
 

Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul  9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowContainer.java:1690273-1862825

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Tue Jul  9 17:28:30 2019
@@ -34,11 +34,13 @@ import java.lang.invoke.MutableCallSite;
 import java.net.URL;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Deque;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -310,7 +312,22 @@ public class CASImpl extends AbstractCas
       return ((FsChange)obj).fs._id == fs._id;
     }
   }
+ 
+  /**
+   * Instances are put into a Stack, to remember previous state to switch back to,
+   * when switching class loaders and locking the CAS
+   * https://issues.apache.org/jira/browse/UIMA-6057
+   */
+  static class SwitchControl {
+    final boolean wasLocked;
+    boolean wasSwitched = false;
     
+    SwitchControl(boolean wasLocked) {
+      this.wasLocked = wasLocked;
+    }
+  }
+  
+
   // fields shared among all CASes belong to views of a common base CAS
   static class SharedViewData {
     /**
@@ -566,6 +583,13 @@ public class CASImpl extends AbstractCas
      */
     private boolean isId2Fs;
     
+    /**
+     * a stack used to remember and restore previous state of cas lock and class loaders
+     * when switching classloaders and locking the cas
+     * https://issues.apache.org/jira/browse/UIMA-6057
+     */
+    private final Deque<SwitchControl> switchControl = new ArrayDeque<>();
+    
     /******************************************************************************************
      * C A S   S T A T E    management                                                        *
      *    Cas state is implemented in a way to allow the Java to efficiently                  * 
@@ -806,8 +830,9 @@ public class CASImpl extends AbstractCas
       traceFSid = 0;
       if (traceFSs) {
         traceFScreationSb.setLength(0);
-    }
+      }
       componentInfo = null; // https://issues.apache.org/jira/browse/UIMA-5097
+      switchControl.clear();  //  https://issues.apache.org/jira/browse/UIMA-6057
     }
     
     private void flushIndexRepositoriesAllViews() {
@@ -852,7 +877,12 @@ public class CASImpl extends AbstractCas
       trackingMarkList = null;
     }
     
-    void switchClassLoader(ClassLoader newClassLoader) {
+    // switches ClassLoader but does not lock CAS
+    void switchClassLoader(ClassLoader newClassLoader, boolean wasLocked) {
+      //    https://issues.apache.org/jira/browse/UIMA-6057
+      SwitchControl switchControlInstance = new SwitchControl(wasLocked);  
+      switchControl.push(switchControlInstance);
+      
       if (null == newClassLoader) { // is null if no cl set
         return;
       }
@@ -865,6 +895,7 @@ public class CASImpl extends AbstractCas
         // System.out.println("Switching to new class loader");
         previousJCasClassLoader = jcasClassLoader;
         jcasClassLoader = newClassLoader;
+        switchControlInstance.wasSwitched = true;
         generators = tsi.getGeneratorsForClassLoader(newClassLoader, true); // true - isPear
         
         assert null == id2tramp;  // is null outside of a pear
@@ -878,15 +909,18 @@ public class CASImpl extends AbstractCas
       }
     }
     
-    void restoreClassLoader() {
+    void restoreClassLoader(boolean empty_switchControl, SwitchControl switchControlInstance) {
       if (null == previousJCasClassLoader) {
         return;
       }
-      // System.out.println("Switching back to previous class loader");
-      jcasClassLoader = previousJCasClassLoader;
-      previousJCasClassLoader = null;
-      generators = baseGenerators;
-      id2tramp = null;
+      
+      if ((empty_switchControl || switchControlInstance.wasSwitched) && previousJCasClassLoader != jcasClassLoader) {
+        // System.out.println("Switching back to previous class loader");
+        jcasClassLoader = previousJCasClassLoader;
+        previousJCasClassLoader = null;
+        generators = baseGenerators;
+        id2tramp = null;
+      }
     }
     
     /**
@@ -1034,6 +1068,11 @@ public class CASImpl extends AbstractCas
   // package protected to let other things share this info
   final SharedViewData svd; // shared view data
 
+  // public only for cross package access
+  public boolean isCasLocked() {
+    return ! svd.flushEnabled;
+  }
+  
   /** The index repository. Referenced by XmiCasSerializer */
   FSIndexRepositoryImpl indexRepository;
 
@@ -1839,7 +1878,7 @@ public class CASImpl extends AbstractCas
 
   @Override
   public void reset() {
-    if (!this.svd.flushEnabled) {
+    if (isCasLocked()) {
       throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
     }
     if (this == this.svd.baseCAS) {
@@ -3814,6 +3853,10 @@ public JCasImpl getJCasImpl() {
   public void setJCasClassLoader(ClassLoader classLoader) {
     this.svd.jcasClassLoader = classLoader;
   }
+  
+  public void switchClassLoader(ClassLoader newClassLoader, boolean wasLocked) {
+    this.svd.switchClassLoader(newClassLoader, wasLocked);
+  }
 
   // Internal use only, public for cross package use
   // Assumes: The JCasClassLoader for a CAS is set up initially when the CAS is
@@ -3833,9 +3876,10 @@ public JCasImpl getJCasImpl() {
   }
 
   public void switchClassLoaderLockCasCL(ClassLoader newClassLoader) {
+    boolean wasLocked = isCasLocked();
     // lock out CAS functions to which annotator should not have access
     enableReset(false);
-    svd.switchClassLoader(newClassLoader);
+    svd.switchClassLoader(newClassLoader, wasLocked);
   }
 
 //  // internal use, public for cross-package ref
@@ -3844,10 +3888,14 @@ public JCasImpl getJCasImpl() {
 //  }
 
   public void restoreClassLoaderUnlockCas() {
-    // unlock CAS functions
-    enableReset(true);
+    boolean empty_switchControl = this.svd.switchControl.isEmpty();
+    SwitchControl switchControlInstance = empty_switchControl ? null :this.svd.switchControl.pop();
+    if (empty_switchControl || ! switchControlInstance.wasLocked) {
+      // unlock CAS functions
+      enableReset(true);
+    }
     // this might be called without the switch ever being called
-    svd.restoreClassLoader();
+    svd.restoreClassLoader(empty_switchControl, switchControlInstance);
 
   }
   
@@ -4832,8 +4880,8 @@ public JCasImpl getJCasImpl() {
    */
   @Override
   public Marker createMarker() {
-    if (!this.svd.flushEnabled) {
-	  throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
+    if (isCasLocked()) {
+	    throw new CASAdminException(CASAdminException.FLUSH_DISABLED);
   	}
   	this.svd.trackingMark = new MarkerImpl(this.getLastUsedFsId() + 1, 
   			this);

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java?rev=1862829&r1=1862828&r2=1862829&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java Tue Jul  9 17:28:30 2019
@@ -88,7 +88,11 @@ public class Util {
     // This cas will be unlocked and its class loader restored when the
     //   next() method returns it
     // Insure the same view is passed for switching/restoring  https://issues.apache.org/jira/browse/UIMA-2211
-//    ci.switchClassLoader(resourceManager.getExtensionClassLoader());    
+    // putting back the switch of class loaders for Pears and other
+    //   possible structures.  Corresponds to v2 impl  7/2019
+    //   See https://issues.apache.org/jira/browse/UIMA-5030   
+    boolean wasLocked = ci.isCasLocked();
+    ci.switchClassLoader(resourceManager.getExtensionClassLoader(), wasLocked);    
     return r;
   }
   

Propchange: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jul  9 17:28:30 2019
@@ -0,0 +1,8 @@
+/incubator/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:932400-933272
+/uima/uimaj/branches/2.6.0-json/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1616936-1617592
+/uima/uimaj/branches/depend-on-july-9-build-tools/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:963167-964468
+/uima/uimaj/branches/depend-on-parent-pom-4/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:961329-961745
+/uima/uimaj/branches/filteredCompress-uima-2498/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1436573-1462257
+/uima/uimaj/branches/mavenAlign/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:933273-944396
+/uima/uimaj/branches/test-parent-pom-6/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1024030
+/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/Util.java:1690273-1862818