You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by vg...@apache.org on 2007/03/02 03:08:51 UTC

svn commit: r513587 - in /xml/xindice/trunk: java/src/org/apache/xindice/core/indexer/IndexManager.java status.xml

Author: vgritsenko
Date: Thu Mar  1 18:08:50 2007
New Revision: 513587

URL: http://svn.apache.org/viewvc?view=rev&rev=513587
Log:
            <action dev="VG" type="fix" fixes-bug="41710" due-to="Natalia Shilenkova">
                Ensure that background indexing processes are complete before
                shutting database down.
            </action>


Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java
    xml/xindice/trunk/status.xml

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java?view=diff&rev=513587&r1=513586&r2=513587
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java Thu Mar  1 18:08:50 2007
@@ -63,7 +63,7 @@
     private static final IndexerInfo[] EMPTY_INDEXERS = new IndexerInfo[0];
 
     private static final String INDEX = "index";
-    private static final String NAME = "name";
+    private static final String NAME  = "name";
     private static final String CLASS = "class";
 
     private static final int STATUS_READY = 0;
@@ -84,6 +84,8 @@
     private SymbolTable symbols;
     private final List newIndexers = new ArrayList(); // of IndexerInfo
 
+    private int taskCount;                      // counter of scheduled tasks
+    private final Object lock = new Object();   // lock object for manipulating taskCounter
 
     /**
      * Create IndexManager for a given collection
@@ -215,6 +217,17 @@
      * Closes all indexers managed by this index manager.
      */
     public synchronized void close() {
+        // wait for all scheduled tasks to finish
+        synchronized(lock) {
+            while (taskCount > 0) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                    // ignore
+                }
+            }
+        }
+        // close all indexers
         for (int i = 0; i < idxList.length; i++) {
             try {
                 idxList[i].indexer.close();
@@ -246,7 +259,26 @@
                 synchronized (newIndexers) {
                     newIndexers.add(info);
                 }
-                timer.schedule(new PopulateIndexersTimerTask(this), 0);
+
+                synchronized (lock) {
+                    taskCount++;
+                    try {
+                        // Schedule new task
+                        timer.schedule(new PopulateIndexersTimerTask(), 0);
+                    } catch (RuntimeException e) {
+                        // If failed to schedule the task, decrease the counter.
+                        taskCount--;
+                        throw e;
+                    } catch (Error e) {
+                        // If failed to schedule the task, decrease the counter.
+                        taskCount--;
+                        throw e;
+                    }
+
+                    if (log.isDebugEnabled()) {
+                        log.debug("Scheduled new task, count is " + taskCount);
+                    }
+                }
             } else {
                 info.status = STATUS_READY;
                 idx.open();
@@ -610,19 +642,23 @@
         }
     }
 
-    private static class PopulateIndexersTimerTask extends TimerTask {
-        private IndexManager mgr;
-
-        public PopulateIndexersTimerTask(IndexManager mgr) {
-            this.mgr = mgr;
-        }
-
+    private class PopulateIndexersTimerTask extends TimerTask {
         public void run() {
             try {
-                mgr.populateNewIndexers();
+                populateNewIndexers();
             } catch (DBException e) {
                 if (log.isWarnEnabled()) {
                     log.warn("ignored exception", e);
+                }
+            } finally {
+                synchronized (lock) {
+                    taskCount--;
+                    if (log.isDebugEnabled()) {
+                        log.debug("Task completed, count is " + taskCount);
+                    }
+                    if (taskCount == 0) {
+                        lock.notifyAll();
+                    }
                 }
             }
         }

Modified: xml/xindice/trunk/status.xml
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/status.xml?view=diff&rev=513587&r1=513586&r2=513587
==============================================================================
--- xml/xindice/trunk/status.xml (original)
+++ xml/xindice/trunk/status.xml Thu Mar  1 18:08:50 2007
@@ -117,7 +117,11 @@
     </todo>
 
     <changes>
-        <release version="1.1b5-dev" date="Feb 22 2007">
+        <release version="1.1b5-dev" date="Mar 1 2007">
+            <action dev="VG" type="fix" fixes-bug="41710" due-to="Natalia Shilenkova">
+                Ensure that background indexing processes are complete before
+                shutting database down.
+            </action>
             <action dev="VG" type="fix" fixes-bug="41605" due-to="Natalia Shilenkova">
                 Fix support of uncompressed collections. Add test cases.
             </action>