You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2013/01/08 04:40:37 UTC

svn commit: r1430130 [22/27] - in /lucene/dev/branches/lucene4547: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/libraries/ dev-tools/maven/ dev-tools/maven/solr/ dev-tools/maven/solr/contrib/analysis-extras/ dev-tools/maven/solr/contrib/cluste...

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/QueryConverter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/QueryConverter.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/QueryConverter.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/QueryConverter.java Tue Jan  8 03:40:16 2013
@@ -76,6 +76,7 @@ public abstract class QueryConverter imp
    * </p>
    */
   public static final int TERM_IN_BOOLEAN_QUERY_FLAG = 131072;
+  @Override
   public void init(NamedList args) {
     this.args = args;
   }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/SpellCheckCollation.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/SpellCheckCollation.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/SpellCheckCollation.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/spelling/SpellCheckCollation.java Tue Jan  8 03:40:16 2013
@@ -25,6 +25,7 @@ public class SpellCheckCollation impleme
   private int internalRank;
   private String collationQuery;
 
+  @Override
   public int compareTo(SpellCheckCollation scc) {
     int c = new Integer(internalRank).compareTo(scc.internalRank);
     if (c == 0) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/CommitTracker.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/CommitTracker.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/CommitTracker.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/CommitTracker.java Tue Jan  8 03:40:16 2013
@@ -192,6 +192,7 @@ public final class CommitTracker impleme
   }
   
   /** This is the worker part for the ScheduledFuture **/
