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 2014/10/22 07:44:21 UTC

svn commit: r1633538 [5/5] - in /lucene/dev/branches/lucene5969: ./ lucene/ lucene/analysis/ lucene/analysis/common/ lucene/analysis/icu/ lucene/analysis/kuromoji/ lucene/analysis/morfologik/ lucene/analysis/phonetic/ lucene/analysis/smartcn/ lucene/an...

Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Wed Oct 22 05:44:17 2014
@@ -26,6 +26,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -34,6 +35,8 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
@@ -847,10 +850,12 @@ public class DistributedUpdateProcessor 
         List<ZkCoreNodeProps> myReplicas = zkController.getZkStateReader().getReplicaProps(collection,
             cloudDesc.getShardId(), cloudDesc.getCoreNodeName());
         boolean foundErrorNodeInReplicaList = false;
-        for (ZkCoreNodeProps replicaProp : myReplicas) {
-          if (((Replica) replicaProp.getNodeProps()).getName().equals(((Replica)stdNode.getNodeProps().getNodeProps()).getName()))  {
-            foundErrorNodeInReplicaList = true;
-            break;
+        if (myReplicas != null) {
+          for (ZkCoreNodeProps replicaProp : myReplicas) {
+            if (((Replica) replicaProp.getNodeProps()).getName().equals(((Replica)stdNode.getNodeProps().getNodeProps()).getName()))  {
+              foundErrorNodeInReplicaList = true;
+              break;
+            }
           }
         }
 
@@ -1146,6 +1151,10 @@ public class DistributedUpdateProcessor 
               updateField = true;
               doRemove(oldDoc, sif, fieldVal, schema);
               break;
+            case "removeregex":
+              updateField = true;
+              doRemoveRegex(oldDoc, sif, fieldVal);
+              break;
             case "inc":
               updateField = true;
               doInc(oldDoc, schema, sif, fieldVal);
@@ -1225,6 +1234,38 @@ public class DistributedUpdateProcessor 
     return oldSize > existingField.getValueCount();
   }
 
+  private void doRemoveRegex(SolrInputDocument oldDoc, SolrInputField sif, Object valuePatterns) {
+    final String name = sif.getName();
+    final SolrInputField existingField = oldDoc.get(name);
+    if (existingField != null) {
+      final Collection<Object> valueToRemove = new HashSet<>();
+      final Collection<Object> original = existingField.getValues();
+      final Collection<Pattern> patterns = preparePatterns(valuePatterns);
+      for (Object value : original) {
+        for(Pattern pattern : patterns) {
+          final Matcher m = pattern.matcher(value.toString());
+          if (m.matches()) {
+            valueToRemove.add(value);
+          }
+        }
+      }
+      original.removeAll(valueToRemove);
+      oldDoc.setField(name, original);
+    }
+  }
+
+  private Collection<Pattern> preparePatterns(Object fieldVal) {
+    final Collection<Pattern> patterns = new LinkedHashSet<>(1);
+    if (fieldVal instanceof Collection) {
+      Collection<String> patternVals = (Collection<String>) fieldVal;
+      for (String patternVal : patternVals) {
+        patterns.add(Pattern.compile(patternVal));
+      }
+    } else {
+      patterns.add(Pattern.compile(fieldVal.toString()));
+    }
+    return patterns;
+  }
 
   @Override
   public void processDelete(DeleteUpdateCommand cmd) throws IOException {

Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/util/CommandOperation.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/util/CommandOperation.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/util/CommandOperation.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/util/CommandOperation.java Wed Oct 22 05:44:17 2014
@@ -92,7 +92,7 @@ public  class CommandOperation {
     return val;
 
   }
-  static final String REQD = "'{0}' is a required field";
+  static final String REQD = "''{0}'' is a required field";
 
 
   /**Get collection of values for a key. If only one val is present a

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java Wed Oct 22 05:44:17 2014
@@ -197,7 +197,9 @@ public class OverseerRolesTest  extends 
     assertNotNull("Could not find a jetty2 kill",  leaderJetty);
 
     log.info("leader node {}", leaderJetty.getBaseUrl());
-    log.info ("current election Queue", OverseerCollectionProcessor.getSortedElectionNodes(client.getZkStateReader().getZkClient()));
+    log.info ("current election Queue",
+        OverseerCollectionProcessor.getSortedElectionNodes(client.getZkStateReader().getZkClient(),
+            OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE));
     ChaosMonkey.stop(leaderJetty);
     timeout = System.currentTimeMillis() + 10000;
     leaderchanged = false;

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/RollingRestartTest.java Wed Oct 22 05:44:17 2014
@@ -106,7 +106,9 @@ public class RollingRestartTest extends 
           if (!success) {
             leader = OverseerCollectionProcessor.getLeaderNode(cloudClient.getZkStateReader().getZkClient());
             if (leader == null)
-              log.error("NOOVERSEER election queue is :" + OverseerCollectionProcessor.getSortedElectionNodes(cloudClient.getZkStateReader().getZkClient()));
+              log.error("NOOVERSEER election queue is :" +
+                  OverseerCollectionProcessor.getSortedElectionNodes(cloudClient.getZkStateReader().getZkClient(),
+                      OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE));
             fail("No overseer designate as leader found after restart #" + (i + 1) + ": " + leader);
           }
         }
@@ -115,7 +117,9 @@ public class RollingRestartTest extends 
         if (!success) {
           leader = OverseerCollectionProcessor.getLeaderNode(cloudClient.getZkStateReader().getZkClient());
           if (leader == null)
-            log.error("NOOVERSEER election queue is :" + OverseerCollectionProcessor.getSortedElectionNodes(cloudClient.getZkStateReader().getZkClient()));
+            log.error("NOOVERSEER election queue is :" +
+                OverseerCollectionProcessor.getSortedElectionNodes(cloudClient.getZkStateReader().getZkClient(),
+                    OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE));
           fail("No overseer leader found after restart #" + (i + 1) + ": " + leader);
         }
         

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/TestReplicaProperties.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/TestReplicaProperties.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/TestReplicaProperties.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/cloud/TestReplicaProperties.java Wed Oct 22 05:44:17 2014
@@ -29,10 +29,13 @@ import org.apache.solr.client.solrj.Solr
 import org.apache.solr.client.solrj.impl.CloudSolrServer;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.params.CollectionParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.zookeeper.KeeperException;
 import org.junit.Before;
 
 @Slow
@@ -61,7 +64,7 @@ public class TestReplicaProperties exten
       // shards, replicationfactor, maxreplicaspernode
       int shards = random().nextInt(7);
       if (shards < 2) shards = 2;
-      int rFactor = random().nextInt(3);
+      int rFactor = random().nextInt(4);
       if (rFactor < 2) rFactor = 2;
       createCollection(null, COLLECTION_NAME, shards, rFactor, shards * rFactor + 1, client, null, "conf1");
     } finally {
@@ -186,11 +189,56 @@ public class TestReplicaProperties exten
       verifyPropertyVal(client, COLLECTION_NAME,
           c1_s1_r2, "property.bogus1", "whatever");
 
+      // At this point we've assigned a preferred leader. Make it happen and check that all the nodes that are
+      // leaders _also_ have the preferredLeader property set.
+
+
+      doPropertyAction(client,
+          "action", CollectionParams.CollectionAction.REBALANCELEADERS.toString(),
+          "collection", COLLECTION_NAME);
+
+      verifyLeaderAssignment(client, COLLECTION_NAME);
+
     } finally {
       client.shutdown();
     }
   }
 
+  private void verifyLeaderAssignment(CloudSolrServer client, String collectionName)
+      throws InterruptedException, KeeperException {
+    String lastFailMsg = "";
+    for (int idx = 0; idx < 300; ++idx) { // Keep trying while Overseer writes the ZK state for up to 30 seconds.
+      lastFailMsg = "";
+      client.getZkStateReader().updateClusterState(true);
+      ClusterState clusterState = client.getZkStateReader().getClusterState();
+      for (Slice slice : clusterState.getSlices(collectionName)) {
+        Boolean foundLeader = false;
+        Boolean foundPreferred = false;
+        for (Replica replica : slice.getReplicas()) {
+          Boolean isLeader = replica.getBool("leader", false);
+          Boolean isPreferred = replica.getBool("property.preferredleader", false);
+          if (isLeader != isPreferred) {
+            lastFailMsg = "Replica should NOT have preferredLeader != leader. Preferred: " + isPreferred.toString() +
+                " leader is " + isLeader.toString();
+          }
+          if (foundLeader && isLeader) {
+            lastFailMsg = "There should only be a single leader in _any_ shard! Replica " + replica.getName() +
+                " is the second leader in slice " + slice.getName();
+          }
+          if (foundPreferred && isPreferred) {
+            lastFailMsg = "There should only be a single preferredLeader in _any_ shard! Replica " + replica.getName() +
+                " is the second preferredLeader in slice " + slice.getName();
+          }
+          foundLeader = foundLeader ? foundLeader : isLeader;
+          foundPreferred = foundPreferred ? foundPreferred : isPreferred;
+        }
+      }
+      if (lastFailMsg.length() == 0) return;
+      Thread.sleep(100);
+    }
+    fail(lastFailMsg);
+  }
+
   private void addProperty(CloudSolrServer client, String... paramsIn) throws IOException, SolrServerException {
     assertTrue("paramsIn must be an even multiple of 2, it is: " + paramsIn.length, (paramsIn.length % 2) == 0);
     ModifiableSolrParams params = new ModifiableSolrParams();

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java Wed Oct 22 05:44:17 2014
@@ -31,6 +31,7 @@ import org.apache.solr.update.DeleteUpda
 import org.apache.solr.update.processor.BufferingRequestProcessor;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.noggit.ObjectBuilder;
 import org.xml.sax.SAXException;
 
 import java.math.BigDecimal;
@@ -276,7 +277,8 @@ public class JsonLoaderTest extends Solr
         "  \"f1\": \"v2\",\n" +
         "   \"f2\": null\n" +
         "  }\n";
-    SolrQueryRequest req = req("json.command","false");
+    SolrQueryRequest req = req("srcField","_src");
+    req.getContext().put("path","/update/json/docs");
     SolrQueryResponse rsp = new SolrQueryResponse();
     BufferingRequestProcessor p = new BufferingRequestProcessor(null);
     JsonLoader loader = new JsonLoader();
@@ -284,25 +286,26 @@ public class JsonLoaderTest extends Solr
     assertEquals( 2, p.addCommands.size() );
      doc = "\n" +
         "\n" +
-        "{bool: true,\n" +
-        " f0: \"v0\",\n" +
-        " f2: {\n" +
+        "{\"bool\": true,\n" +
+        " \"f0\": \"v0\",\n" +
+        " \"f2\": {\n" +
         "    \t  \"boost\": 2.3,\n" +
         "    \t  \"value\": \"test\"\n" +
         "    \t   },\n" +
-        "array: [ \"aaa\", \"bbb\" ],\n" +
-        "boosted: {\n" +
+        "\"array\": [ \"aaa\", \"bbb\" ],\n" +
+        "\"boosted\": {\n" +
         "    \t      \"boost\": 6.7,\n" +
         "    \t      \"value\": [ \"aaa\", \"bbb\" ]\n" +
         "    \t    }\n" +
         " }\n" +
         "\n" +
         "\n" +
-        " {f1: \"v1\",\n" +
-        "  f1: \"v2\",\n" +
-        "   f2: null\n" +
+        " {\"f1\": \"v1\",\n" +
+        "  \"f2\": \"v2\",\n" +
+        "   \"f3\": null\n" +
         "  }\n";
-    req = req("json.command","false");
+    req = req("srcField","_src");
+    req.getContext().put("path","/update/json/docs");
     rsp = new SolrQueryResponse();
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
@@ -310,15 +313,40 @@ public class JsonLoaderTest extends Solr
 
     assertEquals( 2, p.addCommands.size() );
 
+    String content = (String) p.addCommands.get(0).solrDoc.getFieldValue("_src");
+    assertNotNull(content);
+    Map obj = (Map) ObjectBuilder.fromJSON(content);
+    assertEquals(Boolean.TRUE, obj.get("bool"));
+    assertEquals("v0", obj.get("f0"));
+    assertNotNull(obj.get("f0"));
+    assertNotNull(obj.get("array"));
+    assertNotNull(obj.get("boosted"));
+
+    content = (String) p.addCommands.get(1).solrDoc.getFieldValue("_src");
+    assertNotNull(content);
+    obj = (Map) ObjectBuilder.fromJSON(content);
+    assertEquals("v1", obj.get("f1"));
+    assertEquals("v2", obj.get("f2"));
+    assertTrue(obj.containsKey("f3"));
 
     doc = "[{'id':'1'},{'id':'2'}]".replace('\'', '"');
-    req = req("json.command","false");
+    req = req("srcField","_src");
+    req.getContext().put("path","/update/json/docs");
     rsp = new SolrQueryResponse();
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
     assertEquals( 2, p.addCommands.size() );
 
+    content = (String) p.addCommands.get(0).solrDoc.getFieldValue("_src");
+    assertNotNull(content);
+    obj = (Map) ObjectBuilder.fromJSON(content);
+    assertEquals("1", obj.get("id"));
+    content = (String) p.addCommands.get(1).solrDoc.getFieldValue("_src");
+    assertNotNull(content);
+    obj = (Map) ObjectBuilder.fromJSON(content);
+    assertEquals("2", obj.get("id"));
+
 
   }
 

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java Wed Oct 22 05:44:17 2014
@@ -17,6 +17,15 @@ package org.apache.solr.handler;
  * limitations under the License.
  */
 
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.file.Path;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
@@ -36,16 +45,6 @@ import org.apache.solr.util.FileUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.file.Path;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 @SolrTestCaseJ4.SuppressSSL     // Currently unknown why SSL does not work with this test
 public class TestReplicationHandlerBackup extends SolrJettyTestBase {
@@ -109,12 +108,12 @@ public class TestReplicationHandlerBacku
   @After
   public void tearDown() throws Exception {
     super.tearDown();
+    masterClient.shutdown();
+    masterClient  = null;
     masterJetty.stop();
     master.tearDown();
     masterJetty = null;
     master = null;
-    masterClient.shutdown();
-    masterClient  = null;
   }
 
 
@@ -142,15 +141,15 @@ public class TestReplicationHandlerBacku
         backupNames = new String[2];
       }
       for (int i = 0; i < 2; i++) {
-        BackupThread backupThread;
+        BackupCommand backupCommand;
         final String backupName = TestUtil.randomSimpleString(random(), 1, 20);
         if (!namedBackup) {
-          backupThread = new BackupThread(addNumberToKeepInRequest, backupKeepParamName, ReplicationHandler.CMD_BACKUP);
+          backupCommand = new BackupCommand(addNumberToKeepInRequest, backupKeepParamName, ReplicationHandler.CMD_BACKUP);
         } else {
-          backupThread = new BackupThread(backupName, ReplicationHandler.CMD_BACKUP);
+          backupCommand = new BackupCommand(backupName, ReplicationHandler.CMD_BACKUP);
           backupNames[i] = backupName;
         }
-        backupThread.start();
+        backupCommand.runCommand();
 
         File dataDir = new File(master.getDataDir());
 
@@ -167,8 +166,8 @@ public class TestReplicationHandlerBacku
           Thread.sleep(200);
         }
 
-        if (backupThread.fail != null) {
-          fail(backupThread.fail);
+        if (backupCommand.fail != null) {
+          fail(backupCommand.fail);
         }
         File[] files = null;
         if (!namedBackup) {
@@ -225,20 +224,25 @@ public class TestReplicationHandlerBacku
   }
 
   private void testDeleteNamedBackup(String backupNames[]) throws InterruptedException, IOException {
+    String lastTimestamp = null;
     for (int i = 0; i < 2; i++) {
-      BackupThread deleteBackupThread = new BackupThread(backupNames[i], ReplicationHandler.CMD_DELETE_BACKUP);
-      deleteBackupThread.start();
-      CheckDeleteBackupStatus checkDeleteBackupStatus = new CheckDeleteBackupStatus(backupNames[i]);
+      BackupCommand deleteBackupCommand = new BackupCommand(backupNames[i], ReplicationHandler.CMD_DELETE_BACKUP);
+      deleteBackupCommand.runCommand();
+      CheckDeleteBackupStatus checkDeleteBackupStatus = new CheckDeleteBackupStatus(backupNames[i], lastTimestamp);
       while (true) {
         boolean success = checkDeleteBackupStatus.fetchStatus();
         if (success) {
+          lastTimestamp = checkDeleteBackupStatus.lastTimestamp;
+          if (i == 0) {
+            Thread.sleep(1000); //make the timestamp change
+          }
           break;
         }
         Thread.sleep(200);
       }
 
-      if (deleteBackupThread.fail != null) {
-        fail(deleteBackupThread.fail);
+      if (deleteBackupCommand.fail != null) {
+        fail(deleteBackupCommand.fail);
       }
     }
   }
@@ -284,24 +288,25 @@ public class TestReplicationHandlerBacku
     };
   }
 
-  private class BackupThread extends Thread {
-    volatile String fail = null;
+  private class BackupCommand {
+    String fail = null;
     final boolean addNumberToKeepInRequest;
     String backupKeepParamName;
     String backupName;
     String cmd;
-    BackupThread(boolean addNumberToKeepInRequest, String backupKeepParamName, String command) {
+    
+    BackupCommand(boolean addNumberToKeepInRequest, String backupKeepParamName, String command) {
       this.addNumberToKeepInRequest = addNumberToKeepInRequest;
       this.backupKeepParamName = backupKeepParamName;
       this.cmd = command;
     }
-    BackupThread(String backupName, String command) {
+    BackupCommand(String backupName, String command) {
       this.backupName = backupName;
       addNumberToKeepInRequest = false;
       this.cmd = command;
     }
-    @Override
-    public void run() {
+    
+    public void runCommand() {
       String masterUrl = null;
       if(backupName != null) {
         masterUrl = buildUrl(masterJetty.getLocalPort(), context) + "/replication?command=" + cmd +
@@ -330,9 +335,11 @@ public class TestReplicationHandlerBacku
     String response = null;
     private String backupName;
     final Pattern p = Pattern.compile("<str name=\"snapshotDeletedAt\">(.*?)</str>");
-
-    private CheckDeleteBackupStatus(String backupName) {
+    String lastTimestamp;
+    
+    private CheckDeleteBackupStatus(String backupName, String lastTimestamp) {
       this.backupName = backupName;
+      this.lastTimestamp = lastTimestamp;
     }
 
     public boolean fetchStatus() throws IOException {
@@ -345,7 +352,8 @@ public class TestReplicationHandlerBacku
         response = IOUtils.toString(stream, "UTF-8");
         if(response.contains("<str name=\"status\">success</str>")) {
           Matcher m = p.matcher(response);
-          if(m.find()) {
+          if(m.find() && (lastTimestamp == null || !lastTimestamp.equals(m.group(1)))) {
+            lastTimestamp = m.group(1);
             return true;
           }
         } else if(response.contains("<str name=\"status\">Unable to delete snapshot: " + backupName + "</str>" )) {

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java Wed Oct 22 05:44:17 2014
@@ -725,4 +725,36 @@ public class QueryElevationComponentTest
       delete();
     }
   }
+
+  @Test
+  public void testWithLocalParam() throws Exception {
+    try {
+      init("schema11.xml");
+      clearIndex();
+      assertU(commit());
+      assertU(adoc("id", "7", "text", "AAAA", "str_s", "a"));
+      assertU(commit());
+
+      assertQ("", req(CommonParams.Q, "AAAA", CommonParams.QT, "/elevate",
+          CommonParams.FL, "id, score, [elevated]")
+          , "//*[@numFound='1']"
+          , "//result/doc[1]/float[@name='id'][.='7.0']"
+          , "//result/doc[1]/bool[@name='[elevated]'][.='true']"
+      );
+      assertQ("", req(CommonParams.Q, "{!q.op=AND}AAAA", CommonParams.QT, "/elevate",
+          CommonParams.FL, "id, score, [elevated]")
+          , "//*[@numFound='1']"
+          , "//result/doc[1]/float[@name='id'][.='7.0']"
+          , "//result/doc[1]/bool[@name='[elevated]'][.='true']"
+      );
+      assertQ("", req(CommonParams.Q, "{!q.op=AND v='AAAA'}", CommonParams.QT, "/elevate",
+          CommonParams.FL, "id, score, [elevated]")
+          , "//*[@numFound='1']"
+          , "//result/doc[1]/float[@name='id'][.='7.0']"
+          , "//result/doc[1]/bool[@name='[elevated]'][.='true']"
+      );
+    } finally {
+      delete();
+    }
+  }
 }

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java Wed Oct 22 05:44:17 2014
@@ -469,10 +469,9 @@ public class StatsComponentTest extends 
         "{!type=func key="+key+" ex=key_ex_tag}field("+f+")",
         "{!type=func key="+key+" ex=key_ex_tag v=field("+f+")}",
         "{!type=func key="+key+" ex=key_ex_tag v='field("+f+")'}",
-
-        // identity math functions don't work as expected due to LUCENE-5961
-        // "{!type=func key="+key+" ex=key_ex_tag v='sum(0,"+f+")'}",
-        // "{!type=func key="+key+" ex=key_ex_tag v='product(1,"+f+")'}",
+        // identity math functions
+        "{!type=func key="+key+" ex=key_ex_tag v='sum(0,"+f+")'}",
+        "{!type=func key="+key+" ex=key_ex_tag v='product(1,"+f+")'}",
       }) {
       
       assertQ("test statistics over field specified as a function: " + param,
@@ -555,10 +554,9 @@ public class StatsComponentTest extends 
         "{!type=func key="+f+" ex=key_ex_tag}field("+f+")",
         "{!type=func key="+f+" ex=key_ex_tag v=field("+f+")}",
         "{!type=func key="+f+" ex=key_ex_tag v='field("+f+")'}",
-
-        // identity math functions don't work as expected due to LUCENE-5961
-        // "{!type=func key="+f+" ex=key_ex_tag v='sum(0,"+f+")'}",
-        // "{!type=func key="+f+" ex=key_ex_tag v='product(1,"+f+")'}",
+        // identity math functions
+        "{!type=func key="+f+" ex=key_ex_tag v='sum(0,"+f+")'}",
+        "{!type=func key="+f+" ex=key_ex_tag v='product(1,"+f+")'}",
       }) {
       assertQ("test statis & stats.facet over field specified as a function: " + param,
               req("q", "*:*", "stats", "true", "stats.calcdistinct", "true",

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/TestStressLucene.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/TestStressLucene.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/TestStressLucene.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/TestStressLucene.java Wed Oct 22 05:44:17 2014
@@ -83,14 +83,12 @@ public class TestStressLucene extends Te
 
 
     final FieldType idFt = new FieldType();
-    idFt.setIndexed(true);
     idFt.setStored(true);
     idFt.setOmitNorms(true);
     idFt.setTokenized(false);
     idFt.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
 
     final FieldType ft2 = new FieldType();
-    ft2.setIndexed(false);
     ft2.setStored(true);
 
 

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java Wed Oct 22 05:44:17 2014
@@ -731,12 +731,17 @@ public class TestFunctionQuery extends S
 
   @Test
   public void testPseudoFieldFunctions() throws Exception {
-    assertU(adoc("id", "1", "text", "hello", "foo_s","A"));
+    assertU(adoc("id", "1", "text", "hello", "foo_s","A", "yak_i", "32"));
     assertU(adoc("id", "2"));
     assertU(commit());
 
-    assertJQ(req("q", "id:1", "fl", "a:1,b:2.0,c:'X',d:{!func}foo_s,e:{!func}bar_s")  // if exists() is false, no pseudo-field should be added
-        , "/response/docs/[0]=={'a':1, 'b':2.0,'c':'X','d':'A'}");
+    // if exists() is false, no pseudo-field should be added
+    assertJQ(req("q", "id:1", "fl", "a:1,b:2.0,c:'X',d:{!func}foo_s,e:{!func}bar_s")  
+             , "/response/docs/[0]=={'a':1, 'b':2.0,'c':'X','d':'A'}");
+    assertJQ(req("q", "id:1", "fl", "a:sum(yak_i,bog_i),b:mul(yak_i,bog_i),c:min(yak_i,bog_i)")  
+             , "/response/docs/[0]=={ 'c':32.0 }");
+    assertJQ(req("q", "id:1", "fl", "a:sum(yak_i,def(bog_i,42)), b:max(yak_i,bog_i)")  
+             , "/response/docs/[0]=={ 'a': 74.0, 'b':32.0 }");
   }
 
   public void testMissingFieldFunctionBehavior() throws Exception {

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/TestExceedMaxTermLength.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/TestExceedMaxTermLength.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/TestExceedMaxTermLength.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/TestExceedMaxTermLength.java Wed Oct 22 05:44:17 2014
@@ -34,7 +34,7 @@ public class TestExceedMaxTermLength ext
   public final static String TEST_SCHEMAXML_NAME = "schema11.xml";
 
   private final static int minTestTermLength = IndexWriter.MAX_TERM_LENGTH + 1;
-  private final static int maxTestTermLegnth = IndexWriter.MAX_TERM_LENGTH * 2;
+  private final static int maxTestTermLength = IndexWriter.MAX_TERM_LENGTH * 2;
 
   @BeforeClass
   public static void beforeTests() throws Exception {
@@ -54,12 +54,12 @@ public class TestExceedMaxTermLength ext
     final String longFieldName = "cat";
     final String longFieldValue = TestUtil.randomSimpleString(random(),
         minTestTermLength,
-        maxTestTermLegnth);
+        maxTestTermLength);
 
     final String okayFieldName = TestUtil.randomSimpleString(random(), 1, 50) + "_sS" ; //Dynamic field
     final String okayFieldValue = TestUtil.randomSimpleString(random(),
         minTestTermLength,
-        maxTestTermLegnth);
+        maxTestTermLength);
 
     boolean includeOkayFields = random().nextBoolean();
 
@@ -105,12 +105,12 @@ public class TestExceedMaxTermLength ext
     final String longFieldName = "cat_length";
     final String longFieldValue = TestUtil.randomSimpleString(random(),
         minTestTermLength,
-        maxTestTermLegnth);
+        maxTestTermLength);
 
     final String okayFieldName = TestUtil.randomSimpleString(random(), 1, 50) + "_sS" ; //Dynamic field
     final String okayFieldValue = TestUtil.randomSimpleString(random(),
         minTestTermLength,
-        maxTestTermLegnth);
+        maxTestTermLength);
 
     boolean includeOkayFields = random().nextBoolean();
 
@@ -138,7 +138,6 @@ public class TestExceedMaxTermLength ext
           updateJ(json(jsonStr), null);
         }
       } catch (Exception e) {
-        //expected
         fail("Should not have failed adding doc " + jsonStr);
         String msg= e.getCause().getMessage();
         assertTrue(msg.contains("one immense term in field=\"cat\""));

Modified: lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdatesTest.java Wed Oct 22 05:44:17 2014
@@ -815,6 +815,73 @@ public class AtomicUpdatesTest extends S
     assertQ(req("q", "floatRemove:\"111.111\"", "indent", "true"), "//result[@numFound = '3']");
   }
 
+ @Test
+  public void testRemoveregex() throws Exception {
+    SolrInputDocument doc;
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "1");
+    doc.setField("cat", new String[]{"aaa", "bbb", "ccc", "ccc", "ddd"});
+    assertU(adoc(doc));
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "2");
+    doc.setField("cat", new String[]{"aaa", "bbb", "bbb", "ccc", "ddd"});
+    assertU(adoc(doc));
+
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "20");
+    doc.setField("cat", new String[]{"aaa", "ccc", "ddd"});
+    assertU(adoc(doc));
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "21");
+    doc.setField("cat", new String[]{"aaa", "bbb", "ddd"});
+    assertU(adoc(doc));
+
+
+    assertU(commit());
+
+    assertQ(req("q", "cat:*", "indent", "true"), "//result[@numFound = '4']");
+    assertQ(req("q", "cat:bbb", "indent", "true"), "//result[@numFound = '3']");
+
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "1");
+    List<String> removeList = new ArrayList<>();
+    removeList.add(".b.");
+    removeList.add("c+c");
+    doc.setField("cat", ImmutableMap.of("removeregex", removeList)); //behavior when hitting Solr through ZK
+    assertU(adoc(doc));
+    assertU(commit());
+
+    assertQ(req("q", "cat:*", "indent", "true"), "//result[@numFound = '4']");
+    assertQ(req("q", "cat:bbb", "indent", "true"), "//result[@numFound = '2']");
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "21");
+    removeList = new ArrayList<>();
+    removeList.add("bb*");
+    removeList.add("cc+");
+    doc.setField("cat", ImmutableMap.of("removeregex", removeList)); //behavior when hitting Solr through ZK
+    assertU(adoc(doc));
+    assertU(commit());
+
+    assertQ(req("q", "cat:*", "indent", "true"), "//result[@numFound = '4']");
+    assertQ(req("q", "cat:bbb", "indent", "true"), "//result[@numFound = '1']");
+
+    doc = new SolrInputDocument();
+    doc.setField("id", "1");
+    doc.setField("cat", ImmutableMap.of("removeregex", "a.a")); //behavior when hitting Solr directly
+
+    assertU(adoc(doc));
+    assertU(commit());
+
+    assertQ(req("q", "cat:*", "indent", "true"), "//result[@numFound = '4']");
+    assertQ(req("q", "cat:aaa", "indent", "true"), "//result[@numFound = '3']");
+  }
+
   @Test
   public void testAdd() throws Exception {
     SolrInputDocument doc = new SolrInputDocument();

Modified: lucene/dev/branches/lucene5969/solr/example/example-DIH/ivy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/example/example-DIH/ivy.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/example/example-DIH/ivy.xml (original)
+++ lucene/dev/branches/lucene5969/solr/example/example-DIH/ivy.xml Wed Oct 22 05:44:17 2014
@@ -18,10 +18,12 @@
 -->
 <ivy-module version="2.0">
     <info organisation="org.apache.solr" module="example-DIH"/>
-
+    <configurations defaultconfmapping="compile->master">
+      <conf name="compile" transitive="false"/>
+    </configurations>
     <dependencies>
-      <dependency org="hsqldb" name="hsqldb" rev="${/hsqldb/hsqldb}" transitive="false"/>
-      <dependency org="org.apache.derby" name="derby" rev="${/org.apache.derby/derby}" transitive="false"/>
+      <dependency org="hsqldb" name="hsqldb" rev="${/hsqldb/hsqldb}" conf="compile"/>
+      <dependency org="org.apache.derby" name="derby" rev="${/org.apache.derby/derby}" conf="compile"/>
       <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
     </dependencies>
 </ivy-module>

Modified: lucene/dev/branches/lucene5969/solr/example/ivy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/example/ivy.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/example/ivy.xml (original)
+++ lucene/dev/branches/lucene5969/solr/example/ivy.xml Wed Oct 22 05:44:17 2014
@@ -17,36 +17,39 @@
    under the License.    
 -->
 <ivy-module version="2.0">
-    <info organisation="org.apache.solr" module="example"/>
-    <configurations>
-      <conf name="jetty" description="jetty jars"/>
-      <conf name="start" description="jetty start jar"/>
-      <conf name="servlet" description="servlet-api jar"/>
-      <conf name="logging" description="logging setup"/>
-    </configurations>
+  <info organisation="org.apache.solr" module="example"/>
+  <configurations defaultconfmapping="jetty->master;start->master;servlet->master;logging->master">
+    <conf name="jetty" description="jetty jars" transitive="false"/>
+    <conf name="start" description="jetty start jar" transitive="false"/>
+    <conf name="servlet" description="servlet-api jar" transitive="false"/>
+    <conf name="logging" description="logging setup" transitive="false"/>
+  </configurations>
 
-    <dependencies>
-    
-      <dependency org="log4j" name="log4j" rev="${/log4j/log4j}" transitive="false" conf="logging->default"/>
-      <dependency org="org.slf4j" name="slf4j-api" rev="${/org.slf4j/slf4j-api}" transitive="false" conf="logging->default"/>
-      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" transitive="false" conf="logging->default"/>
-      <dependency org="org.slf4j" name="jul-to-slf4j" rev="${/org.slf4j/jul-to-slf4j}" transitive="false" conf="logging->default"/> 
-      <dependency org="org.slf4j" name="slf4j-log4j12" rev="${/org.slf4j/slf4j-log4j12}" transitive="false" conf="logging->default"/> 
-      <dependency org="org.eclipse.jetty" name="jetty-continuation" rev="${/org.eclipse.jetty/jetty-continuation}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-deploy" rev="${/org.eclipse.jetty/jetty-deploy}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-http" rev="${/org.eclipse.jetty/jetty-http}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-io" rev="${/org.eclipse.jetty/jetty-io}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-jmx" rev="${/org.eclipse.jetty/jetty-jmx}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-security" rev="${/org.eclipse.jetty/jetty-security}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-server" rev="${/org.eclipse.jetty/jetty-server}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-servlet" rev="${/org.eclipse.jetty/jetty-servlet}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-util" rev="${/org.eclipse.jetty/jetty-util}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-webapp" rev="${/org.eclipse.jetty/jetty-webapp}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-xml" rev="${/org.eclipse.jetty/jetty-xml}" transitive="false" conf="jetty->default"/>
-      <dependency org="org.eclipse.jetty" name="jetty-start" rev="${/org.eclipse.jetty/jetty-start}" transitive="false" conf="start->default"/>
-      <dependency org="org.eclipse.jetty.orbit" name="javax.servlet" rev="${/org.eclipse.jetty.orbit/javax.servlet}" transitive="false" conf="servlet->default">
-        <artifact name="javax.servlet" type="orbit" ext="jar"/>
-      </dependency>
-      <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
-    </dependencies>
+  <dependencies>
+    <dependency org="log4j" name="log4j" rev="${/log4j/log4j}" conf="logging"/>
+    <dependency org="org.slf4j" name="slf4j-api" rev="${/org.slf4j/slf4j-api}" conf="logging"/>
+    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" conf="logging"/>
+    <dependency org="org.slf4j" name="jul-to-slf4j" rev="${/org.slf4j/jul-to-slf4j}" conf="logging"/> 
+    <dependency org="org.slf4j" name="slf4j-log4j12" rev="${/org.slf4j/slf4j-log4j12}" conf="logging"/> 
+      
+    <dependency org="org.eclipse.jetty" name="jetty-continuation" rev="${/org.eclipse.jetty/jetty-continuation}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-deploy" rev="${/org.eclipse.jetty/jetty-deploy}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-http" rev="${/org.eclipse.jetty/jetty-http}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-io" rev="${/org.eclipse.jetty/jetty-io}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-jmx" rev="${/org.eclipse.jetty/jetty-jmx}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-security" rev="${/org.eclipse.jetty/jetty-security}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-server" rev="${/org.eclipse.jetty/jetty-server}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-servlet" rev="${/org.eclipse.jetty/jetty-servlet}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-util" rev="${/org.eclipse.jetty/jetty-util}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-webapp" rev="${/org.eclipse.jetty/jetty-webapp}" conf="jetty"/>
+    <dependency org="org.eclipse.jetty" name="jetty-xml" rev="${/org.eclipse.jetty/jetty-xml}" conf="jetty"/>
+
+    <dependency org="org.eclipse.jetty" name="jetty-start" rev="${/org.eclipse.jetty/jetty-start}" conf="start"/>
+
+    <dependency org="org.eclipse.jetty.orbit" name="javax.servlet" rev="${/org.eclipse.jetty.orbit/javax.servlet}" conf="servlet">
+      <artifact name="javax.servlet" type="orbit" ext="jar"/>
+    </dependency>
+
+    <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
+  </dependencies>
 </ivy-module>

Modified: lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/schema.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/schema.xml (original)
+++ lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/schema.xml Wed Oct 22 05:44:17 2014
@@ -156,6 +156,7 @@
    <field name="content_type" type="string" indexed="true" stored="true" multiValued="true"/>
    <field name="last_modified" type="date" indexed="true" stored="true"/>
    <field name="links" type="string" indexed="true" stored="true" multiValued="true"/>
+   <field name="_src" type="string" indexed="false" stored="true"/>
 
    <!-- Main body of document extracted by SolrCell.
         NOTE: This field is not indexed by default, since it is also copied to "text"

Modified: lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/solrconfig.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/solrconfig.xml (original)
+++ lucene/dev/branches/lucene5969/solr/example/solr/collection1/conf/solrconfig.xml Wed Oct 22 05:44:17 2014
@@ -1057,6 +1057,19 @@
       <str name="df">text</str>
     </lst>
   </initParams>
+
+  <initParams path="/update/json/docs">
+    <lst name="defaults">
+      <!--this ensures that the entire json doc will be stored verbatim into one field-->
+      <str name="srcField">_src</str>
+      <!--This means a the uniqueKeyField will be extracted from the fields and
+       all fields go into the 'df' field. In this config df is already configured to be 'text'
+        -->
+      <str name="mapUniqueKeyOnly">true</str>
+    </lst>
+
+  </initParams>
+
   <!-- The following are implicitly added
   <requestHandler name="/update/json" class="solr.UpdateRequestHandler">
         <lst name="defaults">

Modified: lucene/dev/branches/lucene5969/solr/solrj/ivy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/solrj/ivy.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/solrj/ivy.xml (original)
+++ lucene/dev/branches/lucene5969/solr/solrj/ivy.xml Wed Oct 22 05:44:17 2014
@@ -19,7 +19,7 @@
 <ivy-module version="2.0">
   <info organisation="org.apache.solr" module="solrj"/>
 
-  <configurations>
+  <configurations defaultconfmapping="compile->master;test->master">
     <!-- artifacts in the "compile" configuration will go into solr/solrj/lib/ -->
     <conf name="compile" transitive="false"/>
     <!-- artifacts in the "test" configuration will go into solr/solrj/test-lib/ -->
@@ -27,17 +27,17 @@
   </configurations>
 
   <dependencies>
-    <dependency org="org.apache.zookeeper" name="zookeeper" rev="${/org.apache.zookeeper/zookeeper}" conf="compile->*"/>
-    <dependency org="org.apache.httpcomponents" name="httpclient" rev="${/org.apache.httpcomponents/httpclient}" conf="compile->*"/>
-    <dependency org="org.apache.httpcomponents" name="httpmime" rev="${/org.apache.httpcomponents/httpmime}" conf="compile->*"/>
-    <dependency org="org.apache.httpcomponents" name="httpcore" rev="${/org.apache.httpcomponents/httpcore}" conf="compile->*"/>
-    <dependency org="commons-io" name="commons-io" rev="${/commons-io/commons-io}" conf="compile->*"/>
-    <dependency org="org.codehaus.woodstox" name="wstx-asl" rev="${/org.codehaus.woodstox/wstx-asl}" conf="compile->*"/>
-    <dependency org="org.noggit" name="noggit" rev="${/org.noggit/noggit}" conf="compile->*"/>
-    <dependency org="org.slf4j" name="slf4j-api" rev="${/org.slf4j/slf4j-api}" conf="compile->*"/>
+    <dependency org="org.apache.zookeeper" name="zookeeper" rev="${/org.apache.zookeeper/zookeeper}" conf="compile"/>
+    <dependency org="org.apache.httpcomponents" name="httpclient" rev="${/org.apache.httpcomponents/httpclient}" conf="compile"/>
+    <dependency org="org.apache.httpcomponents" name="httpmime" rev="${/org.apache.httpcomponents/httpmime}" conf="compile"/>
+    <dependency org="org.apache.httpcomponents" name="httpcore" rev="${/org.apache.httpcomponents/httpcore}" conf="compile"/>
+    <dependency org="commons-io" name="commons-io" rev="${/commons-io/commons-io}" conf="compile"/>
+    <dependency org="org.codehaus.woodstox" name="wstx-asl" rev="${/org.codehaus.woodstox/wstx-asl}" conf="compile"/>
+    <dependency org="org.noggit" name="noggit" rev="${/org.noggit/noggit}" conf="compile"/>
+    <dependency org="org.slf4j" name="slf4j-api" rev="${/org.slf4j/slf4j-api}" conf="compile"/>
 
-    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" conf="test->*"/>
-    <dependency org="org.slf4j" name="slf4j-log4j12" rev="${/org.slf4j/slf4j-log4j12}" conf="test->*"/>
+    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" conf="test"/>
+    <dependency org="org.slf4j" name="slf4j-log4j12" rev="${/org.slf4j/slf4j-log4j12}" conf="test"/>
 
     <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
   </dependencies>

Modified: lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java (original)
+++ lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java Wed Oct 22 05:44:17 2014
@@ -205,8 +205,10 @@ public class ClusterState implements JSO
       if (c != null) states = Collections.singletonList( c );
     }
 
-    for (CollectionRef coll : states) {
-      for (Slice slice : coll.get().getSlices()) {
+    for (CollectionRef ref : states) {
+      DocCollection coll = ref.get();
+      if(coll == null) continue;// this collection go tremoved in between, skip
+      for (Slice slice : coll.getSlices()) {
         for (Replica replica : slice.getReplicas()) {
           // TODO: for really large clusters, we could 'index' on this
           String rnodeName = replica.getStr(ZkStateReader.NODE_NAME_PROP);
@@ -220,25 +222,6 @@ public class ClusterState implements JSO
     return null;
   }
   
-  /*public String getShardIdByCoreNodeName(String collectionName, String coreNodeName) {
-    Collection<DocCollection> states = collectionStates.values();
-    if (collectionName != null) {
-      CollectionRef c = collectionStates.get(collectionName);
-      if (c != null) states = Collections.singletonList(c);
-    }
-
-    for (DocCollection coll : states) {
-      for (Slice slice : coll.getSlices()) {
-        for (Replica replica : slice.getReplicas()) {
-          if (coreNodeName.equals(replica.getName())) {
-            return slice.getName();
-          }
-        }
-      }
-    }
-    return null;
-  }*/
-
   /**
    * Check if node is alive. 
    */

Modified: lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Wed Oct 22 05:44:17 2014
@@ -71,7 +71,8 @@ public class ZkStateReader implements Cl
   public static final String LEADER_PROP = "leader";
   public static final String PROPERTY_PROP = "property";
   public static final String PROPERTY_VALUE_PROP = "property.value";
-  
+  public static final String MAX_AT_ONCE_PROP = "maxAtOnce";
+  public static final String MAX_WAIT_SECONDS_PROP = "maxWaitSeconds";
   public static final String COLLECTIONS_ZKNODE = "/collections";
   public static final String LIVE_NODES_ZKNODE = "/live_nodes";
   public static final String ALIASES = "/aliases.json";

Modified: lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java (original)
+++ lucene/dev/branches/lucene5969/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java Wed Oct 22 05:44:17 2014
@@ -49,7 +49,8 @@ public interface CollectionParams 
     CLUSTERSTATUS,
     ADDREPLICAPROP,
     DELETEREPLICAPROP,
-    BALANCESLICEUNIQUE;
+    BALANCESLICEUNIQUE,
+    REBALANCELEADERS;
     
     public static CollectionAction get( String p )
     {

Modified: lucene/dev/branches/lucene5969/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java (original)
+++ lucene/dev/branches/lucene5969/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java Wed Oct 22 05:44:17 2014
@@ -17,13 +17,24 @@
 
 package org.apache.solr.client.solrj.embedded;
 
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.InputStreamEntity;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrExampleTests;
+import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrDocument;
 import org.apache.solr.util.ExternalPaths;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.noggit.ObjectBuilder;
 
 /**
  * TODO? perhaps use:
@@ -52,4 +63,36 @@ public class SolrExampleJettyTest extend
       // expected
     }
   }
+
+  @Test
+  public void testArbitraryJsonIndexing() throws Exception  {
+    HttpSolrServer server = (HttpSolrServer) getSolrServer();
+    server.deleteByQuery("*:*");
+    server.commit();
+    assertNumFound("*:*", 0); // make sure it got in
+
+    // two docs, one with uniqueKey, another without it
+    String json = "{\"id\":\"abc1\", \"name\": \"name1\"} {\"name\" : \"name2\"}";
+    HttpClient httpClient = server.getHttpClient();
+    HttpPost post = new HttpPost(server.getBaseURL() + "/update/json/docs");
+    post.setHeader("Content-Type", "application/json");
+    post.setEntity(new InputStreamEntity(new ByteArrayInputStream(json.getBytes("UTF-8")), -1));
+    HttpResponse response = httpClient.execute(post);
+    assertEquals(200, response.getStatusLine().getStatusCode());
+    server.commit();
+    QueryResponse rsp = getSolrServer().query(new SolrQuery("*:*"));
+    assertEquals(2,rsp.getResults().getNumFound());
+
+    SolrDocument doc = rsp.getResults().get(0);
+    String src = (String) doc.getFieldValue("_src");
+    Map m = (Map) ObjectBuilder.fromJSON(src);
+    assertEquals("abc1",m.get("id"));
+    assertEquals("name1",m.get("name"));
+
+    doc = rsp.getResults().get(1);
+    src = (String) doc.getFieldValue("_src");
+    m = (Map) ObjectBuilder.fromJSON(src);
+    assertEquals("name2",m.get("name"));
+
+  }
 }

Modified: lucene/dev/branches/lucene5969/solr/test-framework/ivy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/test-framework/ivy.xml?rev=1633538&r1=1633537&r2=1633538&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/test-framework/ivy.xml (original)
+++ lucene/dev/branches/lucene5969/solr/test-framework/ivy.xml Wed Oct 22 05:44:17 2014
@@ -17,26 +17,26 @@
    under the License.    
 -->
 <ivy-module version="2.0">
-    <info organisation="org.apache.solr" module="solr-test-framework"/>
+  <info organisation="org.apache.solr" module="solr-test-framework"/>
 
-    <configurations>
-      <conf name="default" />
-      <!-- 
-      JUnit4 ANT task only, no ANT.
-      This is used from build scripts for taskdefs.
-      -->
-      <conf name="junit4-stdalone" />
-    </configurations>
+  <configurations defaultconfmapping="compile->master;junit4-stdalone->master">
+    <conf name="compile" transitive="false" />
+    <!-- 
+    JUnit4 ANT task only, no ANT.
+    This is used from build scripts for taskdefs.
+    -->
+    <conf name="junit4-stdalone" transitive="false" />
+  </configurations>
 
-    <dependencies defaultconf="default">
-      <dependency org="org.apache.ant" name="ant" rev="${/org.apache.ant/ant}" transitive="false" />
+  <dependencies>
+    <dependency org="org.apache.ant" name="ant" rev="${/org.apache.ant/ant}" conf="compile" />
+ 
+    <dependency org="junit" name="junit" rev="${/junit/junit}" conf="compile;junit4-stdalone">
+      <exclude org="org.hamcrest" module="hamcrest-core" />
+    </dependency>
+    <dependency org="com.carrotsearch.randomizedtesting" name="junit4-ant" rev="${/com.carrotsearch.randomizedtesting/junit4-ant}" conf="compile;junit4-stdalone" />
+    <dependency org="com.carrotsearch.randomizedtesting" name="randomizedtesting-runner" rev="${/com.carrotsearch.randomizedtesting/randomizedtesting-runner}" conf="compile;junit4-stdalone" />
 
-      <dependency org="junit" name="junit" rev="${/junit/junit}" transitive="false" conf="default->*;junit4-stdalone->*">
-        <exclude org="org.hamcrest" module="hamcrest-core"/>
-      </dependency>
-      <dependency org="com.carrotsearch.randomizedtesting" name="junit4-ant" rev="${/com.carrotsearch.randomizedtesting/junit4-ant}" transitive="false" conf="default->*;junit4-stdalone->*" />
-      <dependency org="com.carrotsearch.randomizedtesting" name="randomizedtesting-runner" rev="${/com.carrotsearch.randomizedtesting/randomizedtesting-runner}" transitive="false" conf="default->*;junit4-stdalone->*" />
-
-      <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
-    </dependencies>
+    <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
+  </dependencies>
 </ivy-module>