You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by sh...@apache.org on 2008/10/23 08:54:57 UTC

svn commit: r707295 - in /lucene/solr/trunk/contrib/dataimporthandler: CHANGES.txt src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java src/main/java/org/apache/solr/handler/dataimport/DataImporter.java

Author: shalin
Date: Wed Oct 22 23:54:56 2008
New Revision: 707295

URL: http://svn.apache.org/viewvc?rev=707295&view=rev
Log:
SOLR-728 -- Add synchronization to avoid race condition of multiple imports working concurrently

Modified:
    lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt
    lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java
    lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java

Modified: lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt?rev=707295&r1=707294&r2=707295&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt Wed Oct 22 23:54:56 2008
@@ -37,6 +37,9 @@
 2. SOLR-823:  Request parameter variables ${dataimporter.request.xxx} are not resolved
               (Mck SembWever, Noble Paul, shalin)
 
+3. SOLR-728:  Add synchronization to avoid race condition of multiple imports working concurrently
+              (Walter Ferrara, shalin)
+
 Documentation
 ----------------------
 

Modified: lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java?rev=707295&r1=707294&r2=707295&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java Wed Oct 22 23:54:56 2008
@@ -141,7 +141,7 @@
     if (command != null)
       rsp.add("command", command);
 
-    if (requestParams.debug) {
+    if (requestParams.debug && (importer == null || !importer.isBusy())) {
       // Reload the data-config.xml
       importer = null;
       if (requestParams.dataConfig != null) {
@@ -168,7 +168,7 @@
 
     if (command != null && DataImporter.ABORT_CMD.equals(command)) {
       importer.runCmd(requestParams, null, null);
-    } else if (importer.getStatus() != DataImporter.Status.IDLE) {
+    } else if (importer.isBusy()) {
       message = DataImporter.MSG.CMD_RUNNING;
     } else if (command != null) {
       if (DataImporter.FULL_IMPORT_CMD.equals(command)
@@ -202,8 +202,7 @@
         message = DataImporter.MSG.CONFIG_RELOADED;
       }
     }
-    rsp.add("status", importer.getStatus() == DataImporter.Status.IDLE ? "idle"
-            : "busy");
+    rsp.add("status", importer.isBusy() ? "busy" : "idle");
     rsp.add("importResponse", message);
     rsp.add("statusMessages", importer.getStatusMessages());
 

Modified: lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java?rev=707295&r1=707294&r2=707295&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java Wed Oct 22 23:54:56 2008
@@ -32,6 +32,8 @@
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,6 +77,8 @@
 
   private SolrCore core;
 
+  private ReentrantLock importLock = new ReentrantLock();
+
   /**
    * Only for testing purposes
    */
@@ -318,6 +322,10 @@
     this.status = status;
   }
 
+  public boolean isBusy() {
+    return importLock.isLocked();
+  }
+
   public void doFullImport(SolrWriter writer, RequestParams requestParams,
                            Map<String, String> variables) {
     LOG.info("Starting Full Import");
@@ -376,18 +384,24 @@
     }.start();
   }
 
-  void runCmd(RequestParams reqParams, SolrWriter sw,
-              Map<String, String> variables) {
-    String command = reqParams.command;
-    Date lastModified = sw.loadIndexStartTime();
-    setLastIndexTime(lastModified);
-    if (command.equals("full-import")) {
-      doFullImport(sw, reqParams, variables);
-    } else if (command.equals(DELTA_IMPORT_CMD)) {
-      doDeltaImport(sw, reqParams, variables);
-    } else if (command.equals(ABORT_CMD)) {
-      if (docBuilder != null)
-        docBuilder.abort();
+  void runCmd(RequestParams reqParams, SolrWriter sw, Map<String, String> variables) {
+    if (importLock.isLocked())
+      return;
+    importLock.lock();
+    try {
+      String command = reqParams.command;
+      Date lastModified = sw.loadIndexStartTime();
+      setLastIndexTime(lastModified);
+      if (command.equals("full-import")) {
+        doFullImport(sw, reqParams, variables);
+      } else if (command.equals(DELTA_IMPORT_CMD)) {
+        doDeltaImport(sw, reqParams, variables);
+      } else if (command.equals(ABORT_CMD)) {
+        if (docBuilder != null)
+          docBuilder.abort();
+      }
+    } finally {
+      importLock.unlock();
     }
   }