policy should compare the approx val instead of actual val when moving replicas around

This commit is contained in:
Noble Paul 2017-10-02 13:05:50 +10:30
parent fba51f34d7
commit 942b6715b3
2 changed files with 73 additions and 24 deletions

View File

@ -253,20 +253,7 @@ public class Policy implements MapWriter {
* Apply the preferences and conditions
*/
private void applyRules() {
if (!clusterPreferences.isEmpty()) {
//this is to set the approximate value according to the precision
ArrayList<Row> tmpMatrix = new ArrayList<>(matrix);
for (Preference p : clusterPreferences) {
Collections.sort(tmpMatrix, (r1, r2) -> p.compare(r1, r2, false));
p.setApproxVal(tmpMatrix);
}
//approximate values are set now. Let's do recursive sorting
Collections.sort(matrix, (Row r1, Row r2) -> {
int result = clusterPreferences.get(0).compare(r1, r2, true);
if (result == 0) result = clusterPreferences.get(0).compare(r1, r2, false);
return result;
});
}
setApproxValuesAndSortNodes(clusterPreferences, matrix);
for (Clause clause : expandedClauses) {
List<Violation> errs = clause.test(matrix);
@ -274,6 +261,8 @@ public class Policy implements MapWriter {
}
}
public List<Violation> getViolations() {
return violations;
}
@ -303,6 +292,22 @@ public class Policy implements MapWriter {
}
}
static void setApproxValuesAndSortNodes(List<Preference> clusterPreferences, List<Row> matrix) {
if (!clusterPreferences.isEmpty()) {
//this is to set the approximate value according to the precision
ArrayList<Row> tmpMatrix = new ArrayList<>(matrix);
for (Preference p : clusterPreferences) {
Collections.sort(tmpMatrix, (r1, r2) -> p.compare(r1, r2, false));
p.setApproxVal(tmpMatrix);
}
//approximate values are set now. Let's do recursive sorting
Collections.sort(matrix, (Row r1, Row r2) -> {
int result = clusterPreferences.get(0).compare(r1, r2, true);
if (result == 0) result = clusterPreferences.get(0).compare(r1, r2, false);
return result;
});
}
}
public Session createSession(ClusterDataProvider dataProvider) {
return new Session(dataProvider);
@ -470,7 +475,8 @@ public class Policy implements MapWriter {
}
}
protected List<Violation> testChangedMatrix(boolean strict, List<Row> rows) {
List<Violation> testChangedMatrix(boolean strict, List<Row> rows) {
setApproxValuesAndSortNodes(session.getPolicy().clusterPreferences,rows);
List<Violation> errors = new ArrayList<>();
for (Clause clause : session.expandedClauses) {
if (strict || clause.strict) {
@ -615,6 +621,6 @@ public class Policy implements MapWriter {
* a value {@code 1} if r1 is less loaded than r2
*/
static int compareRows(Row r1, Row r2, Policy policy) {
return policy.clusterPreferences.get(0).compare(r1, r2, false);
return policy.clusterPreferences.get(0).compare(r1, r2, true);
}
}

View File

@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.cloud.autoscaling;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -34,19 +35,24 @@ import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.cloud.autoscaling.Clause.Violation;
import org.apache.solr.client.solrj.cloud.autoscaling.Policy.Suggester.Hint;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.cloud.autoscaling.TriggerEvent;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.ReplicaPosition;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.Pair;
import org.apache.solr.common.util.Utils;
import org.apache.solr.common.util.ValidatingJsonMap;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.MOVEREPLICA;
public class TestPolicy extends SolrTestCaseJ4 {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static String clusterState = "{'gettingstarted':{" +
" 'router':{'name':'compositeId'}," +
@ -1185,19 +1191,19 @@ public class TestPolicy extends SolrTestCaseJ4 {
public void testMultiReplicaPlacement() {
String autoScaleJson = "{" +
" 'cluster-preferences': [" +
" cluster-preferences: [" +
" { maximize : freedisk , precision: 50}," +
" { minimize : cores, precision: 2}" +
" ]," +
" 'cluster-policy': [" +
" { replica : '0' , 'nodeRole': 'overseer'}," +
" { 'replica': '<2', 'shard': '#ANY', 'node': '#ANY'" +
" cluster-policy: [" +
" { replica : '0' , nodeRole: overseer}," +
" { replica: '<2', shard: '#ANY', node: '#ANY'" +
" }" +
" ]," +
" 'policies': {" +
" 'policy1': [" +
" { 'replica': '<2', 'shard': '#EACH', 'node': '#ANY'}," +
" { 'replica': '<2', 'shard': '#EACH', 'sysprop.rack': 'rack1'}" +
" policies: {" +
" policy1: [" +
" { replica: '<2', shard: '#EACH', node: '#ANY'}," +
" { replica: '<2', shard: '#EACH', sysprop.rack: rack1}" +
" ]" +
" }" +
"}";
@ -1271,5 +1277,42 @@ public class TestPolicy extends SolrTestCaseJ4 {
assertNull(op);
}
public void testComputePlanAfterNodeAdded() {
String dataproviderdata = "{" +
" liveNodes:[" +
" '127.0.0.1:51078_solr'," +
" '127.0.0.1:51147_solr']," +
" replicaInfo:{" +
" '127.0.0.1:51147_solr':{}," +
" '127.0.0.1:51078_solr':{testNodeAdded:{shard1:[" +
" { core_node3 : { type : NRT}}," +
" { core_node4 : { type : NRT}}]}}}," +
" nodeValues:{" +
" '127.0.0.1:51147_solr':{" +
" node:'127.0.0.1:51147_solr'," +
" cores:0," +
" freedisk : 880.5428657531738}," +
" '127.0.0.1:51078_solr':{" +
" node:'127.0.0.1:51078_solr'," +
" cores:2," +
" freedisk:880.5428695678711}}}";
String autoScalingjson = "cluster-preferences:[" +
" {minimize : cores}," +
" {'maximize':freedisk , precision:100}], " +
" cluster-policy:[{cores:'<10',node:'#ANY'}," +
" {replica:'<2', shard:'#EACH',node:'#ANY'}," +
" { nodeRole:overseer,replica:0}]}";
Policy policy = new Policy((Map<String, Object>) Utils.fromJSONString(autoScalingjson));
Policy.Session session = policy.createSession(dataProviderWithData(dataproviderdata));
Policy.Suggester suggester = session.getSuggester(CollectionParams.CollectionAction.MOVEREPLICA)
.hint(Hint.TARGET_NODE, "127.0.0.1:51147_solr");
SolrRequest op = suggester.getOperation();
log.info("" + op);
assertNotNull(op);
}
}