Yonik Seeley-2 wrote:
> 
> ...your code snippit elided and edited below ...
> 



Don't take this code as correct (or even compiling) but is this the essence? 
I moved shared access to the writer inside the read lock and kept the other
non-commit bits to the write lock.  I'd need to rethink the locking in a
more fundamental way but is this close to idea? 



 public void commit(CommitUpdateCommand cmd) throws IOException {

    if (cmd.optimize) {
      optimizeCommands.incrementAndGet();
    } else {
      commitCommands.incrementAndGet();
    }

    Future[] waitSearcher = null;
    if (cmd.waitSearcher) {
      waitSearcher = new Future[1];
    }

    boolean error=true;
    iwCommit.lock();
    try {
      log.info("start "+cmd);

      if (cmd.optimize) {
        closeSearcher();
        openWriter();
        writer.optimize(cmd.maxOptimizeSegments);
      }
    finally {
      iwCommit.unlock();
     }


      iwAccess.lock();     
      try
     {
      writer.commit();
     }
     finally
     {
      iwAccess.unlock();     
     }

      iwCommit.lock();     
      try
     {
      callPostCommitCallbacks();
      if (cmd.optimize) {
        callPostOptimizeCallbacks();
      }
      // open a new searcher in the sync block to avoid opening it
      // after a deleteByQuery changed the index, or in between deletes
      // and adds of another commit being done.
      core.getSearcher(true,false,waitSearcher);

      // reset commit tracking
      tracker.didCommit();

      log.info("end_commit_flush");

      error=false;
    }
    finally {
      iwCommit.unlock();
      addCommands.set(0);
      deleteByIdCommands.set(0);
      deleteByQueryCommands.set(0);
      numErrors.set(error ? 1 : 0);
    }

    // if we are supposed to wait for the searcher to be registered, then we
should do it
    // outside of the synchronized block so that other update operations can
proceed.
    if (waitSearcher!=null && waitSearcher[0] != null) {
       try {
        waitSearcher[0].get();
      } catch (InterruptedException e) {
        SolrException.log(log,e);
      } catch (ExecutionException e) {
        SolrException.log(log,e);
      }
    }
  }



-- 
View this message in context: 
http://www.nabble.com/Autocommit-blocking-adds---AutoCommit-Speedup--tp23435224p23454419.html
Sent from the Solr - User mailing list archive at Nabble.com.

Reply via email to