You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2014/10/07 18:26:17 UTC
svn commit: r1629922 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/core/ lucene/core/src/java/org/apache/lucene/util/
lucene/core/src/test/org/apache/lucene/index/
lucene/core/src/test/org/apache/lucene/search/
lucene/core/src/test/org/apache/...
Author: jpountz
Date: Tue Oct 7 16:26:16 2014
New Revision: 1629922
URL: http://svn.apache.org/r1629922
Log:
LUCENE-5996: Collections.shuffle(List) is now a forbidden API.
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/StringHelper.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/Test2BTerms.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSameScoresWithThreads.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/util/TestSparseFixedBitSet.java
lucene/dev/branches/branch_5x/lucene/test-framework/ (props changed)
lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/BaseStoredFieldsFormatTestCase.java
lucene/dev/branches/branch_5x/lucene/tools/ (props changed)
lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/StringHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/StringHelper.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/StringHelper.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/StringHelper.java Tue Oct 7 16:26:16 2014
@@ -162,10 +162,7 @@ public abstract class StringHelper {
if (prop != null) {
// So if there is a test failure that relied on hash
// order, we remain reproducible based on the test seed:
- if (prop.length() > 8) {
- prop = prop.substring(prop.length()-8);
- }
- GOOD_FAST_HASH_SEED = (int) Long.parseLong(prop, 16);
+ GOOD_FAST_HASH_SEED = prop.hashCode();
} else {
GOOD_FAST_HASH_SEED = (int) System.currentTimeMillis();
}
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/Test2BTerms.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/Test2BTerms.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/Test2BTerms.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/Test2BTerms.java Tue Oct 7 16:26:16 2014
@@ -261,7 +261,7 @@ public class Test2BTerms extends LuceneT
private void testSavedTerms(IndexReader r, List<BytesRef> terms) throws IOException {
System.out.println("TEST: run " + terms.size() + " terms on reader=" + r);
IndexSearcher s = newSearcher(r);
- Collections.shuffle(terms);
+ Collections.shuffle(terms, random());
TermsEnum termsEnum = MultiFields.getTerms(r, "field").iterator(null);
boolean failed = false;
for(int iter=0;iter<10*terms.size();iter++) {
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexReaderClose.java Tue Oct 7 16:26:16 2014
@@ -122,7 +122,7 @@ public class TestIndexReaderClose extend
leafReader.addCoreClosedListener(listeners.get(random().nextInt(listeners.size())));
}
final int removed = random().nextInt(numListeners);
- Collections.shuffle(listeners);
+ Collections.shuffle(listeners, random());
for (int i = 0; i < removed; ++i) {
leafReader.removeCoreClosedListener(listeners.get(i));
}
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSameScoresWithThreads.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSameScoresWithThreads.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSameScoresWithThreads.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSameScoresWithThreads.java Tue Oct 7 16:26:16 2014
@@ -93,7 +93,7 @@ public class TestSameScoresWithThreads e
startingGun.await();
for(int i=0;i<20;i++) {
List<Map.Entry<BytesRef,TopDocs>> shuffled = new ArrayList<>(answers.entrySet());
- Collections.shuffle(shuffled);
+ Collections.shuffle(shuffled, random());
for(Map.Entry<BytesRef,TopDocs> ent : shuffled) {
TopDocs actual = s.search(new TermQuery(new Term("body", ent.getKey())), 100);
TopDocs expected = ent.getValue();
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/util/TestSparseFixedBitSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/util/TestSparseFixedBitSet.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/util/TestSparseFixedBitSet.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/util/TestSparseFixedBitSet.java Tue Oct 7 16:26:16 2014
@@ -34,14 +34,14 @@ public class TestSparseFixedBitSet exten
for (int doc = bs.nextSetBit(0); doc != -1; doc = bs.nextSetBit(doc + 1)) {
buffer.add(doc);
if (buffer.size() >= 100000) {
- Collections.shuffle(buffer);
+ Collections.shuffle(buffer, random());
for (int i : buffer) {
set.set(i);
}
buffer.clear();
}
}
- Collections.shuffle(buffer);
+ Collections.shuffle(buffer, random());
for (int i : buffer) {
set.set(i);
}
Modified: lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/BaseStoredFieldsFormatTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/BaseStoredFieldsFormatTestCase.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/BaseStoredFieldsFormatTestCase.java (original)
+++ lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/BaseStoredFieldsFormatTestCase.java Tue Oct 7 16:26:16 2014
@@ -125,7 +125,7 @@ public abstract class BaseStoredFieldsFo
w.addDocument(doc);
if (rand.nextInt(50) == 17) {
// mixup binding of field name -> Number every so often
- Collections.shuffle(fieldIDs);
+ Collections.shuffle(fieldIDs, random());
}
if (rand.nextInt(5) == 3 && i > 0) {
final String delID = ""+rand.nextInt(i);
Modified: lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt Tue Oct 7 16:26:16 2014
@@ -31,3 +31,6 @@ java.lang.Character#codePointBefore(char
java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars
java.io.File#delete() @ use Files.delete for real exception, IOUtils.deleteFilesIgnoringExceptions if you dont care
+
+@defaultMessage Use shuffle(List, Random) instead so that it can be reproduced
+java.util.Collections#shuffle(java.util.List)
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Tue Oct 7 16:26:16 2014
@@ -23,7 +23,6 @@ import static org.apache.solr.common.clo
import static org.apache.solr.common.cloud.ZkStateReader.PROPERTY_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.PROPERTY_VALUE_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
-
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICAPROP;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
@@ -48,6 +47,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Random;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
@@ -164,6 +164,18 @@ public class OverseerCollectionProcessor
ZkStateReader.MAX_SHARDS_PER_NODE, "1",
ZkStateReader.AUTO_ADD_REPLICAS, "false");
+ private static final Random RANDOM;
+ static {
+ // We try to make things reproducible in the context of our tests by initializing the random instance
+ // based on the current seed
+ String seed = System.getProperty("tests.seed");
+ if (seed == null) {
+ RANDOM = new Random();
+ } else {
+ RANDOM = new Random(seed.hashCode());
+ }
+ }
+
public ExecutorService tpe ;
private static Logger log = LoggerFactory
@@ -1623,8 +1635,8 @@ public class OverseerCollectionProcessor
Set<String> nodes = clusterState.getLiveNodes();
List<String> nodeList = new ArrayList<>(nodes.size());
nodeList.addAll(nodes);
-
- Collections.shuffle(nodeList);
+
+ Collections.shuffle(nodeList, RANDOM);
// TODO: Have maxShardsPerNode param for this operation?
@@ -1634,7 +1646,7 @@ public class OverseerCollectionProcessor
// TODO: change this to handle sharding a slice into > 2 sub-shards.
for (int i = 1; i <= subSlices.size(); i++) {
- Collections.shuffle(nodeList);
+ Collections.shuffle(nodeList, RANDOM);
String sliceName = subSlices.get(i - 1);
for (int j = 2; j <= repFactor; j++) {
String subShardNodeName = nodeList.get((repFactor * (i - 1) + (j - 2)) % nodeList.size());
@@ -2284,7 +2296,7 @@ public class OverseerCollectionProcessor
List<String> nodeList = new ArrayList<>(nodes.size());
nodeList.addAll(nodes);
if (createNodeList != null) nodeList.retainAll(createNodeList);
- Collections.shuffle(nodeList);
+ Collections.shuffle(nodeList, RANDOM);
if (nodeList.size() <= 0) {
throw new SolrException(ErrorCode.BAD_REQUEST, "Cannot create collection " + collectionName
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java Tue Oct 7 16:26:16 2014
@@ -1266,7 +1266,7 @@ public class CollectionsAPIDistributedZk
createCollection(collectionName, client, 2, 2);
String newReplicaName = Assign.assignNode(collectionName, client.getZkStateReader().getClusterState());
ArrayList<String> nodeList = new ArrayList<>(client.getZkStateReader().getClusterState().getLiveNodes());
- Collections.shuffle(nodeList);
+ Collections.shuffle(nodeList, random());
CollectionAdminRequest.AddReplica addReplica = new CollectionAdminRequest.AddReplica();
addReplica.setCollectionName(collectionName);
addReplica.setShardName("shard1");
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java Tue Oct 7 16:26:16 2014
@@ -137,7 +137,7 @@ public class OverseerRolesTest extends
log.info("Current leader {} ", currentLeader);
l.remove(currentLeader);
- Collections.shuffle(l);
+ Collections.shuffle(l, random());
String overseerDesignate = l.get(0);
log.info("overseerDesignate {}",overseerDesignate);
setOverseerRole(CollectionAction.ADDROLE,overseerDesignate);
@@ -165,7 +165,7 @@ public class OverseerRolesTest extends
l.remove(overseerDesignate);
- Collections.shuffle(l);
+ Collections.shuffle(l, random());
String anotherOverseer = l.get(0);
log.info("Adding another overseer designate {}", anotherOverseer);
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java?rev=1629922&r1=1629921&r2=1629922&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java Tue Oct 7 16:26:16 2014
@@ -198,7 +198,7 @@ public class AddBlockUpdateTest extends
block("Y"),
block("Z")));
- Collections.shuffle(blocks);
+ Collections.shuffle(blocks, random());
log.trace("{}", blocks);