Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 77719 invoked from network); 4 Jan 2011 18:02:14 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 4 Jan 2011 18:02:14 -0000 Received: (qmail 52612 invoked by uid 500); 4 Jan 2011 18:02:14 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 52554 invoked by uid 500); 4 Jan 2011 18:02:13 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 52547 invoked by uid 99); 4 Jan 2011 18:02:13 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 04 Jan 2011 18:02:13 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 04 Jan 2011 18:02:10 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 8461923888EC; Tue, 4 Jan 2011 18:01:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1055123 - in /jackrabbit/branches/2.2: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ Date: Tue, 04 Jan 2011 18:01:48 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110104180148.8461923888EC@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jukka Date: Tue Jan 4 18:01:47 2011 New Revision: 1055123 URL: http://svn.apache.org/viewvc?rev=1055123&view=rev Log: 2.2: Merged revisions 1055068, 1055070 and 1055071 (JCR-2836) Modified: jackrabbit/branches/2.2/ (props changed) jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryContext.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransactionContext.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Propchange: jackrabbit/branches/2.2/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 4 18:01:47 2011 @@ -2,4 +2,4 @@ /jackrabbit/sandbox/JCR-1456:774917-886178 /jackrabbit/sandbox/JCR-2170:812417-816332 /jackrabbit/sandbox/tripod-JCR-2209:795441-795863 -/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1044312,1049473,1049491,1049520,1050346 +/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1044312,1049473,1049491,1049520,1050346,1055068,1055070-1055071 Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryContext.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryContext.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryContext.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryContext.java Tue Jan 4 18:01:47 2011 @@ -24,6 +24,7 @@ import org.apache.jackrabbit.core.nodety import org.apache.jackrabbit.core.security.JackrabbitSecurityManager; import org.apache.jackrabbit.core.state.ItemStateCacheFactory; import org.apache.jackrabbit.core.version.InternalVersionManagerImpl; +import org.apache.jackrabbit.util.Timer; /** * Internal component context of a Jackrabbit content repository. @@ -90,6 +91,11 @@ public class RepositoryContext { private ItemStateCacheFactory itemStateCacheFactory; /** + * Repository-wide timer instance. + */ + private final Timer timer = new Timer(false); + + /** * Creates a component context for the given repository. * * @param repository repository instance @@ -109,6 +115,15 @@ public class RepositoryContext { } /** + * Returns the repository-wide timer instance. + * + * @return repository timer + */ + public Timer getTimer() { + return timer; + } + + /** * Returns the namespace registry of this repository. * * @return namespace registry Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Tue Jan 4 18:01:47 2011 @@ -625,9 +625,8 @@ public class RepositoryImpl extends Abst if (systemSearchMgr == null) { if (repConfig.isSearchEnabled()) { systemSearchMgr = new SearchManager( + context, repConfig, - context.getNamespaceRegistry(), - context.getNodeTypeRegistry(), getWorkspaceInfo(wspName).itemStateMgr, context.getInternalVersionManager().getPersistenceManager(), SYSTEM_ROOT_NODE_ID, @@ -1167,6 +1166,8 @@ public class RepositoryImpl extends Abst } } + context.getTimer().cancel(); + log.info("Repository has been shutdown"); } @@ -1851,9 +1852,8 @@ public class RepositoryImpl extends Abst // search manager is lazily instantiated in order to avoid // 'chicken & egg' bootstrap problems searchMgr = new SearchManager( + context, config, - context.getNamespaceRegistry(), - context.getNodeTypeRegistry(), itemStateMgr, persistMgr, context.getRootNodeId(), getSystemSearchManager(getName()), Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java Tue Jan 4 18:01:47 2011 @@ -127,16 +127,16 @@ public class SearchManager implements Sy * excluded from indexing. * @throws RepositoryException if the search manager cannot be initialized */ - public SearchManager(QueryHandlerFactory qhf, - final NamespaceRegistryImpl nsReg, - NodeTypeRegistry ntReg, + public SearchManager( + RepositoryContext repositoryContext, + QueryHandlerFactory qhf, SharedItemStateManager itemMgr, PersistenceManager pm, NodeId rootNodeId, SearchManager parentMgr, NodeId excludedNodeId, Executor executor) throws RepositoryException { - this.nsReg = nsReg; + this.nsReg = repositoryContext.getNamespaceRegistry(); this.itemMgr = itemMgr; this.parentHandler = (parentMgr != null) ? parentMgr.handler : null; @@ -172,7 +172,8 @@ public class SearchManager implements Sy // initialize query handler this.handler = qhf.getQueryHandler(new QueryHandlerContext( - itemMgr, pm, rootNodeId, ntReg, nsReg, + repositoryContext, + itemMgr, pm, rootNodeId, parentHandler, excludedNodeId, executor)); } Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransactionContext.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransactionContext.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransactionContext.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransactionContext.java Tue Jan 4 18:01:47 2011 @@ -55,9 +55,9 @@ public class TransactionContext extends private static final ThreadLocal CURRENT_XID = new ThreadLocal(); /** - * Create a global timer for all transaction contexts. + * Timer for all transaction contexts. */ - private static final Timer TIMER = new Timer(true); + private final Timer timer; /** * Transactional resources. @@ -95,10 +95,13 @@ public class TransactionContext extends * @param resources transactional resources * @param timeout timeout, in seconds */ - public TransactionContext(Xid xid, InternalXAResource[] resources, int timeout) { + public TransactionContext( + Xid xid, InternalXAResource[] resources, + int timeout, Timer timer) { this.xid = xid; this.resources = resources; this.timeout = timeout; + this.timer = timer; } /** @@ -174,7 +177,7 @@ public class TransactionContext extends } // start rollback task in case the commit is never issued - TIMER.schedule(this, timeout * 1000, Integer.MAX_VALUE); + timer.schedule(this, timeout * 1000, Integer.MAX_VALUE); } /** Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java Tue Jan 4 18:01:47 2011 @@ -251,7 +251,9 @@ public class XASessionImpl extends Sessi * @return transaction context */ private TransactionContext createTransaction(Xid xid) { - TransactionContext tx = new TransactionContext(xid, txResources, getTransactionTimeout()); + TransactionContext tx = new TransactionContext( + xid, txResources, + getTransactionTimeout(), repositoryContext.getTimer()); txGlobal.put(xid, tx); return tx; } Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java Tue Jan 4 18:01:47 2011 @@ -21,11 +21,13 @@ import java.util.concurrent.Executor; import org.apache.jackrabbit.core.CachingHierarchyManager; import org.apache.jackrabbit.core.HierarchyManager; import org.apache.jackrabbit.core.NamespaceRegistryImpl; +import org.apache.jackrabbit.core.RepositoryContext; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.core.persistence.PersistenceManager; import org.apache.jackrabbit.core.state.ItemStateManager; import org.apache.jackrabbit.core.state.SharedItemStateManager; +import org.apache.jackrabbit.util.Timer; /** * Acts as an argument for the {@link QueryHandler} to keep the interface @@ -35,6 +37,11 @@ import org.apache.jackrabbit.core.state. public class QueryHandlerContext { /** + * Repository context. + */ + private final RepositoryContext repositoryContext; + + /** * The persistent ItemStateManager */ private final SharedItemStateManager stateMgr; @@ -50,16 +57,6 @@ public class QueryHandlerContext { private final PersistenceManager pm; /** - * The node type registry of the repository - */ - private final NodeTypeRegistry ntRegistry; - - /** - * The namespace registry of the repository. - */ - private final NamespaceRegistryImpl nsRegistry; - - /** * The id of the root node. */ private NodeId rootId; @@ -90,8 +87,6 @@ public class QueryHandlerContext { * @param stateMgr provides persistent item states. * @param pm the underlying persistence manager. * @param rootId the id of the root node. - * @param ntRegistry the node type registry. - * @param nsRegistry the namespace registry. * @param parentHandler the parent query handler or null it * there is no parent handler. * @param excludedNodeId id of the node that should be excluded from @@ -99,21 +94,21 @@ public class QueryHandlerContext { * excluded from indexing. * @param executor background task executor */ - public QueryHandlerContext(SharedItemStateManager stateMgr, - PersistenceManager pm, - NodeId rootId, - NodeTypeRegistry ntRegistry, - NamespaceRegistryImpl nsRegistry, - QueryHandler parentHandler, - NodeId excludedNodeId, - Executor executor) { + public QueryHandlerContext( + RepositoryContext repositoryContext, + SharedItemStateManager stateMgr, + PersistenceManager pm, + NodeId rootId, + QueryHandler parentHandler, + NodeId excludedNodeId, + Executor executor) { + this.repositoryContext = repositoryContext; this.stateMgr = stateMgr; this.hmgr = new CachingHierarchyManager(rootId, stateMgr); this.stateMgr.addListener(hmgr); this.pm = pm; this.rootId = rootId; - this.ntRegistry = ntRegistry; - this.nsRegistry = nsRegistry; + NodeTypeRegistry ntRegistry = repositoryContext.getNodeTypeRegistry(); propRegistry = new PropertyTypeRegistry(ntRegistry); this.parentHandler = parentHandler; this.excludedNodeId = excludedNodeId; @@ -170,7 +165,7 @@ public class QueryHandlerContext { * @return the NodeTypeRegistry for this repository. */ public NodeTypeRegistry getNodeTypeRegistry() { - return ntRegistry; + return repositoryContext.getNodeTypeRegistry(); } /** @@ -178,7 +173,7 @@ public class QueryHandlerContext { * @return the NamespaceRegistryImpl for this repository. */ public NamespaceRegistryImpl getNamespaceRegistry() { - return nsRegistry; + return repositoryContext.getNamespaceRegistry(); } /** @@ -203,7 +198,7 @@ public class QueryHandlerContext { * Destroys this context and releases resources. */ public void destroy() { - ntRegistry.removeListener(propRegistry); + repositoryContext.getNodeTypeRegistry().removeListener(propRegistry); } /** @@ -215,4 +210,13 @@ public class QueryHandlerContext { return executor; } + /** + * Returns the repository timer. + * + * @return repository timer + */ + public Timer getTimer() { + return repositoryContext.getTimer(); + } + } Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java Tue Jan 4 18:01:47 2011 @@ -63,7 +63,7 @@ abstract class AbstractIndex { private static final LoggingPrintStream STREAM_LOGGER = new LoggingPrintStream(); /** Executor with a pool size equal to the number of available processors */ - private static final DynamicPooledExecutor EXECUTOR = new DynamicPooledExecutor(); + private final DynamicPooledExecutor executor = new DynamicPooledExecutor(); /** The currently set IndexWriter or null if none is set */ private IndexWriter indexWriter; @@ -181,7 +181,7 @@ abstract class AbstractIndex { final IndexWriter writer = getIndexWriter(); for (final Document doc : docs) { - EXECUTOR.execute(new Runnable() { + executor.execute(new Runnable() { public void run() { try { // check if text extractor completed its work @@ -409,6 +409,7 @@ abstract class AbstractIndex { directory = null; } } + executor.close(); } /** Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DynamicPooledExecutor.java Tue Jan 4 18:01:47 2011 @@ -30,37 +30,32 @@ import java.util.concurrent.TimeUnit; public class DynamicPooledExecutor implements Executor { /** + * Number of instances that access the underlying executor. + * Used to automatically shutdown the thread pool when unused. + */ + private static int instances = 0; + + /** * The underlying pooled executor. */ - private final ThreadPoolExecutor executor; + private static ThreadPoolExecutor executor = null; /** * The time (in milliseconds) when the pool size was last checked. */ - private long lastCheck; + private static long lastCheck; /** * Creates a new DynamicPooledExecutor. */ public DynamicPooledExecutor() { - ThreadFactory f = new ThreadFactory() { - public Thread newThread(Runnable r) { - Thread t = new Thread(r, "DynamicPooledExecutor"); - t.setDaemon(true); - return t; - } - }; - this.executor = new ThreadPoolExecutor( - 1, Runtime.getRuntime().availableProcessors(), - 500, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue(), f); - this.lastCheck = System.currentTimeMillis(); + startInstance(); } /** * Adjusts the pool size at most once every second. */ - private synchronized void adjustPoolSize() { + private static synchronized ThreadPoolExecutor adjustPoolSize() { long now = System.currentTimeMillis(); if (lastCheck + 1000 < now) { int n = Runtime.getRuntime().availableProcessors(); @@ -69,6 +64,7 @@ public class DynamicPooledExecutor imple } lastCheck = now; } + return executor; } /** @@ -81,7 +77,7 @@ public class DynamicPooledExecutor imple * @param command the command to execute. */ public void execute(Runnable command) { - adjustPoolSize(); + ThreadPoolExecutor executor = adjustPoolSize(); if (executor.getMaximumPoolSize() == 1) { // if there is only one processor execute with current thread command.run(); @@ -90,4 +86,39 @@ public class DynamicPooledExecutor imple } } + public void close() { + stopInstance(); + } + + private static synchronized void startInstance() { + instances++; + if (executor == null) { + ThreadFactory f = new ThreadFactory() { + public Thread newThread(Runnable r) { + Thread t = new Thread(r, "DynamicPooledExecutor"); + t.setDaemon(true); + return t; + } + }; + executor = new ThreadPoolExecutor( + 1, Runtime.getRuntime().availableProcessors(), + 500, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(), f); + lastCheck = System.currentTimeMillis(); + } + } + + private static synchronized void stopInstance() { + instances--; + if (instances == 0) { + executor.shutdown(); + try { + executor.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + // ignore and continue + } + executor = null; + } + } + } Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=1055123&r1=1055122&r2=1055123&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Tue Jan 4 18:01:47 2011 @@ -183,12 +183,7 @@ public class MultiIndex { private final IndexMerger merger; /** - * Timer to schedule flushes of this index after some idle time. - */ - private static final Timer FLUSH_TIMER = new Timer(true); - - /** - * Task that is periodically called by {@link #FLUSH_TIMER} and checks + * Task that is periodically called by the repository timer for checking * if index should be flushed. */ private final Timer.Task flushTask; @@ -275,7 +270,7 @@ public class MultiIndex { this.indexingQueue = new IndexingQueue(store); // open persistent indexes - for (Iterator it = indexNames.iterator(); it.hasNext(); ) { + for (Iterator it = indexNames.iterator(); it.hasNext(); ) { IndexInfo info = (IndexInfo) it.next(); String name = info.getName(); // only open if it still exists @@ -1081,7 +1076,7 @@ public class MultiIndex { private void scheduleFlushTask() { lastFlushTime = System.currentTimeMillis(); - FLUSH_TIMER.schedule(flushTask, 0, 1000); + handler.getContext().getTimer().schedule(flushTask, 0, 1000); } /**