Resolve AbstractCloudBackupRestoreTestCase flakiness

The 'testBackupAndRestore' method in this class was asserting that the
collection created by restore had the expected number of cores-per-node,
but the logic to compute that expected cores-per-node value failed to
account for a rarely-triggered branch that adds a 'createNodeSet' param
to the restore.

This commit updates the test logic to compute the expected
cores-per-node value when createNodeSet is passed.
This commit is contained in:
Jason Gerlowski 2021-02-17 15:59:17 -05:00
parent 1484c74ba7
commit c3f6e12876
1 changed files with 19 additions and 21 deletions

View File

@ -16,19 +16,6 @@
*/ */
package org.apache.solr.cloud.api.collections; package org.apache.solr.cloud.api.collections;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.not;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.TreeMap;
import org.apache.lucene.util.TestUtil; import org.apache.lucene.util.TestUtil;
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.SolrServerException;
@ -53,6 +40,19 @@ import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.TreeMap;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.not;
/** /**
* Used to test the traditional (now deprecated) 'full-snapshot' method of backup/restoration. * Used to test the traditional (now deprecated) 'full-snapshot' method of backup/restoration.
* *
@ -329,7 +329,8 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
int restoreReplFactor = restoreReplcationFactor + restoreTlogReplicas + restorePullReplicas; int restoreReplFactor = restoreReplcationFactor + restoreTlogReplicas + restorePullReplicas;
CollectionAdminRequest.Restore restore = CollectionAdminRequest.restoreCollection(restoreCollectionName, backupName) CollectionAdminRequest.Restore restore = CollectionAdminRequest.restoreCollection(restoreCollectionName, backupName)
.setLocation(backupLocation).setRepositoryName(getBackupRepoName()); .setLocation(backupLocation)
.setRepositoryName(getBackupRepoName());
//explicitly specify the replicationFactor/pullReplicas/nrtReplicas/tlogReplicas. //explicitly specify the replicationFactor/pullReplicas/nrtReplicas/tlogReplicas.
if (setExternalReplicationFactor) { if (setExternalReplicationFactor) {
@ -337,19 +338,16 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
restore.setTlogReplicas(restoreTlogReplicas); restore.setTlogReplicas(restoreTlogReplicas);
restore.setPullReplicas(restorePullReplicas); restore.setPullReplicas(restorePullReplicas);
} }
int computeRestoreMaxShardsPerNode = (int) Math.ceil((restoreReplFactor * numShards/(double) cluster.getJettySolrRunners().size())); int restoreNodeSetSize = cluster.getJettySolrRunners().size();
if (rarely()) { // Test that restore command obeys createNodeSet if provided.
if (rarely()) { // Try with createNodeSet configuration
//Always 1 as cluster.getJettySolrRunners().size()=NUM_SHARDS=2
restore.setCreateNodeSet(cluster.getJettySolrRunners().get(0).getNodeName()); restore.setCreateNodeSet(cluster.getJettySolrRunners().get(0).getNodeName());
restoreNodeSetSize = 1;
} }
final int restoreMaxShardsPerNode = (int) Math.ceil((restoreReplFactor * numShards/(double) restoreNodeSetSize));
final int restoreMaxShardsPerNode = computeRestoreMaxShardsPerNode;
Properties props = new Properties(); Properties props = new Properties();
props.setProperty("customKey", "customVal"); props.setProperty("customKey", "customVal");
restore.setProperties(props); restore.setProperties(props);
if (sameConfig==false) { if (sameConfig==false) {
restore.setConfigName("customConfigName"); restore.setConfigName("customConfigName");
} }