diff options
11 files changed, 153 insertions, 32 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF index 626669fce5..b67743a9ea 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.ocl;singleton:=true Bundle-Name: %pluginName -Bundle-Version: 4.3.0.qualifier +Bundle-Version: 4.3.1.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,5 +10,5 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.ocl.ecore;bundle-version="[3.0.0,4.0.0)", org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)" -Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.3.0" +Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.3.1" Automatic-Module-Name: org.eclipse.emf.cdo.server.ocl diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml b/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml index 1d62ef916a..a3ba1a4632 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml +++ b/plugins/org.eclipse.emf.cdo.server.ocl/pom.xml @@ -25,7 +25,7 @@ <groupId>org.eclipse.emf.cdo</groupId> <artifactId>org.eclipse.emf.cdo.server.ocl</artifactId> - <version>4.3.0-SNAPSHOT</version> + <version>4.3.1-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java index abd3bf69fa..d7e445cb32 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java +++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java @@ -19,12 +19,16 @@ import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionCacheAdder; import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; +import org.eclipse.emf.cdo.server.CDOServerUtil; +import org.eclipse.emf.cdo.server.ISession; import org.eclipse.emf.cdo.server.IStoreAccessor; import org.eclipse.emf.cdo.server.StoreThreadLocal; import org.eclipse.emf.cdo.spi.server.InternalRepository; import org.eclipse.emf.cdo.util.ObjectNotFoundException; import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; + import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.spi.cdo.InternalCDOObject; @@ -37,6 +41,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -211,17 +216,16 @@ public class CDOExtentCreator implements OCLExtentCreator } @Override - protected Set<EObject> createExtent(final EClass eClass, final IStoreAccessor accessor, final CDOBranch branch, final long timeStamp, - final AtomicBoolean canceled) + protected Set<EObject> createExtent(EClass eClass, IStoreAccessor accessor, CDOBranch branch, long timeStamp, AtomicBoolean canceled) { return new Set<EObject>() { + private final CountDownLatch emptyKnown = new CountDownLatch(1); + private Iterator<EObject> emptyIterator; private Boolean empty; - private CountDownLatch emptyKnown = new CountDownLatch(1); - @Override public synchronized boolean isEmpty() { @@ -253,11 +257,11 @@ public class CDOExtentCreator implements OCLExtentCreator return it; } - final Object mutex = new Object(); - final LinkedList<CDOID> ids = new LinkedList<>(); - final boolean[] done = { false }; + Object mutex = new Object(); + LinkedList<CDOID> ids = new LinkedList<>(); + boolean[] done = { false }; - Thread thread = new Thread("OCLExtentIterator") + class OCLExtentIterator implements Runnable { @Override public void run() @@ -331,10 +335,12 @@ public class CDOExtentCreator implements OCLExtentCreator mutex.notify(); } } - }; + } + + ISession serverSession = CDOServerUtil.getServerSession(getView()); - thread.setDaemon(true); - thread.start(); + ExecutorService threadPool = ConcurrencyUtil.getExecutorService(getView()); + threadPool.submit(StoreThreadLocal.wrap(serverSession, new OCLExtentIterator())); return new Iterator<EObject>() { diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java index 4cdf8cca0c..5943b22d4f 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java +++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java @@ -23,6 +23,7 @@ import org.eclipse.emf.cdo.common.util.CDOQueryInfo; import org.eclipse.emf.cdo.server.CDOServerUtil; import org.eclipse.emf.cdo.server.IQueryContext; import org.eclipse.emf.cdo.server.IQueryHandler; +import org.eclipse.emf.cdo.server.IView; import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetDataRevisionProvider; import org.eclipse.emf.cdo.spi.server.QueryHandlerFactory; import org.eclipse.emf.cdo.view.CDOView; @@ -115,14 +116,16 @@ public class OCLQueryHandler implements IQueryHandler { readParameters(info.getParameters()); - CDORevisionProvider revisionProvider = context.getView(); + IView serverView = context.getView(); + + CDORevisionProvider revisionProvider = serverView; CDOChangeSetData changeSetData = info.getChangeSetData(); if (changeSetData != null) { revisionProvider = new CDOChangeSetDataRevisionProvider(revisionProvider, changeSetData); } - CDOView view = CDOServerUtil.openView(context.getView().getSession(), context, revisionProvider); + CDOView view = CDOServerUtil.openView(serverView.getSession(), context, revisionProvider); extentMap = createExtentMap(view, changeSetData, context); OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl = createOCL(view, extentMap); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java index edc5021e64..3bbe547a71 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/CommitManager.java @@ -193,12 +193,15 @@ public class CommitManager extends Lifecycle implements InternalCommitManager { try { + StoreThreadLocal.setAccessor(context.getAccessor()); StoreThreadLocal.setCommitContext(context); + context.write(monitor); } finally { - StoreThreadLocal.setCommitContext(null); + StoreThreadLocal.remove(); + if (in instanceof Closeable) { IOUtil.closeSilent((Closeable)in); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java index a6ae723003..209e9979cf 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/QueryManager.java @@ -178,7 +178,11 @@ public class QueryManager extends Lifecycle implements InternalQueryManager { register(queryContext); - Future<?> future = getExecutors().submit(queryContext); + InternalSession session = queryContext.getView().getSession(); + + ExecutorService executors = getExecutors(); + Future<?> future = executors.submit(StoreThreadLocal.wrap(session, queryContext)); + queryContext.setFuture(future); return future; } @@ -309,9 +313,6 @@ public class QueryManager extends Lifecycle implements InternalQueryManager { CDOQueryQueue<Object> queue = queryResult.getQueue(); - InternalSession session = queryResult.getView().getSession(); - StoreThreadLocal.setSession(session); - try { started = true; @@ -338,7 +339,6 @@ public class QueryManager extends Lifecycle implements InternalQueryManager { queue.close(); unregister(this); - StoreThreadLocal.release(); } } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java index 801dc41191..ee4bbea76c 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java @@ -32,6 +32,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionKey; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.common.security.CDOPermission; import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; +import org.eclipse.emf.cdo.server.ISession; import org.eclipse.emf.cdo.server.IStoreAccessor; import org.eclipse.emf.cdo.session.CDOCollectionLoadingPolicy; import org.eclipse.emf.cdo.session.CDORepositoryInfo; @@ -106,7 +107,7 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd private static final CDORevisionPrefetchingPolicy REVISION_PREFETCHING = CDOUtil.createRevisionPrefetchingPolicy(NO_REVISION_PREFETCHING); - private InternalCDOSession session; + private ServerCDOSession session; private CDORevisionProvider revisionProvider; @@ -137,6 +138,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd return session; } + public ISession getServerSession() + { + return session.getInternalSession(); + } + @Override public ExecutorService getExecutorService() { @@ -628,6 +634,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd return this; } + public InternalSession getInternalSession() + { + return internalSession; + } + @Override public String getUserID() { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java index ec6ffbe5ef..64fbde9240 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java @@ -44,6 +44,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.concurrent.ExecutorService; /** * @author Eike Stepper @@ -96,6 +97,12 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio } @Override + public ExecutorService getExecutorService() + { + return session.getExecutorService(); + } + + @Override public InternalSession getSession() { return session; diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java index 55791c35f3..0097fb93e6 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerUtil.java @@ -183,6 +183,19 @@ public final class CDOServerUtil } /** + * @since 4.11 + */ + public static ISession getServerSession(CDOView view) + { + if (view instanceof ServerCDOView) + { + return ((ServerCDOView)view).getServerSession(); + } + + return null; + } + + /** * @since 3.0 */ public static ISessionManager createSessionManager() diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java index 878af30e62..0d5e12a667 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/StoreThreadLocal.java @@ -13,7 +13,11 @@ package org.eclipse.emf.cdo.server; import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext; import org.eclipse.emf.cdo.spi.server.InternalSession; +import org.eclipse.net4j.util.io.IOUtil; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; +import org.eclipse.net4j.util.om.OMPlatform; + +import java.util.concurrent.Callable; /** * Provides server-side consumers with the {@link IStoreAccessor store accessor} that is valid in the context of a @@ -25,28 +29,68 @@ import org.eclipse.net4j.util.lifecycle.LifecycleUtil; */ public final class StoreThreadLocal { - private static final ThreadLocal<InternalSession> SESSION = new InheritableThreadLocal<>(); + private static final boolean DEBUG_SESSION = OMPlatform.INSTANCE.isProperty("org.eclipse.emf.cdo.server.StoreThreadLocal.DEBUG_SESSION"); + + private static final ThreadLocal<InternalSession> SESSION = new ThreadLocal<>(); - private static final ThreadLocal<IStoreAccessor> ACCESSOR = new InheritableThreadLocal<>(); + private static final ThreadLocal<IStoreAccessor> ACCESSOR = new ThreadLocal<>(); - private static final ThreadLocal<IStoreAccessor.CommitContext> COMMIT_CONTEXT = new InheritableThreadLocal<>(); + private static final ThreadLocal<IStoreAccessor.CommitContext> COMMIT_CONTEXT = new ThreadLocal<>(); private StoreThreadLocal() { } /** + * @since 4.11 + */ + public static Runnable wrap(ISession session, Runnable runnable) + { + return () -> { + StoreThreadLocal.setSession((InternalSession)session); + + try + { + runnable.run(); + } + finally + { + StoreThreadLocal.release(); + } + }; + } + + /** + * @since 4.11 + */ + public static <T> Callable<T> wrap(ISession session, Callable<T> callable) + { + return () -> { + StoreThreadLocal.setSession((InternalSession)session); + + try + { + return callable.call(); + } + finally + { + StoreThreadLocal.release(); + } + }; + } + + /** * @since 3.0 */ public static void setSession(InternalSession session) { if (session == null) { - SESSION.remove(); + REMOVE_SESSION(); } else { - SESSION.set(session); + SET_SESSION(session); } ACCESSOR.remove(); @@ -85,12 +129,12 @@ public final class StoreThreadLocal if (accessor == null) { ACCESSOR.remove(); - SESSION.remove(); + REMOVE_SESSION(); } else { ACCESSOR.set(accessor); - SESSION.set(accessor.getSession()); + SET_SESSION(accessor.getSession()); } } @@ -169,10 +213,43 @@ public final class StoreThreadLocal public static void remove() { ACCESSOR.remove(); - SESSION.remove(); + REMOVE_SESSION(); COMMIT_CONTEXT.remove(); } + private static void SET_SESSION(InternalSession session) + { + if (session != null) + { + if (DEBUG_SESSION) + { + InternalSession oldSession = SESSION.get(); + if (oldSession != null) + { + throw new IllegalStateException("Session already registered: " + oldSession); + } + + IOUtil.OUT().println("Set " + session + " --> " + Thread.currentThread().getName()); + } + + SESSION.set(session); + } + } + + private static void REMOVE_SESSION() + { + if (DEBUG_SESSION) + { + InternalSession session = SESSION.get(); + if (session != null) + { + IOUtil.OUT().println(" Remove " + session + " --> " + Thread.currentThread().getName()); + } + } + + SESSION.remove(); + } + /** * An {@link IllegalStateException} that can be thrown from {@link StoreThreadLocal#getSession()}. * diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java index 6d44f04509..80459c638e 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.server.IView; +import org.eclipse.net4j.util.concurrent.IExecutorServiceProvider; import org.eclipse.net4j.util.lifecycle.ILifecycle; import org.eclipse.net4j.util.om.monitor.OMMonitor; @@ -30,7 +31,7 @@ import java.util.List; * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ -public interface InternalView extends IView, ILifecycle +public interface InternalView extends IView, ILifecycle, IExecutorServiceProvider { @Override public InternalSession getSession(); |