Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 43312 invoked from network); 27 Apr 2007 12:34:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 27 Apr 2007 12:34:04 -0000 Received: (qmail 87000 invoked by uid 500); 27 Apr 2007 12:34:10 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 86911 invoked by uid 500); 27 Apr 2007 12:34:10 -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 86902 invoked by uid 99); 27 Apr 2007 12:34:10 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Apr 2007 05:34:10 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Apr 2007 05:34:02 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id BB4051A9838; Fri, 27 Apr 2007 05:33:42 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r533080 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene: IndexMerger.java MultiIndex.java Recovery.java Date: Fri, 27 Apr 2007 12:33:42 -0000 To: commits@jackrabbit.apache.org From: mreutegg@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070427123342.BB4051A9838@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mreutegg Date: Fri Apr 27 05:33:41 2007 New Revision: 533080 URL: http://svn.apache.org/viewvc?view=rev&rev=533080 Log: JCR-778: Error on query initialization - intermittent Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Recovery.java Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java?view=diff&rev=533080&r1=533079&r2=533080 ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java Fri Apr 27 05:33:41 2007 @@ -95,6 +95,11 @@ private final Sync indexReplacement = new Mutex(); /** + * When released, indicates that this index merger is idle. + */ + private final Sync mergerIdle = new Mutex(); + + /** * Creates an IndexMerger. * * @param multiIndex the MultiIndex. @@ -103,6 +108,12 @@ this.multiIndex = multiIndex; setName("IndexMerger"); setDaemon(true); + try { + mergerIdle.acquire(); + } catch (InterruptedException e) { + // will never happen, lock is free upon construction + throw new InternalError("Unable to acquire mutex after construction"); + } } /** @@ -189,6 +200,17 @@ } /** + * When the calling thread returns this index merger will be idle, that is + * there will be no merge tasks pending anymore. The method returns immediately + * if there are currently no tasks pending at all. + */ + void waitUntilIdle() throws InterruptedException { + mergerIdle.acquire(); + // and immediately release again + mergerIdle.release(); + } + + /** * Signals this IndexMerger to stop and waits until it * has terminated. */ @@ -233,9 +255,23 @@ */ public void run() { for (;;) { + boolean isIdle = false; + if (mergeTasks.size() == 0) { + mergerIdle.release(); + isIdle = true; + } Merge task = (Merge) mergeTasks.remove(); if (task == QUIT) { + mergerIdle.release(); break; + } + if (isIdle) { + try { + mergerIdle.acquire(); + } catch (InterruptedException e) { + Thread.interrupted(); + log.warn("Unable to acquire mergerIdle sync"); + } } log.debug("accepted merge request"); Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?view=diff&rev=533080&r1=533079&r2=533080 ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Fri Apr 27 05:33:41 2007 @@ -299,6 +299,16 @@ // now that we are ready, start index merger merger.start(); + if (redoLogApplied) { + // wait for the index merge to finish pending jobs + try { + merger.waitUntilIdle(); + } catch (InterruptedException e) { + // move on + } + flush(); + } + // do an initial index if there are no indexes at all if (indexNames.size() == 0) { reindexing = true; @@ -572,7 +582,7 @@ try { // if we are reindexing there is already an active transaction if (!reindexing) { - executeAndLog(new Start(Action.INTERNAL_TRANSACTION)); + executeAndLog(new Start(Action.INTERNAL_TRANS_REPL_INDEXES)); } // delete obsolete indexes Set names = new HashSet(Arrays.asList(obsoleteIndexes)); @@ -1173,12 +1183,17 @@ public static final int TYPE_DELETE_INDEX = 7; /** - * Transaction identifier for internal actions like index replace or - * volatile index commit triggered by timer thread. + * Transaction identifier for internal actions like volatile index + * commit triggered by timer thread. */ static final long INTERNAL_TRANSACTION = -1; /** + * Transaction identifier for internal action that replaces indexs. + */ + static final long INTERNAL_TRANS_REPL_INDEXES = -2; + + /** * The id of the transaction that executed this action. */ private final long transactionId; @@ -1567,6 +1582,7 @@ public void undo(MultiIndex index) throws IOException { if (index.hasIndex(indexName)) { PersistentIndex idx = index.getOrCreateIndex(indexName, false); + idx.close(); index.deleteIndex(idx); } } Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Recovery.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Recovery.java?view=diff&rev=533080&r1=533079&r2=533080 ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Recovery.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Recovery.java Fri Apr 27 05:33:41 2007 @@ -142,6 +142,14 @@ case MultiIndex.Action.TYPE_CREATE_INDEX: case MultiIndex.Action.TYPE_DELETE_INDEX: case MultiIndex.Action.TYPE_DELETE_NODE: + // ignore actions by the index merger. + // the previously created index of a merge has been + // deleted because it was considered dirty. + // we are conservative here and let the index merger do + // its work again. + if (a.getTransactionId() == MultiIndex.Action.INTERNAL_TRANS_REPL_INDEXES) { + continue; + } a.execute(index); } } @@ -152,6 +160,10 @@ if (losers.contains(new Long(a.getTransactionId()))) { break; } else { + // ignore actions by the index merger. + if (a.getTransactionId() == MultiIndex.Action.INTERNAL_TRANS_REPL_INDEXES) { + continue; + } a.execute(index); } }