mirror of https://github.com/apache/lucene.git
SOLR-11624: Autocreated configsets will not use .AUTOCREATED suffix
This commit is contained in:
parent
4aeabe7ff2
commit
183835ed24
|
@ -67,6 +67,10 @@ Upgrade Notes
|
||||||
Previously, the cool down period was a fixed period started after actions for a trigger event finish
|
Previously, the cool down period was a fixed period started after actions for a trigger event finish
|
||||||
executing. During the cool down period, triggers wo
|
executing. During the cool down period, triggers wo
|
||||||
|
|
||||||
|
* SOLR-11624: Collections created without specifying a configset name use a copy of the _default configset since 7.0.
|
||||||
|
Before 7.3, the copied over configset was named the same as the collection name, but 7.3 onwards it will be named
|
||||||
|
with an additional ".AUTOCREATED" suffix.
|
||||||
|
|
||||||
New Features
|
New Features
|
||||||
----------------------
|
----------------------
|
||||||
* SOLR-11285: Simulation framework for autoscaling. (ab)
|
* SOLR-11285: Simulation framework for autoscaling. (ab)
|
||||||
|
@ -165,6 +169,12 @@ Other Changes
|
||||||
|
|
||||||
* SOLR-11871: MoveReplicaSuggester should not suggest leader if other replicas are available (noble)
|
* SOLR-11871: MoveReplicaSuggester should not suggest leader if other replicas are available (noble)
|
||||||
|
|
||||||
|
* SOLR-11624: Collections created from _default configset will now be associated with a configset with a suffix
|
||||||
|
.AUTOCREATED. For example, a new collection "mycollection", created without specifying a configset name, will
|
||||||
|
use the _default configset and the associated configset name will be "mycollection.AUTOCREATED". If this
|
||||||
|
collection is deleted and re-created, the autocreated configset will be left behind and will be re-used for
|
||||||
|
the re-created collection (Ishan Chattopadhyaya, Abhishek Kumar Singh)
|
||||||
|
|
||||||
================== 7.2.1 ==================
|
================== 7.2.1 ==================
|
||||||
|
|
||||||
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
||||||
|
|
|
@ -350,10 +350,13 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
|
||||||
try {
|
try {
|
||||||
configNames = ocmh.zkStateReader.getZkClient().getChildren(ZkConfigManager.CONFIGS_ZKNODE, null, true);
|
configNames = ocmh.zkStateReader.getZkClient().getChildren(ZkConfigManager.CONFIGS_ZKNODE, null, true);
|
||||||
if (configNames.contains(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME)) {
|
if (configNames.contains(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME)) {
|
||||||
if (!CollectionAdminParams.SYSTEM_COLL.equals(coll)) {
|
if (CollectionAdminParams.SYSTEM_COLL.equals(coll)) {
|
||||||
copyDefaultConfigSetTo(configNames, coll);
|
return coll;
|
||||||
|
} else {
|
||||||
|
String intendedConfigSetName = ConfigSetsHandlerApi.getSuffixedNameForAutoGeneratedConfigSet(coll);
|
||||||
|
copyDefaultConfigSetTo(configNames, intendedConfigSetName);
|
||||||
|
return intendedConfigSetName;
|
||||||
}
|
}
|
||||||
return coll;
|
|
||||||
} else if (configNames != null && configNames.size() == 1) {
|
} else if (configNames != null && configNames.size() == 1) {
|
||||||
configName = configNames.get(0);
|
configName = configNames.get(0);
|
||||||
// no config set named, but there is only 1 - use it
|
// no config set named, but there is only 1 - use it
|
||||||
|
@ -372,17 +375,11 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
|
||||||
private void copyDefaultConfigSetTo(List<String> configNames, String targetConfig) {
|
private void copyDefaultConfigSetTo(List<String> configNames, String targetConfig) {
|
||||||
ZkConfigManager configManager = new ZkConfigManager(ocmh.zkStateReader.getZkClient());
|
ZkConfigManager configManager = new ZkConfigManager(ocmh.zkStateReader.getZkClient());
|
||||||
|
|
||||||
// if a configset named coll exists, delete the configset so that _default can be copied over
|
// if a configset named collection exists, re-use it
|
||||||
if (configNames.contains(targetConfig)) {
|
if (configNames.contains(targetConfig)) {
|
||||||
log.info("There exists a configset by the same name as the collection we're trying to create: " + targetConfig +
|
log.info("There exists a configset by the same name as the collection we're trying to create: " + targetConfig +
|
||||||
", deleting it so that we can copy the _default configs over and create the collection.");
|
", re-using it.");
|
||||||
try {
|
return;
|
||||||
configManager.deleteConfigDir(targetConfig);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new SolrException(ErrorCode.INVALID_STATE, "Error while deleting configset: " + targetConfig, e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.info("Only _default config set found, using it.");
|
|
||||||
}
|
}
|
||||||
// Copy _default into targetConfig
|
// Copy _default into targetConfig
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -32,10 +32,16 @@ import org.apache.solr.response.SolrQueryResponse;
|
||||||
public class ConfigSetsHandlerApi extends BaseHandlerApiSupport {
|
public class ConfigSetsHandlerApi extends BaseHandlerApiSupport {
|
||||||
|
|
||||||
final public static String DEFAULT_CONFIGSET_NAME = "_default";
|
final public static String DEFAULT_CONFIGSET_NAME = "_default";
|
||||||
|
final public static String AUTOCREATED_CONFIGSET_SUFFIX = ".AUTOCREATED";
|
||||||
|
|
||||||
|
|
||||||
final ConfigSetsHandler configSetHandler;
|
final ConfigSetsHandler configSetHandler;
|
||||||
static Collection<ApiCommand> apiCommands = createMapping();
|
static Collection<ApiCommand> apiCommands = createMapping();
|
||||||
|
|
||||||
|
public static String getSuffixedNameForAutoGeneratedConfigSet(String configName) {
|
||||||
|
return configName + AUTOCREATED_CONFIGSET_SUFFIX;
|
||||||
|
}
|
||||||
|
|
||||||
private static Collection<ApiCommand> createMapping() {
|
private static Collection<ApiCommand> createMapping() {
|
||||||
Map<ConfigSetMeta, ApiCommand> result = new EnumMap<>(ConfigSetMeta.class);
|
Map<ConfigSetMeta, ApiCommand> result = new EnumMap<>(ConfigSetMeta.class);
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
|
||||||
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
|
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
|
||||||
import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
|
import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
|
||||||
import org.apache.solr.client.solrj.request.V2Request;
|
import org.apache.solr.client.solrj.request.V2Request;
|
||||||
|
import org.apache.solr.client.solrj.response.ConfigSetAdminResponse;
|
||||||
import org.apache.solr.client.solrj.response.FieldStatsInfo;
|
import org.apache.solr.client.solrj.response.FieldStatsInfo;
|
||||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
import org.apache.solr.client.solrj.response.UpdateResponse;
|
import org.apache.solr.client.solrj.response.UpdateResponse;
|
||||||
|
@ -78,14 +79,21 @@ public class TimeRoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
// First create a config using REST API. To do this, we create a collection with the name of the eventual config.
|
|
||||||
// We configure it, and ultimately delete it the collection, leaving a config with the same name behind.
|
// First create a configSet
|
||||||
// Then when we create the "real" collections referencing this config.
|
// Then we create a collection with the name of the eventual config.
|
||||||
CollectionAdminRequest.createCollection(configName, 1, 1).process(solrClient);
|
// We configure it, and ultimately delete the collection, leaving a modified config-set behind.
|
||||||
|
// Then when we create the "real" collections referencing this modified config-set.
|
||||||
|
final ConfigSetAdminRequest.Create adminRequest = new ConfigSetAdminRequest.Create();
|
||||||
|
adminRequest.setConfigSetName(configName);
|
||||||
|
adminRequest.setBaseConfigSetName("_default");
|
||||||
|
ConfigSetAdminResponse adminResponse = adminRequest.process(solrClient);
|
||||||
|
assertEquals(adminResponse.getStatus(), 0);
|
||||||
|
|
||||||
|
CollectionAdminRequest.createCollection(configName, configName,1, 1).process(solrClient);
|
||||||
// manipulate the config...
|
// manipulate the config...
|
||||||
checkNoError(solrClient.request(new V2Request.Builder("/collections/" + configName + "/config")
|
|
||||||
.withMethod(SolrRequest.METHOD.POST)
|
String conf = "{" +
|
||||||
.withPayload("{" +
|
|
||||||
" 'set-user-property' : {'timePartitionAliasName':'" + alias + "'}," + // no data driven
|
" 'set-user-property' : {'timePartitionAliasName':'" + alias + "'}," + // no data driven
|
||||||
" 'set-user-property' : {'update.autoCreateFields':false}," + // no data driven
|
" 'set-user-property' : {'update.autoCreateFields':false}," + // no data driven
|
||||||
" 'add-updateprocessor' : {" +
|
" 'add-updateprocessor' : {" +
|
||||||
|
@ -95,8 +103,10 @@ public class TimeRoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
|
||||||
" 'name':'inc', 'class':'" + IncrementURPFactory.class.getName() + "'," +
|
" 'name':'inc', 'class':'" + IncrementURPFactory.class.getName() + "'," +
|
||||||
" 'fieldName':'" + intField + "'" +
|
" 'fieldName':'" + intField + "'" +
|
||||||
" }," +
|
" }," +
|
||||||
"}").build()));
|
"}";
|
||||||
// only sometimes test with "tolerant" URP
|
checkNoError(solrClient.request(new V2Request.Builder("/collections/" + configName + "/config")
|
||||||
|
.withMethod(SolrRequest.METHOD.POST)
|
||||||
|
.withPayload(conf).build())); // only sometimes test with "tolerant" URP
|
||||||
final String urpNames = "inc" + (random().nextBoolean() ? ",tolerant" : "");
|
final String urpNames = "inc" + (random().nextBoolean() ? ",tolerant" : "");
|
||||||
checkNoError(solrClient.request(new V2Request.Builder("/collections/" + configName + "/config/params")
|
checkNoError(solrClient.request(new V2Request.Builder("/collections/" + configName + "/config/params")
|
||||||
.withMethod(SolrRequest.METHOD.POST)
|
.withMethod(SolrRequest.METHOD.POST)
|
||||||
|
@ -107,6 +117,11 @@ public class TimeRoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
|
||||||
"}").build()));
|
"}").build()));
|
||||||
CollectionAdminRequest.deleteCollection(configName).process(solrClient);
|
CollectionAdminRequest.deleteCollection(configName).process(solrClient);
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
new ConfigSetAdminRequest.List().process(solrClient).getConfigSets()
|
||||||
|
.contains(configName)
|
||||||
|
);
|
||||||
|
|
||||||
// start with one collection and an alias for it
|
// start with one collection and an alias for it
|
||||||
final String col23rd = alias + "_2017-10-23";
|
final String col23rd = alias + "_2017-10-23";
|
||||||
CollectionAdminRequest.createCollection(col23rd, configName, 2, 2)
|
CollectionAdminRequest.createCollection(col23rd, configName, 2, 2)
|
||||||
|
@ -114,8 +129,11 @@ public class TimeRoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
|
||||||
.withProperty(TimeRoutedAliasUpdateProcessor.TIME_PARTITION_ALIAS_NAME_CORE_PROP, alias)
|
.withProperty(TimeRoutedAliasUpdateProcessor.TIME_PARTITION_ALIAS_NAME_CORE_PROP, alias)
|
||||||
.process(solrClient);
|
.process(solrClient);
|
||||||
|
|
||||||
assertEquals("We only expect 2 configSets",
|
List<String> retrievedConfigSetNames = new ConfigSetAdminRequest.List().process(solrClient).getConfigSets();
|
||||||
Arrays.asList("_default", configName), new ConfigSetAdminRequest.List().process(solrClient).getConfigSets());
|
List<String> expectedConfigSetNames = Arrays.asList("_default", configName);
|
||||||
|
assertTrue("We only expect 2 configSets",
|
||||||
|
expectedConfigSetNames.size() == retrievedConfigSetNames.size());
|
||||||
|
assertTrue("ConfigNames should be :" + expectedConfigSetNames, expectedConfigSetNames.containsAll(retrievedConfigSetNames) && retrievedConfigSetNames.containsAll(expectedConfigSetNames));
|
||||||
|
|
||||||
CollectionAdminRequest.createAlias(alias, col23rd).process(solrClient);
|
CollectionAdminRequest.createAlias(alias, col23rd).process(solrClient);
|
||||||
//TODO use SOLR-11617 client API to set alias metadata
|
//TODO use SOLR-11617 client API to set alias metadata
|
||||||
|
|
|
@ -85,7 +85,7 @@ A `false` value makes the results of a collection creation predictable and gives
|
||||||
This parameter is ignored if `createNodeSet` is not also specified.
|
This parameter is ignored if `createNodeSet` is not also specified.
|
||||||
|
|
||||||
`collection.configName`::
|
`collection.configName`::
|
||||||
Defines the name of the configurations (which *must already be stored in ZooKeeper*) to use for this collection. If not provided, Solr will default to the collection name as the configuration name.
|
Defines the name of the configuration (which *must already be stored in ZooKeeper*) to use for this collection. If not provided, Solr will use the configuration of `_default` configSet to create a new (and mutable) configSet named `<collectionName>.AUTOCREATED` and will use it for the new collection. When such a collection (that uses a copy of the _default configset) is deleted, the autocreated configset is not deleted by default.
|
||||||
|
|
||||||
`router.field`::
|
`router.field`::
|
||||||
If this parameter is specified, the router will look at the value of the field in an input document to compute the hash and identify a shard instead of looking at the `uniqueKey` field. If the field specified is null in the document, the document will be rejected.
|
If this parameter is specified, the router will look at the value of the field in an input document to compute the hash and identify a shard instead of looking at the `uniqueKey` field. If the field specified is null in the document, the document will be rejected.
|
||||||
|
|
Loading…
Reference in New Issue