+  @Override
   public void run() {
     synchronized (this) {
       // log.info("###start commit. pending=null");

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java Tue Jan  8 03:40:16 2013
@@ -74,6 +74,11 @@ public final class DefaultSolrCoreState 
   @Override
   public synchronized RefCounted<IndexWriter> getIndexWriter(SolrCore core)
       throws IOException {
+    
+    if (closed) {
+      throw new RuntimeException("SolrCoreState already closed");
+    }
+    
     synchronized (writerPauseLock) {
       if (core == null) {
         // core == null is a signal to just return the current writer, or null
@@ -84,8 +89,12 @@ public final class DefaultSolrCoreState 
       
       while (pauseWriter) {
         try {
-          writerPauseLock.wait();
+          writerPauseLock.wait(100);
         } catch (InterruptedException e) {}
+        
+        if (closed) {
+          throw new RuntimeException("Already closed");
+        }
       }
       
       if (indexWriter == null) {
@@ -128,8 +137,12 @@ public final class DefaultSolrCoreState 
       log.info("Waiting until IndexWriter is unused... core=" + coreName);
       while (!writerFree) {
         try {
-          writerPauseLock.wait();
+          writerPauseLock.wait(100);
         } catch (InterruptedException e) {}
+        
+        if (closed) {
+          throw new RuntimeException("SolrCoreState already closed");
+        }
       }
 
       try {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java Tue Jan  8 03:40:16 2013
@@ -746,30 +746,37 @@ public class DirectUpdateHandler2 extend
   // SolrInfoMBean stuff: Statistics and Module Info
   /////////////////////////////////////////////////////////////////////
 
+  @Override
   public String getName() {
     return DirectUpdateHandler2.class.getName();
   }
 
+  @Override
   public String getVersion() {
     return SolrCore.version;
   }
 
+  @Override
   public String getDescription() {
     return "Update handler that efficiently directly updates the on-disk main lucene index";
   }
 
+  @Override
   public Category getCategory() {
     return Category.UPDATEHANDLER;
   }
 
+  @Override
   public String getSource() {
     return "$URL$";
   }
 
+  @Override
   public URL[] getDocs() {
     return null;
   }
 
+  @Override
   public NamedList getStatistics() {
     NamedList lst = new SimpleOrderedMap();
     lst.add("commits", commitCommands.get());

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/PeerSync.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/PeerSync.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/PeerSync.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/PeerSync.java Tue Jan  8 03:40:16 2013
@@ -443,10 +443,11 @@ public class PeerSync  {
 
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.set(DISTRIB_UPDATE_PARAM, FROMLEADER.toString());
-    // params.set("peersync",true); // debugging
+    params.set("peersync",true); // debugging
     SolrQueryRequest req = new LocalSolrQueryRequest(uhandler.core, params);
     SolrQueryResponse rsp = new SolrQueryResponse();
 
+    // TODO: use the standard update processor chain now that it has support to skip processors before the DistributedUpdateProcessor?
     RunUpdateProcessorFactory runFac = new RunUpdateProcessorFactory();
     DistributedUpdateProcessorFactory magicFac = new DistributedUpdateProcessorFactory();
     runFac.init(new NamedList());

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java Tue Jan  8 03:40:16 2013
@@ -30,11 +30,8 @@ import java.util.concurrent.ExecutionExc
 import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ThreadPoolExecutor;
 
-import org.apache.http.client.HttpClient;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
 import org.apache.solr.client.solrj.request.UpdateRequestExt;
@@ -43,6 +40,7 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.Diagnostics;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.util.AdjustableSemaphore;
 import org.slf4j.Logger;
@@ -50,19 +48,11 @@ import org.slf4j.LoggerFactory;
 
 
 public class SolrCmdDistributor {
-  private static final int MAX_RETRIES_ON_FORWARD = 10;
+  private static final int MAX_RETRIES_ON_FORWARD = 15;
   public static Logger log = LoggerFactory.getLogger(SolrCmdDistributor.class);
 
-  static final HttpClient client;
   static AdjustableSemaphore semaphore = new AdjustableSemaphore(8);
   
-  static {
-    ModifiableSolrParams params = new ModifiableSolrParams();
-    params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 500);
-    params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 16);
-    client = HttpClientUtil.createClient(params);
-  }
-  
   CompletionService<Request> completionService;
   Set<Future<Request>> pending;
   
@@ -73,6 +63,7 @@ public class SolrCmdDistributor {
   
   private final Map<Node,List<AddRequest>> adds = new HashMap<Node,List<AddRequest>>();
   private final Map<Node,List<DeleteRequest>> deletes = new HashMap<Node,List<DeleteRequest>>();
+  private UpdateShardHandler updateShardHandler;
   
   class AddRequest {
     AddUpdateCommand cmd;
@@ -88,14 +79,15 @@ public class SolrCmdDistributor {
     public boolean abortCheck();
   }
   
-  public SolrCmdDistributor(int numHosts, ThreadPoolExecutor executor) {
+  public SolrCmdDistributor(int numHosts, UpdateShardHandler updateShardHandler) {
     int maxPermits = Math.max(16, numHosts * 16);
     // limits how many tasks can actually execute at once
     if (maxPermits != semaphore.getMaxPermits()) {
       semaphore.setMaxPermits(maxPermits);
     }
-
-    completionService = new ExecutorCompletionService<Request>(executor);
+    
+    this.updateShardHandler = updateShardHandler;
+    completionService = new ExecutorCompletionService<Request>(updateShardHandler.getCmdDistribExecutor());
     pending = new HashSet<Future<Request>>();
   }
   
@@ -329,7 +321,7 @@ public class SolrCmdDistributor {
           }
   
           HttpSolrServer server = new HttpSolrServer(fullUrl,
-              client);
+              updateShardHandler.getHttpClient());
           
           if (Thread.currentThread().isInterrupted()) {
             clonedRequest.rspCode = 503;
@@ -363,11 +355,13 @@ public class SolrCmdDistributor {
       pending.add(completionService.submit(task));
     } catch (RejectedExecutionException e) {
       semaphore.release();
-      throw e;
+      throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE, "Shutting down", e);
     }
     
   }
 
+  public static Diagnostics.Callable testing_errorHook;  // called on error when forwarding request.  Currently data=[this, Request]
+
   void checkResponses(boolean block) {
 
     while (pending != null && pending.size() > 0) {
@@ -381,7 +375,9 @@ public class SolrCmdDistributor {
           Request sreq = future.get();
           if (sreq.rspCode != 0) {
             // error during request
-            
+
+            if (testing_errorHook != null) Diagnostics.call(testing_errorHook, this, sreq);
+
             // if there is a retry url, we want to retry...
             boolean isRetry = sreq.node.checkRetry();
             boolean doRetry = false;
@@ -411,7 +407,6 @@ public class SolrCmdDistributor {
               SolrException.log(SolrCmdDistributor.log, "forwarding update to " + sreq.node.getUrl() + " failed - retrying ... ");
               Thread.sleep(500);
               submit(sreq);
-              checkResponses(block);
             } else {
               Exception e = sreq.exception;
               Error error = new Error();
@@ -460,26 +455,20 @@ public class SolrCmdDistributor {
   }
 
   public static class StdNode extends Node {
-    protected String url;
-    protected String baseUrl;
-    protected String coreName;
-    private ZkCoreNodeProps nodeProps;
+    protected ZkCoreNodeProps nodeProps;
 
     public StdNode(ZkCoreNodeProps nodeProps) {
-      this.url = nodeProps.getCoreUrl();
-      this.baseUrl = nodeProps.getBaseUrl();
-      this.coreName = nodeProps.getCoreName();
       this.nodeProps = nodeProps;
     }
     
     @Override
     public String getUrl() {
-      return url;
+      return nodeProps.getCoreUrl();
     }
     
     @Override
     public String toString() {
-      return this.getClass().getSimpleName() + ": " + url;
+      return this.getClass().getSimpleName() + ": " + nodeProps.getCoreUrl();
     }
 
     @Override
@@ -489,18 +478,21 @@ public class SolrCmdDistributor {
 
     @Override
     public String getBaseUrl() {
-      return baseUrl;
+      return nodeProps.getBaseUrl();
     }
 
     @Override
     public String getCoreName() {
-      return coreName;
+      return nodeProps.getCoreName();
     }
 
     @Override
     public int hashCode() {
       final int prime = 31;
       int result = 1;
+      String baseUrl = nodeProps.getBaseUrl();
+      String coreName = nodeProps.getCoreName();
+      String url = nodeProps.getCoreUrl();
       result = prime * result + ((baseUrl == null) ? 0 : baseUrl.hashCode());
       result = prime * result + ((coreName == null) ? 0 : coreName.hashCode());
       result = prime * result + ((url == null) ? 0 : url.hashCode());
@@ -513,18 +505,22 @@ public class SolrCmdDistributor {
       if (obj == null) return false;
       if (getClass() != obj.getClass()) return false;
       StdNode other = (StdNode) obj;
+      String baseUrl = nodeProps.getBaseUrl();
+      String coreName = nodeProps.getCoreName();
+      String url = nodeProps.getCoreUrl();
       if (baseUrl == null) {
-        if (other.baseUrl != null) return false;
-      } else if (!baseUrl.equals(other.baseUrl)) return false;
+        if (other.nodeProps.getBaseUrl() != null) return false;
+      } else if (!baseUrl.equals(other.nodeProps.getBaseUrl())) return false;
       if (coreName == null) {
-        if (other.coreName != null) return false;
-      } else if (!coreName.equals(other.coreName)) return false;
+        if (other.nodeProps.getCoreName() != null) return false;
+      } else if (!coreName.equals(other.nodeProps.getCoreName())) return false;
       if (url == null) {
-        if (other.url != null) return false;
-      } else if (!url.equals(other.url)) return false;
+        if (other.nodeProps.getCoreUrl() != null) return false;
+      } else if (!url.equals(other.nodeProps.getCoreUrl())) return false;
       return true;
     }
 
+    @Override
     public ZkCoreNodeProps getNodeProps() {
       return nodeProps;
     }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java Tue Jan  8 03:40:16 2013
@@ -151,7 +151,7 @@ public class SolrIndexSplitter {
       // TODO: hook in custom hashes (or store hashes)
       int hash = Hash.murmurhash3_x86_32(term.bytes, term.offset, term.length, 0);
 
-      docsEnum = termsEnum.docs(liveDocs, docsEnum, 0x0);
+      docsEnum = termsEnum.docs(liveDocs, docsEnum, DocsEnum.FLAG_NONE);
       for (;;) {
         int doc = docsEnum.nextDoc();
         if (doc == DocsEnum.NO_MORE_DOCS) break;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java Tue Jan  8 03:40:16 2013
@@ -30,6 +30,7 @@ import org.apache.lucene.index.IndexWrit
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.InfoStream;
 import org.apache.lucene.util.PrintStreamInfoStream;
+import org.apache.lucene.util.ThreadInterruptedException;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.schema.IndexSchema;
 import org.slf4j.Logger;
@@ -137,18 +138,36 @@ public class SolrIndexWriter extends Ind
   public void close() throws IOException {
     log.debug("Closing Writer " + name);
     Directory directory = getDirectory();
-    final InfoStream infoStream = isClosed ? null : getConfig().getInfoStream();    
+    final InfoStream infoStream = isClosed ? null : getConfig().getInfoStream();
     try {
-      super.close();
+      while (true) {
+        try {
+          super.close();
+        } catch (ThreadInterruptedException e) {
+          // don't allow interruption
+          continue;
+        } catch (Throwable t) {
+          log.error("Error closing IndexWriter, trying rollback", t);
+          super.rollback();
+        }
+        if (IndexWriter.isLocked(directory)) {
+          try {
+            IndexWriter.unlock(directory);
+          } catch (Throwable t) {
+            log.error("Coud not unlock directory after seemingly failed IndexWriter#close()", t);
+          }
+        }
+        break;
+      }
     } finally {
-      if(infoStream != null) {
+      if (infoStream != null) {
         infoStream.close();
       }
       
       isClosed = true;
-
+      
       directoryFactory.release(directory);
-     
+      
       numCloses.incrementAndGet();
     }
   }
@@ -156,7 +175,15 @@ public class SolrIndexWriter extends Ind
   @Override
   public void rollback() throws IOException {
     try {
-      super.rollback();
+      while (true) {
+        try {
+          super.rollback();
+        } catch (ThreadInterruptedException e) {
+          // don't allow interruption
+          continue;
+        }
+        break;
+      }
     } finally {
       isClosed = true;
       directoryFactory.release(getDirectory());

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/TransactionLog.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/TransactionLog.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/TransactionLog.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/TransactionLog.java Tue Jan  8 03:40:16 2013
@@ -556,6 +556,7 @@ public class TransactionLog {
     }
   }
 
+  @Override
   public String toString() {
     return "tlog{file=" + tlogFile.toString() + " refcount=" + refcount.get() + "}";
   }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateCommand.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateCommand.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateCommand.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateCommand.java Tue Jan  8 03:40:16 2013
@@ -44,7 +44,19 @@ public abstract class UpdateCommand impl
 
   @Override
   public String toString() {
-    return name() + "{flags="+flags+",_version_="+version;
+    StringBuilder sb  = new StringBuilder(50);
+    sb.append(name());
+    sb.append('{');
+    boolean needComma = false;
+    if (flags != 0) {
+      sb.append("flags=").append(Integer.toHexString(flags));
+      needComma = true;
+    }
+    if (version != 0) {
+      if (needComma) sb.append(',');
+      sb.append("_version_=").append(version);
+    }
+    return sb.toString();
   }
 
   public long getVersion() {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateHandler.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateHandler.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateHandler.java Tue Jan  8 03:40:16 2013
@@ -18,6 +18,7 @@
 package org.apache.solr.update;
 
 
+import java.io.File;
 import java.io.IOException;
 import java.util.Vector;
 
@@ -53,7 +54,7 @@ public abstract class UpdateHandler impl
   protected Vector<SolrEventListener> softCommitCallbacks = new Vector<SolrEventListener>();
   protected Vector<SolrEventListener> optimizeCallbacks = new Vector<SolrEventListener>();
 
-  protected UpdateLog ulog;
+  protected volatile UpdateLog ulog;
 
   private void parseEventListeners() {
     final Class<SolrEventListener> clazz = SolrEventListener.class;
@@ -73,8 +74,7 @@ public abstract class UpdateHandler impl
   }
 
 
-  private void initLog() {
-    PluginInfo ulogPluginInfo = core.getSolrConfig().getPluginInfo(UpdateLog.class.getName());
+  private void initLog(PluginInfo ulogPluginInfo) {
     if (ulogPluginInfo != null && ulogPluginInfo.isEnabled()) {
       ulog = new UpdateLog();
       ulog.init(ulogPluginInfo);
@@ -83,6 +83,21 @@ public abstract class UpdateHandler impl
     }
   }
 
+  // not thread safe - for startup
+  private void clearLog(PluginInfo ulogPluginInfo) {
+    if (ulogPluginInfo == null) return;
+    File tlogDir = UpdateLog.getTlogDir(core, ulogPluginInfo);
+    if (tlogDir.exists()) {
+      String[] files = UpdateLog.getLogList(tlogDir);
+      for (String file : files) {
+        File f = new File(file);
+        boolean s = f.delete();
+        if (!s) {
+          log.error("Could not remove tlog file:" + f);
+        }
+      }
+    }
+  }
 
   protected void callPostCommitCallbacks() {
     for (SolrEventListener listener : commitCallbacks) {
@@ -108,7 +123,11 @@ public abstract class UpdateHandler impl
     idField = schema.getUniqueKeyField();
     idFieldType = idField!=null ? idField.getType() : null;
     parseEventListeners();
-    initLog();
+    PluginInfo ulogPluginInfo = core.getSolrConfig().getPluginInfo(UpdateLog.class.getName());
+    if (!core.isReloaded() && !core.getDirectoryFactory().isPersistent()) {
+      clearLog(ulogPluginInfo);
+    }
+    initLog(ulogPluginInfo);
   }
 
   /**

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateLog.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateLog.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateLog.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/UpdateLog.java Tue Jan  8 03:40:16 2013
@@ -23,6 +23,7 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
@@ -125,6 +126,7 @@ public class UpdateLog implements Plugin
 
   // keep track of deletes only... this is not updated on an add
   private LinkedHashMap<BytesRef, LogPtr> oldDeletes = new LinkedHashMap<BytesRef, LogPtr>(numDeletesToKeep) {
+    @Override
     protected boolean removeEldestEntry(Map.Entry eldest) {
       return size() > numDeletesToKeep;
     }
@@ -167,6 +169,7 @@ public class UpdateLog implements Plugin
       this.version = version;
     }
 
+    @Override
     public String toString() {
       return "LogPtr(" + pointer + ")";
     }
@@ -177,12 +180,19 @@ public class UpdateLog implements Plugin
     return versionInfo;
   }
 
+  @Override
   public void init(PluginInfo info) {
     dataDir = (String)info.initArgs.get("dir");
     defaultSyncLevel = SyncLevel.getSyncLevel((String)info.initArgs.get("syncLevel"));
   }
 
   public void init(UpdateHandler uhandler, SolrCore core) {
+    // ulogDir from CoreDescriptor overrides
+    String ulogDir = core.getCoreDescriptor().getUlogDir();
+    if (ulogDir != null) {
+      dataDir = ulogDir;
+    }
+    
     if (dataDir == null || dataDir.length()==0) {
       dataDir = core.getDataDir();
     }
@@ -312,6 +322,7 @@ public class UpdateLog implements Plugin
   public static String[] getLogList(File directory) {
     final String prefix = TLOG_NAME+'.';
     String[] names = directory.list(new FilenameFilter() {
+      @Override
       public boolean accept(File dir, String name) {
         return name.startsWith(prefix);
       }
@@ -803,10 +814,14 @@ public class UpdateLog implements Plugin
   }
   
   public void close(boolean committed) {
+    close(committed, false);
+  }
+  
+  public void close(boolean committed, boolean deleteOnClose) {
     synchronized (this) {
       try {
-        recoveryExecutor.shutdownNow();
-      } catch (Exception e) {
+        ExecutorUtil.shutdownNowAndAwaitTermination(recoveryExecutor);
+      } catch (Throwable e) {
         SolrException.log(log, e);
       }
 
@@ -1097,6 +1112,7 @@ public class UpdateLog implements Plugin
     return state;
   }
 
+  @Override
   public String toString() {
     return "FSUpdateLog{state="+getState()+", tlog="+tlog+"}";
   }
@@ -1378,6 +1394,22 @@ public class UpdateLog implements Plugin
       }
     }
   }
+  
+  public static File getTlogDir(SolrCore core, PluginInfo info) {
+    String dataDir = (String) info.initArgs.get("dir");
+    if (dataDir == null) {
+      String ulogDir = core.getCoreDescriptor().getUlogDir();
+      if (ulogDir != null) {
+        dataDir = ulogDir;
+      }
+      
+      if (dataDir == null || dataDir.length() == 0) {
+        dataDir = core.getDataDir();
+      }
+    }
+    return new File(dataDir, TLOG_NAME);
+  }
+  
 }
 
 

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/VersionInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/VersionInfo.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/VersionInfo.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/VersionInfo.java Tue Jan  8 03:40:16 2013
@@ -71,7 +71,7 @@ public class VersionInfo {
     if ( sf.multiValued() ) {
       throw new SolrException
         (SolrException.ErrorCode.SERVER_ERROR, 
-         errPrefix + " (" + VERSION_FIELD + " is not multiValued");
+         errPrefix + " (" + VERSION_FIELD + " is multiValued");
     }
     
     return sf;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -197,6 +197,7 @@ public class CloneFieldUpdateProcessorFa
     super.init(args);
   }
 
+  @Override
   public void inform(final SolrCore core) {
     
     final IndexSchema schema = core.getSchema();

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -51,18 +51,15 @@ import org.apache.commons.lang.StringUti
  * </p>
  *
  * <pre class="prettyprint">
- *  &lt;updateRequestProcessorChain&gt;
- *    &lt;processor class="solr.ConcatFieldUpdateProcessorFactory"&gt;
- *      &lt;str name="delimiter"&gt;; &lt;/str&gt;
- *      &lt;lst name="exclude"&gt;
- *        &lt;str name="fieldName"&gt;primary_author&lt;/str&gt;
- *      &lt;/lst&gt;
- *    &lt;/processor&gt;
- *    &lt;processor class="solr.FirstFieldValueUpdateProcessorFactory"&gt;
- *      &lt;str name="fieldName"&gt;primary_author&lt;/str&gt;
- *    &lt;/processor&gt;
- *  &lt;/updateRequestProcessorChain&gt;
- * </pre>
+ * &lt;processor class="solr.ConcatFieldUpdateProcessorFactory"&gt;
+ *   &lt;str name="delimiter"&gt;; &lt;/str&gt;
+ *   &lt;lst name="exclude"&gt;
+ *     &lt;str name="fieldName"&gt;primary_author&lt;/str&gt;
+ *   &lt;/lst&gt;
+ * &lt;/processor&gt;
+ * &lt;processor class="solr.FirstFieldValueUpdateProcessorFactory"&gt;
+ *   &lt;str name="fieldName"&gt;primary_author&lt;/str&gt;
+ * &lt;/processor&gt;</pre>
  */
 public final class ConcatFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
@@ -82,6 +79,7 @@ public final class ConcatFieldUpdateProc
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected SolrInputField mutate(final SolrInputField src) {
         if (src.getValueCount() <= 1) return src;
 
@@ -99,6 +97,7 @@ public final class ConcatFieldUpdateProc
 
     final IndexSchema schema = core.getSchema();
     return new FieldMutatingUpdateProcessor.FieldNameSelector() {
+      @Override
       public boolean shouldMutate(final String fieldName) {
 
         // first check type since it should be fastest

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CountFieldValuesUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CountFieldValuesUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CountFieldValuesUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/CountFieldValuesUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -50,20 +50,17 @@ import org.apache.commons.lang.StringUti
  * </p>
  *
  * <pre class="prettyprint">
- * &lt;updateRequestProcessorChain&gt;
- *   &lt;processor class="solr.CloneFieldUpdateProcessorFactory"&gt;
- *     &lt;str name="source"&gt;category&lt;/str&gt;
- *     &lt;str name="dest"&gt;category_count&lt;/str&gt;
- *   &lt;/processor&gt;
- *   &lt;processor class="solr.CountFieldValuesUpdateProcessorFactory"&gt;
- *     &lt;str name="fieldName"&gt;category_count&lt;/str&gt;
- *   &lt;/processor&gt;
- *   &lt;processor class="solr.DefaultValueUpdateProcessorFactory"&gt;
- *     &lt;str name="fieldName"&gt;category_count&lt;/str&gt;
- *     &lt;int name="value"&gt;0&lt;/int&gt;
- *   &lt;/processor&gt;
- * &lt;/updateRequestProcessorChain&gt;
- * </pre>
+ * &lt;processor class="solr.CloneFieldUpdateProcessorFactory"&gt;
+ *   &lt;str name="source"&gt;category&lt;/str&gt;
+ *   &lt;str name="dest"&gt;category_count&lt;/str&gt;
+ * &lt;/processor&gt;
+ * &lt;processor class="solr.CountFieldValuesUpdateProcessorFactory"&gt;
+ *   &lt;str name="fieldName"&gt;category_count&lt;/str&gt;
+ * &lt;/processor&gt;
+ * &lt;processor class="solr.DefaultValueUpdateProcessorFactory"&gt;
+ *   &lt;str name="fieldName"&gt;category_count&lt;/str&gt;
+ *   &lt;int name="value"&gt;0&lt;/int&gt;
+ * &lt;/processor&gt;</pre>
  *
  * <p>
  * <b>NOTE:</b> The use of {@link DefaultValueUpdateProcessorFactory} is 
@@ -83,6 +80,7 @@ public final class CountFieldValuesUpdat
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected SolrInputField mutate(final SolrInputField src) {
         SolrInputField result = new SolrInputField(src.getName());
         result.setValue(src.getValueCount(),

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -71,10 +71,12 @@ public class DefaultValueUpdateProcessor
     super.init(args);
   }
 
+  @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, 
                                             SolrQueryResponse rsp, 
                                             UpdateRequestProcessor next ) {
     return new DefaultValueUpdateProcessor(fieldName, next) {
+      @Override
       public Object getDefaultValue() { return defaultValue; }
     };
   }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Tue Jan  8 03:40:16 2013
@@ -140,6 +140,8 @@ public class DistributedUpdateProcessor 
 
   private int numNodes;
 
+  private UpdateCommand updateCommand;  // the current command this processor is working on.
+
   
   public DistributedUpdateProcessor(SolrQueryRequest req,
       SolrQueryResponse rsp, UpdateRequestProcessor next) {
@@ -166,7 +168,7 @@ public class DistributedUpdateProcessor 
     zkController = req.getCore().getCoreDescriptor().getCoreContainer().getZkController();
     if (zkEnabled) {
       numNodes =  zkController.getZkStateReader().getClusterState().getLiveNodes().size();
-      cmdDistrib = new SolrCmdDistributor(numNodes, coreDesc.getCoreContainer().getZkController().getCmdDistribExecutor());
+      cmdDistrib = new SolrCmdDistributor(numNodes, coreDesc.getCoreContainer().getZkController().getUpdateShardHandler());
     }
     //this.rsp = reqInfo != null ? reqInfo.getRsp() : null;
 
@@ -184,6 +186,12 @@ public class DistributedUpdateProcessor 
     // if we are in zk mode...
     if (zkEnabled) {
 
+      if ((updateCommand.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.PEER_SYNC)) != 0) {
+        isLeader = false;     // we actually might be the leader, but we don't want leader-logic for these types of updates anyway.
+        forwardToLeader = false;
+        return nodes;
+      }
+
       String coreName = req.getCore().getName();
       String coreNodeName = zkController.getNodeName() + "_" + coreName;
 
@@ -210,7 +218,7 @@ public class DistributedUpdateProcessor 
         // Not equivalent to getLeaderProps, which does retries to find a leader.
         // Replica leader = slice.getLeader();
 
-        ZkCoreNodeProps leaderProps = new ZkCoreNodeProps(zkController.getZkStateReader().getLeaderProps(
+        ZkCoreNodeProps leaderProps = new ZkCoreNodeProps(zkController.getZkStateReader().getLeaderRetry(
             collection, shardId));
 
         String leaderNodeName = leaderProps.getCoreNodeName();
@@ -272,10 +280,12 @@ public class DistributedUpdateProcessor 
 
 
   private void doDefensiveChecks(String shardId, DistribPhase phase) {
+    boolean isReplayOrPeersync = (updateCommand.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.REPLAY)) != 0;
+    if (isReplayOrPeersync) return;
+
     String from = req.getParams().get("distrib.from");
-    boolean logReplay = req.getParams().getBool(LOG_REPLAY, false);
     boolean localIsLeader = req.getCore().getCoreDescriptor().getCloudDescriptor().isLeader();
-    if (!logReplay && DistribPhase.FROMLEADER == phase && localIsLeader && from != null) { // from will be null on log replay
+    if (DistribPhase.FROMLEADER == phase && localIsLeader && from != null) { // from will be null on log replay
       log.error("Request says it is coming from leader, but we are the leader: " + req.getParamString());
       throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE, "Request says it is coming from leader, but we are the leader");
     }
@@ -294,7 +304,7 @@ public class DistributedUpdateProcessor 
 
     try {
 
-      ZkCoreNodeProps leaderProps = new ZkCoreNodeProps(zkController.getZkStateReader().getLeaderProps(
+      ZkCoreNodeProps leaderProps = new ZkCoreNodeProps(zkController.getZkStateReader().getLeaderRetry(
           collection, shardId));
 
       String leaderNodeName = leaderProps.getCoreNodeName();
@@ -326,6 +336,8 @@ public class DistributedUpdateProcessor 
 
   @Override
   public void processAdd(AddUpdateCommand cmd) throws IOException {
+    updateCommand = cmd;
+
     if (zkEnabled) {
       zkCheck();
       nodes = setupRequest(cmd.getHashableId(), cmd.getSolrInputDocument());
@@ -407,11 +419,9 @@ public class DistributedUpdateProcessor 
 
     // TODO: we should do this in the background it would seem
     for (SolrCmdDistributor.Error error : response.errors) {
-      if (error.node instanceof RetryNode || error.e instanceof SolrException) {
+      if (error.node instanceof RetryNode) {
         // we don't try to force a leader to recover
         // when we cannot forward to it
-        // and we assume SolrException means
-        // the node went down
         continue;
       }
       // TODO: we should force their state to recovering ??
@@ -424,8 +434,8 @@ public class DistributedUpdateProcessor 
       log.info("try and ask " + recoveryUrl + " to recover");
       try {
         server = new HttpSolrServer(recoveryUrl);
-        server.setSoTimeout(5000);
-        server.setConnectionTimeout(5000);
+        server.setSoTimeout(15000);
+        server.setConnectionTimeout(15000);
         
         RequestRecovery recoverRequestCmd = new RequestRecovery();
         recoverRequestCmd.setAction(CoreAdminAction.REQUESTRECOVERY);
@@ -457,11 +467,22 @@ public class DistributedUpdateProcessor 
   private boolean versionAdd(AddUpdateCommand cmd) throws IOException {
     BytesRef idBytes = cmd.getIndexedId();
 
-    if (vinfo == null || idBytes == null) {
+    if (idBytes == null) {
       super.processAdd(cmd);
       return false;
     }
 
+    if (vinfo == null) {
+      if (isAtomicUpdate(cmd)) {
+        throw new SolrException
+          (SolrException.ErrorCode.BAD_REQUEST,
+           "Atomic document updates are not supported unless <updateLog/> is configured");
+      } else {
+        super.processAdd(cmd);
+        return false;
+      }
+    }
+
     // This is only the hash for the bucket, and must be based only on the uniqueKey (i.e. do not use a pluggable hash here)
     int bucketHash = Hash.murmurhash3_x86_32(idBytes.bytes, idBytes.offset, idBytes.length, 0);
 
@@ -484,8 +505,8 @@ public class DistributedUpdateProcessor 
       }
     }
 
-    boolean isReplay = (cmd.getFlags() & UpdateCommand.REPLAY) != 0;
-    boolean leaderLogic = isLeader && !isReplay;
+    boolean isReplayOrPeersync = (cmd.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.REPLAY)) != 0;
+    boolean leaderLogic = isLeader && !isReplayOrPeersync;
 
 
     VersionBucket bucket = vinfo.bucket(bucketHash);
@@ -580,21 +601,26 @@ public class DistributedUpdateProcessor 
     return false;
   }
 
-
-  // TODO: may want to switch to using optimistic locking in the future for better concurrency
-  // that's why this code is here... need to retry in a loop closely around/in versionAdd
-  boolean getUpdatedDocument(AddUpdateCommand cmd, long versionOnUpdate) throws IOException {
+  /**
+   * Utility method that examines the SolrInputDocument in an AddUpdateCommand
+   * and returns true if the documents contains atomic update instructions.
+   */
+  public static boolean isAtomicUpdate(final AddUpdateCommand cmd) {
     SolrInputDocument sdoc = cmd.getSolrInputDocument();
-    boolean update = false;
     for (SolrInputField sif : sdoc.values()) {
       if (sif.getValue() instanceof Map) {
-        update = true;
-        break;
+        return true;
       }
     }
+    return false;
+  }
 
-    if (!update) return false;
+  // TODO: may want to switch to using optimistic locking in the future for better concurrency
+  // that's why this code is here... need to retry in a loop closely around/in versionAdd
+  boolean getUpdatedDocument(AddUpdateCommand cmd, long versionOnUpdate) throws IOException {
+    if (!isAtomicUpdate(cmd)) return false;
 
+    SolrInputDocument sdoc = cmd.getSolrInputDocument();
     BytesRef id = cmd.getIndexedId();
     SolrInputDocument oldDoc = RealTimeGetComponent.getInputDocument(cmd.getReq().getCore(), id);
 
@@ -676,6 +702,8 @@ public class DistributedUpdateProcessor 
   
   @Override
   public void processDelete(DeleteUpdateCommand cmd) throws IOException {
+    updateCommand = cmd;
+
     if (!cmd.isDeleteById()) {
       doDeleteByQuery(cmd);
       return;
@@ -774,7 +802,7 @@ public class DistributedUpdateProcessor 
         String sliceName = slice.getName();
         Replica leader;
         try {
-          leader = zkController.getZkStateReader().getLeaderProps(collection, sliceName);
+          leader = zkController.getZkStateReader().getLeaderRetry(collection, sliceName);
         } catch (InterruptedException e) {
           throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE, "Exception finding leader for shard " + sliceName, e);
         }
@@ -834,8 +862,8 @@ public class DistributedUpdateProcessor 
     }
     versionOnUpdate = Math.abs(versionOnUpdate);  // normalize to positive version
 
-    boolean isReplay = (cmd.getFlags() & UpdateCommand.REPLAY) != 0;
-    boolean leaderLogic = isLeader && !isReplay;
+    boolean isReplayOrPeersync = (cmd.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.REPLAY)) != 0;
+    boolean leaderLogic = isLeader && !isReplayOrPeersync;
 
     if (!leaderLogic && versionOnUpdate==0) {
       throw new SolrException(ErrorCode.BAD_REQUEST, "missing _version_ on update from leader");
@@ -898,6 +926,11 @@ public class DistributedUpdateProcessor 
 
 
   private void zkCheck() {
+    if ((updateCommand.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.PEER_SYNC)) != 0) {
+      // for log reply or peer sync, we don't need to be connected to ZK
+      return;
+    }
+
     if (zkController.isConnected()) {
       return;
     }
@@ -941,8 +974,8 @@ public class DistributedUpdateProcessor 
     long signedVersionOnUpdate = versionOnUpdate;
     versionOnUpdate = Math.abs(versionOnUpdate);  // normalize to positive version
 
-    boolean isReplay = (cmd.getFlags() & UpdateCommand.REPLAY) != 0;
-    boolean leaderLogic = isLeader && !isReplay;
+    boolean isReplayOrPeersync = (cmd.getFlags() & (UpdateCommand.REPLAY | UpdateCommand.REPLAY)) != 0;
+    boolean leaderLogic = isLeader && !isReplayOrPeersync;
 
     if (!leaderLogic && versionOnUpdate==0) {
       throw new SolrException(ErrorCode.BAD_REQUEST, "missing _version_ on update from leader");
@@ -1012,6 +1045,8 @@ public class DistributedUpdateProcessor 
 
   @Override
   public void processCommit(CommitUpdateCommand cmd) throws IOException {
+    updateCommand = cmd;
+
     if (zkEnabled) {
       zkCheck();
     }
@@ -1103,24 +1138,19 @@ public class DistributedUpdateProcessor 
       this.collection = collection;
       this.shardId = shardId;
     }
-    
-    @Override
-    public String toString() {
-      return url;
-    }
 
     @Override
     public boolean checkRetry() {
       ZkCoreNodeProps leaderProps;
       try {
-        leaderProps = new ZkCoreNodeProps(zkStateReader.getLeaderProps(
+        leaderProps = new ZkCoreNodeProps(zkStateReader.getLeaderRetry(
             collection, shardId));
       } catch (InterruptedException e) {
         Thread.currentThread().interrupt();
         return false;
       }
       
-      this.url = leaderProps.getCoreUrl();
+      this.nodeProps = leaderProps;
 
       return true;
     }
@@ -1141,9 +1171,9 @@ public class DistributedUpdateProcessor 
       if (!super.equals(obj)) return false;
       if (getClass() != obj.getClass()) return false;
       RetryNode other = (RetryNode) obj;
-      if (url == null) {
-        if (other.url != null) return false;
-      } else if (!url.equals(other.url)) return false;
+      if (nodeProps.getCoreUrl() == null) {
+        if (other.nodeProps.getCoreUrl() != null) return false;
+      } else if (!nodeProps.getCoreUrl().equals(other.nodeProps.getCoreUrl())) return false;
 
       return true;
     }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -43,8 +43,7 @@ import org.apache.solr.core.SolrCore;
  *     &lt;str&gt;solr.TrieIntField&lt;/str&gt;
  *     &lt;str&gt;solr.TrieLongField&lt;/str&gt;
  *   &lt;/arr&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  */
 public final class FieldLengthUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
@@ -68,6 +67,7 @@ public final class FieldLengthUpdateProc
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence) {
           return new Integer(((CharSequence)src).length());

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java Tue Jan  8 03:40:16 2013
@@ -133,6 +133,7 @@ public abstract class FieldMutatingUpdat
   /** Singleton indicating all fields should be mutated */
   public static final FieldNameSelector SELECT_ALL_FIELDS 
     = new FieldNameSelector() {
+        @Override
         public boolean shouldMutate(final String fieldName) {
           return true;
         }
@@ -141,6 +142,7 @@ public abstract class FieldMutatingUpdat
   /** Singleton indicating no fields should be mutated */
   public static final FieldNameSelector SELECT_NO_FIELDS 
     = new FieldNameSelector() {
+        @Override
         public boolean shouldMutate(final String fieldName) {
           return false;
         }
@@ -170,6 +172,7 @@ public abstract class FieldMutatingUpdat
     
     if (SELECT_ALL_FIELDS == includes) {
       return new FieldNameSelector() {
+        @Override
         public boolean shouldMutate(final String fieldName) {
           return ! excludes.shouldMutate(fieldName);
         }
@@ -177,6 +180,7 @@ public abstract class FieldMutatingUpdat
     }
 
     return new FieldNameSelector() {
+      @Override
       public boolean shouldMutate(final String fieldName) {
         return (includes.shouldMutate(fieldName)
                 && ! excludes.shouldMutate(fieldName));
@@ -244,6 +248,7 @@ public abstract class FieldMutatingUpdat
       this.regexes = regexes;
     }
 
+    @Override
     public boolean shouldMutate(final String fieldName) {
       
       // order of checks is bsaed on what should be quicker 

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -91,8 +91,7 @@ import org.apache.solr.util.plugin.SolrC
  *   &lt;lst name="exclude"&gt;
  *     &lt;str name="typeClass"&gt;solr.DateField&lt;/str&gt;
  *   &lt;/lst&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  * 
  * <p>
  * Subclasses define the default selection behavior to be applied if no 
@@ -197,6 +196,7 @@ public abstract class FieldMutatingUpdat
 
   }
 
+  @Override
   public void inform(final SolrCore core) {
     
     final IndexSchema schema = core.getSchema();

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueMutatingUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueMutatingUpdateProcessor.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueMutatingUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueMutatingUpdateProcessor.java Tue Jan  8 03:40:16 2013
@@ -36,6 +36,7 @@ public abstract class FieldValueMutating
   
   
   public static final Object DELETE_VALUE_SINGLETON = new Object() {
+      @Override
       public String toString() { 
         return "!!Singleton Object Triggering Value Deletion!!";
       }
@@ -58,6 +59,7 @@ public abstract class FieldValueMutating
    */
   protected abstract Object mutateValue(final Object src);
   
+  @Override
   protected final SolrInputField mutate(final SolrInputField src) {
     SolrInputField result = new SolrInputField(src.getName());
     for (final Object srcVal : src.getValues()) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueSubsetUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueSubsetUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueSubsetUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/FieldValueSubsetUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -37,6 +37,7 @@ public abstract class FieldValueSubsetUp
                                                   SolrQueryResponse rsp,
                                                   UpdateRequestProcessor next) {
     return new FieldMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected SolrInputField mutate(final SolrInputField src) {
         if (src.getValueCount() <= 1) return src;
 

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/HTMLStripFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/HTMLStripFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/HTMLStripFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/HTMLStripFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -43,8 +43,7 @@ import java.io.StringWriter;
  * <pre class="prettyprint">
  * &lt;processor class="solr.HTMLStripFieldUpdateProcessorFactory"&gt;
  *   &lt;str name="typeClass"&gt;solr.StrField&lt;/str&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  */
 public final class HTMLStripFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
@@ -61,6 +60,7 @@ public final class HTMLStripFieldUpdateP
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence) {
           CharSequence s = (CharSequence)src;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -42,22 +42,16 @@ import org.apache.solr.response.SolrQuer
  * </p>
  *
  * <pre class="prettyprint">
- *  &lt;updateRequestProcessorChain&gt;
- *    &lt;processor class="solr.IgnoreFieldUpdateProcessorFactory" /&gt;
- *  &lt;/updateRequestProcessorChain&gt;
- * </pre>
+ * &lt;processor class="solr.IgnoreFieldUpdateProcessorFactory" /&gt;</pre>
  *
  * <p>
  * In this second example, any field name ending in "_raw" found in a 
  * document being added would be removed...
  * </p>
  * <pre class="prettyprint">
- *  &lt;updateRequestProcessorChain&gt;
- *    &lt;processor class="solr.IgnoreFieldUpdateProcessorFactory"&gt;
- *      &lt;str name="fieldRegex"&gt;.*_raw&lt;/str&gt;
- *    &lt;/processor&gt;
- *  &lt;/updateRequestProcessorChain&gt;
- * </pre>
+ * &lt;processor class="solr.IgnoreFieldUpdateProcessorFactory"&gt;
+ *   &lt;str name="fieldRegex"&gt;.*_raw&lt;/str&gt;
+ * &lt;/processor&gt;</pre>
  */
 public final class IgnoreFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
@@ -66,6 +60,7 @@ public final class IgnoreFieldUpdateProc
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected SolrInputField mutate(final SolrInputField src) {
         return null;
       }
@@ -78,6 +73,7 @@ public final class IgnoreFieldUpdateProc
 
     final IndexSchema schema = core.getSchema();
     return new FieldMutatingUpdateProcessor.FieldNameSelector() {
+      @Override
       public boolean shouldMutate(final String fieldName) {
 
         FieldType type = schema.getFieldTypeNoEx(fieldName);

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -94,7 +94,7 @@ class LogUpdateProcessor extends UpdateR
   
   @Override
   public void processAdd(AddUpdateCommand cmd) throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString()); }
+    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString() + " " + req); }
 
     // call delegate first so we can log things like the version that get set later
     if (next != null) next.processAdd(cmd);
@@ -117,7 +117,7 @@ class LogUpdateProcessor extends UpdateR
 
   @Override
   public void processDelete( DeleteUpdateCommand cmd ) throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString()); }
+    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString() + " " + req); }
     if (next != null) next.processDelete(cmd);
 
     if (cmd.isDeleteById()) {
@@ -145,7 +145,7 @@ class LogUpdateProcessor extends UpdateR
 
   @Override
   public void processMergeIndexes(MergeIndexesCommand cmd) throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString()); }
+    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString() + " " + req); }
     if (next != null) next.processMergeIndexes(cmd);
 
     toLog.add("mergeIndexes", cmd.toString());
@@ -153,7 +153,7 @@ class LogUpdateProcessor extends UpdateR
 
   @Override
   public void processCommit( CommitUpdateCommand cmd ) throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString()); }
+    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString() + " " + req); }
     if (next != null) next.processCommit(cmd);
 
 
@@ -166,7 +166,7 @@ class LogUpdateProcessor extends UpdateR
    */
   @Override
   public void processRollback( RollbackUpdateCommand cmd ) throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString()); }
+    if (logDebug) { log.debug("PRE_UPDATE " + cmd.toString() + " " + req); }
     if (next != null) next.processRollback(cmd);
 
     toLog.add("rollback", "");
@@ -175,7 +175,7 @@ class LogUpdateProcessor extends UpdateR
 
   @Override
   public void finish() throws IOException {
-    if (logDebug) { log.debug("PRE_UPDATE finish()"); }
+    if (logDebug) { log.debug("PRE_UPDATE FINISH " + req); }
     if (next != null) next.finish();
 
     // LOG A SUMMARY WHEN ALL DONE (INFO LEVEL)

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/NoOpDistributingUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/NoOpDistributingUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/NoOpDistributingUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/NoOpDistributingUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -38,6 +38,7 @@ public class NoOpDistributingUpdateProce
 
   /** Returns null 
    */
+  @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, 
                                             SolrQueryResponse rsp, 
                                             UpdateRequestProcessor next ) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -52,8 +52,7 @@ import org.slf4j.LoggerFactory;
  *   &lt;str name="fieldName"&gt;title&lt;/str&gt;
  *   &lt;str name="pattern"&gt;\s+&lt;/str&gt;
  *   &lt;str name="replacement"&gt; &lt;/str&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  * 
  * @see java.util.regex.Pattern
  */
@@ -98,6 +97,7 @@ public final class RegexReplaceProcessor
   /** 
    * @see FieldMutatingUpdateProcessor#SELECT_NO_FIELDS
    */
+  @Override
   protected FieldMutatingUpdateProcessor.FieldNameSelector 
     getDefaultSelector(final SolrCore core) {
 
@@ -110,6 +110,7 @@ public final class RegexReplaceProcessor
                                             SolrQueryResponse response,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence) {
           CharSequence txt = (CharSequence)src;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -39,8 +39,7 @@ import org.apache.solr.response.SolrQuer
  *   &lt;lst name="exclude"&gt;
  *     &lt;str name="fieldRegex"&gt;.*_literal&lt;/str&gt;
  *   &lt;/lst&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  *
  */
 public final class RemoveBlankFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
@@ -57,6 +56,7 @@ public final class RemoveBlankFieldUpdat
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence 
             && 0 == ((CharSequence)src).length()) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -18,7 +18,8 @@
 package org.apache.solr.update.processor;
 
 import java.io.IOException;
-
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.*;
@@ -58,6 +59,13 @@ class RunUpdateProcessor extends UpdateR
 
   @Override
   public void processAdd(AddUpdateCommand cmd) throws IOException {
+    
+    if (DistributedUpdateProcessor.isAtomicUpdate(cmd)) {
+      throw new SolrException
+        (SolrException.ErrorCode.BAD_REQUEST,
+         "RunUpdateProcessor has recieved an AddUpdateCommand containing a document that appears to still contain Atomic document update operations, most likely because DistributedUpdateProcessorFactory was explicitly disabled from this updateRequestProcessorChain");
+    }
+
     updateHandler.addDoc(cmd);
     super.processAdd(cmd);
     changesSinceCommit = true;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -73,6 +73,7 @@ public class SignatureUpdateProcessorFac
     }
   }
 
+  @Override
   public void inform(SolrCore core) {
     final SchemaField field = core.getSchema().getFieldOrNull(getSignatureField());
     if (null == field) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TextProfileSignature.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TextProfileSignature.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TextProfileSignature.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TextProfileSignature.java Tue Jan  8 03:40:16 2013
@@ -153,6 +153,7 @@ public class TextProfileSignature extend
   }
 
   private static class TokenComparator implements Comparator<Token> {
+    @Override
     public int compare(Token t1, Token t2) {
       return t2.cnt - t1.cnt;
     }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TimestampUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TimestampUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TimestampUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TimestampUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -56,10 +56,12 @@ import org.apache.solr.common.params.Com
 public class TimestampUpdateProcessorFactory
   extends AbstractDefaultValueUpdateProcessorFactory {
 
+  @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, 
                                             SolrQueryResponse rsp, 
                                             UpdateRequestProcessor next ) {
     return new DefaultValueUpdateProcessor(fieldName, next) {
+      @Override
       public Object getDefaultValue() { 
         return SolrRequestInfo.getRequestInfo().getNOW();
       }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -39,8 +39,7 @@ import org.apache.solr.response.SolrQuer
  *   &lt;lst name="exclude"&gt;
  *     &lt;str name="fieldRegex"&gt;.*_literal&lt;/str&gt;
  *   &lt;/lst&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  */
 public final class TrimFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
@@ -56,6 +55,7 @@ public final class TrimFieldUpdateProces
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence) {
           return ((CharSequence)src).toString().trim();

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -40,8 +40,7 @@ import org.apache.solr.response.SolrQuer
  * &lt;processor class="solr.TruncateFieldUpdateProcessorFactory"&gt;
  *   &lt;str name="typeClass"&gt;solr.StrField&lt;/str&gt;
  *   &lt;int name="maxLength"&gt;100&lt;/int&gt;
- * &lt;/processor&gt;
- * </pre>
+ * &lt;/processor&gt;</pre>
  */
 public final class TruncateFieldUpdateProcessorFactory 
   extends FieldMutatingUpdateProcessorFactory {
@@ -88,6 +87,7 @@ public final class TruncateFieldUpdatePr
                                             SolrQueryResponse rsp,
                                             UpdateRequestProcessor next) {
     return new FieldValueMutatingUpdateProcessor(getSelector(), next) {
+      @Override
       protected Object mutateValue(final Object src) {
         if (src instanceof CharSequence) {
           CharSequence s = (CharSequence)src;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -54,10 +54,12 @@ import org.apache.solr.update.AddUpdateC
 public class UUIDUpdateProcessorFactory
   extends AbstractDefaultValueUpdateProcessorFactory {
 
+  @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, 
                                             SolrQueryResponse rsp, 
                                             UpdateRequestProcessor next ) {
     return new DefaultValueUpdateProcessor(fieldName, next) {
+      @Override
       public Object getDefaultValue() { 
         return UUID.randomUUID().toString().toLowerCase(Locale.ROOT);
       }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java Tue Jan  8 03:40:16 2013
@@ -81,6 +81,7 @@ public final class UpdateRequestProcesso
    * @see RunUpdateProcessorFactory
    * @see DistributedUpdateProcessorFactory
    */
+  @Override
   public void init(PluginInfo info) {
     final String infomsg = "updateRequestProcessorChain \"" + 
       (null != info.name ? info.name : "") + "\"" + 
@@ -144,8 +145,7 @@ public final class UpdateRequestProcesso
    * If the <code>DISTRIB_UPDATE_PARAM</code> is present in the request and is 
    * non-blank, then any factory in this chain prior to the instance of 
    * <code>{@link DistributingUpdateProcessorFactory}</code> will be skipped, 
-   * and the <code>UpdateRequestProcessor</code> returned will be from that 
-   * <code>DistributingUpdateProcessorFactory</code>
+   * except for the log update processor factory.
    *
    * @see UpdateRequestProcessorFactory#getInstance
    * @see DistributingUpdateProcessorFactory#DISTRIB_UPDATE_PARAM
@@ -156,18 +156,28 @@ public final class UpdateRequestProcesso
     UpdateRequestProcessor processor = null;
     UpdateRequestProcessor last = null;
     
-    final String distribPhase = req.getParams().get
-      (DistributingUpdateProcessorFactory.DISTRIB_UPDATE_PARAM, "");
-    final boolean skipToDistrib = ! distribPhase.trim().isEmpty();
+    final String distribPhase = req.getParams().get(DistributingUpdateProcessorFactory.DISTRIB_UPDATE_PARAM);
+    final boolean skipToDistrib = distribPhase != null;
+    boolean afterDistrib = true;  // we iterate backwards, so true to start
 
     for (int i = chain.length-1; i>=0; i--) {
-      processor = chain[i].getInstance(req, rsp, last);
-      last = processor == null ? last : processor;
-      if (skipToDistrib 
-          && chain[i] instanceof DistributingUpdateProcessorFactory) {
-        break;
+      UpdateRequestProcessorFactory factory = chain[i];
+
+      if (skipToDistrib) {
+        if (afterDistrib) {
+          if (factory instanceof DistributingUpdateProcessorFactory) {
+            afterDistrib = false;
+          }
+        } else if (!(factory instanceof LogUpdateProcessorFactory)) {    // TODO: use a marker interface for this?
+          // skip anything that is not the log factory
+          continue;
+        }
       }
+
+      processor = factory.getInstance(req, rsp, last);
+      last = processor == null ? last : processor;
     }
+
     return last;
   }
 

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorFactory.java Tue Jan  8 03:40:16 2013
@@ -34,6 +34,7 @@ import org.apache.solr.util.plugin.SolrC
  */
 public abstract class UpdateRequestProcessorFactory implements NamedListInitializedPlugin
 {    
+  @Override
   public void init( NamedList args )
   {
     // could process the Node

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLFUCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLFUCache.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLFUCache.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLFUCache.java Tue Jan  8 03:40:16 2013
@@ -327,6 +327,7 @@ public class ConcurrentLFUCache<K, V> {
       this.lastAccessed = lastAccessed;
     }
 
+    @Override
     public int compareTo(CacheEntry<K, V> that) {
       if (this.hitsCopy == that.hitsCopy) {
         if (this.lastAccessedCopy == that.lastAccessedCopy) {

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java Tue Jan  8 03:40:16 2013
@@ -493,6 +493,7 @@ public class ConcurrentLRUCache<K,V> {
       this.lastAccessed = lastAccessed;
     }
 
+    @Override
     public int compareTo(CacheEntry<K,V> that) {
       if (this.lastAccessedCopy == that.lastAccessedCopy) return 0;
       return this.lastAccessedCopy < that.lastAccessedCopy ? 1 : -1;

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/DefaultSolrThreadFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/DefaultSolrThreadFactory.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/DefaultSolrThreadFactory.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/DefaultSolrThreadFactory.java Tue Jan  8 03:40:16 2013
@@ -35,6 +35,7 @@ public class DefaultSolrThreadFactory im
                      "-thread-";
     }
 
+    @Override
     public Thread newThread(Runnable r) {
         Thread t = new Thread(group, r,
                               prefix + threadNumber.getAndIncrement(),

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/RegexFileFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/RegexFileFilter.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/RegexFileFilter.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/RegexFileFilter.java Tue Jan  8 03:40:16 2013
@@ -34,6 +34,7 @@ public final class RegexFileFilter imple
   public RegexFileFilter(Pattern regex) {
     pattern = regex;
   }
+  @Override
   public boolean accept(File f) {
     return pattern.matcher(f.getName()).matches();
   }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SimplePostTool.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SimplePostTool.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SimplePostTool.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SimplePostTool.java Tue Jan  8 03:40:16 2013
@@ -984,6 +984,7 @@ public class SimplePostTool {
       }
     }
     
+    @Override
     public boolean accept(File file)
     {
       return p.matcher(file.getName()).find();

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java Tue Jan  8 03:40:16 2013
@@ -810,6 +810,7 @@ public class SolrPluginUtils {
    * </p>
    */
   public static class IdentityRegenerator implements CacheRegenerator {
+    @Override
     public boolean regenerateItem(SolrIndexSearcher newSearcher,
                                   SolrCache newCache,
                                   SolrCache oldCache,

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SystemIdResolver.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SystemIdResolver.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SystemIdResolver.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/SystemIdResolver.java Tue Jan  8 03:40:16 2013
@@ -72,6 +72,7 @@ public final class SystemIdResolver impl
   
   public URIResolver asURIResolver() {
     return new URIResolver() {
+      @Override
       public Source resolve(String href, String base) throws TransformerException {
         try {
           final InputSource src = SystemIdResolver.this.resolveEntity(null, null, base, href);
@@ -85,6 +86,7 @@ public final class SystemIdResolver impl
   
   public XMLResolver asXMLResolver() {
     return new XMLResolver() {
+      @Override
       public Object resolveEntity(String publicId, String systemId, String baseURI, String namespace) throws XMLStreamException {
         try {
           final InputSource src = SystemIdResolver.this.resolveEntity(null, publicId, baseURI, systemId);
@@ -117,10 +119,12 @@ public final class SystemIdResolver impl
   
   // *** EntityResolver(2) methods:
   
+  @Override
   public InputSource getExternalSubset(String name, String baseURI) {
     return null;
   }
   
+  @Override
   public InputSource resolveEntity(String name, String publicId, String baseURI, String systemId) throws IOException {
     if (systemId == null)
       return null;
@@ -152,6 +156,7 @@ public final class SystemIdResolver impl
     }
   }
 
+  @Override
   public InputSource resolveEntity(String publicId, String systemId) throws IOException {
     return resolveEntity(null, publicId, null, systemId);
   }

Modified: lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/VersionedFile.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/VersionedFile.java?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/VersionedFile.java (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/java/org/apache/solr/util/VersionedFile.java Tue Jan  8 03:40:16 2013
@@ -56,6 +56,7 @@ public class VersionedFile 
         if (!f.exists()) {
           File dir = new File(dirName);
           String[] names = dir.list(new FilenameFilter() {
+            @Override
             public boolean accept(File dir, String name) {
               return name.startsWith(prefix);
             }

Modified: lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog.xml?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog.xml (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog.xml Tue Jan  8 03:40:16 2013
@@ -22,6 +22,14 @@
   <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
   <dataDir>${solr.data.dir:}</dataDir>
 
+  <!-- an update processor the explicitly excludes distrib to test
+       clean errors when people attempt atomic updates w/o it
+  -->
+  <updateRequestProcessorChain name="nodistrib" >
+   <processor class="solr.NoOpDistributingUpdateProcessorFactory" />
+   <processor class="solr.RunUpdateProcessorFactory" />
+ </updateRequestProcessorChain>
+
   <requestHandler name="standard" class="solr.StandardRequestHandler">
   </requestHandler>
 

Modified: lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml?rev=1430130&r1=1430129&r2=1430130&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml (original)
+++ lucene/dev/branches/lucene4547/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml Tue Jan  8 03:40:16 2013
@@ -40,7 +40,12 @@
   <!--  The DirectoryFactory to use for indexes.
         solr.StandardDirectoryFactory, the default, is filesystem based.
         solr.RAMDirectoryFactory is memory based and not persistent. -->
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
+  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}">
+    <double name="maxWriteMBPerSecDefault">1000000</double>
+    <double name="maxWriteMBPerSecFlush">2000000</double>
+    <double name="maxWriteMBPerSecMerge">3000000</double>
+    <double name="maxWriteMBPerSecRead">4000000</double>
+  </directoryFactory>
 
   <luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
 
@@ -396,6 +401,10 @@
 				<str>spellcheck</str>
 			</arr>
  </requestHandler>
+ 
+  <requestHandler name="mltrh" class="org.apache.solr.handler.component.SearchHandler">
+
+  </requestHandler>
 
   <searchComponent name="tvComponent" class="org.apache.solr.handler.component.TermVectorComponent"/>