You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2016/12/06 23:13:43 UTC
[48/50] [abbrv] lucene-solr:apiv2: SOLR-9832: Schema modifications
are not immediately visible on the coordinating node
SOLR-9832: Schema modifications are not immediately visible on the coordinating node
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/bf3a3137
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/bf3a3137
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/bf3a3137
Branch: refs/heads/apiv2
Commit: bf3a3137be8a70ceed884e87c3ada276e82b187b
Parents: 2e948fe
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Dec 6 13:11:36 2016 -0500
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Dec 6 13:11:36 2016 -0500
----------------------------------------------------------------------
solr/CHANGES.txt | 2 +
.../src/java/org/apache/solr/core/SolrCore.java | 8 --
.../solr/schema/ManagedIndexSchemaFactory.java | 12 +++
.../org/apache/solr/schema/SchemaManager.java | 2 +-
.../ManagedSchemaRoundRobinCloudTest.java | 98 ++++++++++++++++++++
5 files changed, 113 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bf3a3137/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e766169..bac24e5 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -220,6 +220,8 @@ Bug Fixes
* SOLR-9616: Solr throws exception when expand=true on empty index (Timo Hund via Ishan Chattopadhyaya)
+* SOLR-9832: Schema modifications are not immediately visible on the coordinating node. (Steve Rowe)
+
Other Changes
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bf3a3137/solr/core/src/java/org/apache/solr/core/SolrCore.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index e5bc53d..a459bf2 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -119,7 +119,6 @@ import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.IndexSchemaFactory;
import org.apache.solr.schema.ManagedIndexSchema;
-import org.apache.solr.schema.SchemaManager;
import org.apache.solr.schema.SimilarityFactory;
import org.apache.solr.search.QParserPlugin;
import org.apache.solr.search.SolrFieldCacheMBean;
@@ -2720,13 +2719,6 @@ public final class SolrCore implements SolrInfoMBean, Closeable {
if (checkStale(zkClient, overlayPath, solrConfigversion) ||
checkStale(zkClient, solrConfigPath, overlayVersion) ||
checkStale(zkClient, managedSchmaResourcePath, managedSchemaVersion)) {
-
- try (SolrCore solrCore = cc.solrCores.getCoreFromAnyList(coreName, true)) {
- solrCore.setLatestSchema(SchemaManager.getFreshManagedSchema(solrCore));
- } catch (Exception e) {
- log.warn("", SolrZkClient.checkInterrupted(e));
- }
-
log.info("core reload {}", coreName);
try {
cc.reload(coreName);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bf3a3137/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
index 66d947e..d4a10bd 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
@@ -377,6 +377,18 @@ public class ManagedIndexSchemaFactory extends IndexSchemaFactory implements Sol
this.zkIndexSchemaReader = new ZkIndexSchemaReader(this, core);
ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
zkLoader.setZkIndexSchemaReader(this.zkIndexSchemaReader);
+ try {
+ zkIndexSchemaReader.refreshSchemaFromZk(-1); // update immediately if newer is available
+ core.setLatestSchema(getSchema());
+ } catch (KeeperException e) {
+ String msg = "Error attempting to access " + zkLoader.getConfigSetZkPath() + "/" + managedSchemaResourceName;
+ log.error(msg, e);
+ throw new SolrException(ErrorCode.SERVER_ERROR, msg, e);
+ } catch (InterruptedException e) {
+ // Restore the interrupted status
+ Thread.currentThread().interrupt();
+ log.warn("", e);
+ }
} else {
this.zkIndexSchemaReader = null;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bf3a3137/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
index 4b0ea54..3340631 100644
--- a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
+++ b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
@@ -133,8 +133,8 @@ public class SchemaManager {
try {
int latestVersion = ZkController.persistConfigResourceToZooKeeper(zkLoader, managedIndexSchema.getSchemaZkVersion(),
managedIndexSchema.getResourceName(), sw.toString().getBytes(StandardCharsets.UTF_8), true);
+ req.getCore().getCoreDescriptor().getCoreContainer().reload(req.getCore().getName());
waitForOtherReplicasToUpdate(timeOut, latestVersion);
- core.setLatestSchema(managedIndexSchema);
return Collections.emptyList();
} catch (ZkController.ResourceModifiedInZkException e) {
log.info("Schema was modified by another node. Retrying..");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bf3a3137/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java b/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
new file mode 100644
index 0000000..883ebfd
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.schema;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.request.schema.SchemaRequest;
+import org.apache.solr.client.solrj.response.schema.SchemaResponse;
+import org.apache.solr.cloud.SolrCloudTestCase;
+import org.apache.solr.common.cloud.DocCollection;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ManagedSchemaRoundRobinCloudTest extends SolrCloudTestCase {
+ private static final String COLLECTION = "managed_coll";
+ private static final String CONFIG = "cloud-managed";
+ private static final String FIELD_PREFIX = "NumberedField_";
+ private static final int NUM_SHARDS = 2;
+ private static final int NUM_FIELDS_TO_ADD = 10;
+
+ @BeforeClass
+ public static void setupCluster() throws Exception {
+ System.setProperty("managed.schema.mutable", "true");
+ configureCluster(NUM_SHARDS).addConfig(CONFIG, configset(CONFIG)).configure();
+ CollectionAdminRequest.createCollection(COLLECTION, CONFIG, NUM_SHARDS, 1)
+ .setMaxShardsPerNode(1)
+ .process(cluster.getSolrClient());
+ cluster.getSolrClient().waitForState(COLLECTION, DEFAULT_TIMEOUT, TimeUnit.SECONDS,
+ (n, c) -> DocCollection.isFullyActive(n, c, NUM_SHARDS, 1));
+ }
+
+ @AfterClass
+ public static void clearSysProps() throws Exception {
+ System.clearProperty("managed.schema.mutable");
+ }
+
+ @Test
+ public void testAddFieldsRoundRobin() throws Exception {
+ List<HttpSolrClient> clients = new ArrayList<>(NUM_SHARDS);
+ try {
+ for (int shardNum = 0 ; shardNum < NUM_SHARDS ; ++shardNum) {
+ clients.add(getHttpSolrClient(cluster.getJettySolrRunners().get(shardNum).getBaseUrl().toString()));
+ }
+ int shardNum = 0;
+ for (int fieldNum = 0 ; fieldNum < NUM_FIELDS_TO_ADD ; ++fieldNum) {
+ addField(clients.get(shardNum), keyValueArrayToMap("name", FIELD_PREFIX + fieldNum, "type", "string"));
+ if (++shardNum == NUM_SHARDS) {
+ shardNum = 0;
+ }
+ }
+ } finally {
+ for (int shardNum = 0 ; shardNum < NUM_SHARDS ; ++shardNum) {
+ clients.get(shardNum).close();
+ }
+ }
+ }
+
+ private void addField(SolrClient client, Map<String,Object> field) throws Exception {
+ SchemaResponse.UpdateResponse addFieldResponse = new SchemaRequest.AddField(field).process(client, COLLECTION);
+ assertNotNull(addFieldResponse);
+ assertEquals(0, addFieldResponse.getStatus());
+ assertNull(addFieldResponse.getResponse().get("errors"));
+ String fieldName = field.get("name").toString();
+ SchemaResponse.FieldResponse fieldResponse = new SchemaRequest.Field(fieldName).process(client, COLLECTION);
+ assertNotNull(fieldResponse);
+ assertEquals(0, fieldResponse.getStatus());
+ }
+
+ private Map<String,Object> keyValueArrayToMap(String... alternatingKeysAndValues) {
+ Map<String,Object> map = new HashMap<>();
+ for (int i = 0 ; i < alternatingKeysAndValues.length ; i += 2)
+ map.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
+ return map;
+ }
+}